浅谈vue2的$refs在vue3组合式API中的替代方法


Posted in Vue.js onApril 18, 2021

如果你有过vue2的项目开发经验,那么对$refs就很熟悉了。由于vue3的断崖式的升级,在vue3中如何使用$refs呢?想必有遇到过类似的问题,我也有一样的疑惑。通过搜索引擎和github,基本掌握如何使用$refs。在vue3中使用组合式API的函数ref来代替静态或者动态html元素的应用。

最近业余在学习vue3项目《蜡笔(Crayon)管理模板:Vue3 + Vuex4 + Ant Design2》开发,这两天迭代推进了一点,实现了chart图表组件,写文章的时候发现提交代码的commit有错别字。

浅谈vue2的$refs在vue3组合式API中的替代方法

在vue3中使用组合式API的setup()方法的时候,无法正常使用this.$refs,但可以使用新的函数ref()。

下面代码摘自:https://github.com/QuintionTang/crayon/blob/feat-dashboard/src/qtui/components/Chart.vue

<template>
    <canvas ref="refChart" :height="setHeight"></canvas>
</template>
<script>
import { defineComponent, onMounted, ref, inject, watch } from "vue";
import Chart from "chart.js";
import { deepCopy } from "@/helper/index";
export default defineComponent({
    name: "QtChart",
    props: {
        type: {
            type: String,
            required: true,
            default: "line",
        },
        data: {
            type: Object,
            required: true,
            default: () => ({}),
        },
        options: {
            type: Object,
            default: () => ({}),
        },
        height: {
            type: Number,
            default: 0,
        },
        refKey: {
            type: String,
            default: null,
        },
    },
    setup(props) {
        const refChart = ref();
        // 初始化方法
        const init = () => {
            const canvasChart = refChart.value?.getContext("2d");
            const chartHelper = new Chart(canvasChart, {
                type: props.type,
                data: deepCopy(props.data),
                options: props.options,
            });
            watch(props, () => {
                chartHelper.data = deepCopy(props.data);
                chartHelper.options = props.options;
                chartHelper.update();
            });
            // 附加一个实例给refChart
            refChart.value.instance = chartHelper;
        };
        // 设置高度
        const setHeight = () => {
            return {
                height: props.height,
            };
        };
        // 绑定一个实例,使用inject注入
        const bindInstance = () => {
            if (props.refKey) {
                const bind = inject(`bind[${props.refKey}]`);
                if (bind) {
                    bind(refChart.value);
                }
            }
        };
        onMounted(() => {
            bindInstance();
            init();
        });
        return {
            refChart,
            setHeight,
        };
    },
});
</script>

这段代码完整的实现了一个图表组件Chart,其中自定义了属性props,通过把参数传递给setup方法来使用其属性值。html中定义一个ref="refChart"来作为图表的dom对象,在setup方法中通过方法ref方法来定义响应式可变对象,并在setup函数结尾作为返回值。

const refChart = ref();

需要注意的是,返回值的属性名必须和html中的ref值一致。

下面代码是可以正常执行的。

<template>
    <canvas ref="refChart" :height="setHeight"></canvas>
</template>
<script>
import { defineComponent, onMounted, ref, inject, watch } from "vue";
import Chart from "chart.js";
import { deepCopy } from "@/helper/index";
export default defineComponent({
    name: "QtChart",
    props: {
        // ... 
    },
    setup(props) {
        const refChartBox = ref();
        // ...
        return {
            refChart:refChartBox,
        };
    },
});
</script>

下面的情况,会出现程序错误,无法达到预期效果。应为html中定义的ref="refChart"和setup返回的refChartBox不一致。

<template>
    <canvas ref="refChart" :height="setHeight"></canvas>
</template>
<script>
import { defineComponent, onMounted, ref, inject, watch } from "vue";
import Chart from "chart.js";
import { deepCopy } from "@/helper/index";
export default defineComponent({
    name: "QtChart",
    props: {
        // ... 
    },
    setup(props) {
        const refChartBox = ref();
        // ...
        return {
            refChartBox,
        };
    },
});
</script>

结论

本文只是简单的介绍ref方法的使用,正好在项目中用到,后续将继续边学边推进项目并做好笔记。

到此这篇关于浅谈vue2的$refs在vue3组合式API中的替代方法的文章就介绍到这了,更多相关vue3组合式API内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
vue 获取到数据但却渲染不到页面上的解决方法
Nov 19 Vue.js
Vue 实现一个简单的鼠标拖拽滚动效果插件
Dec 10 Vue.js
Vue 简单实现前端权限控制的示例
Dec 25 Vue.js
vue中父子组件的参数传递和应用示例
Jan 04 Vue.js
如何在vue-cli中使用css-loader实现css module
Jan 07 Vue.js
通过vue.extend实现消息提示弹框的方法记录
Jan 07 Vue.js
Vue包大小优化的实现(从1.72M到94K)
Feb 18 Vue.js
原生JS封装vue Tab切换效果
Apr 28 Vue.js
vue实现水波涟漪效果的点击反馈指令
May 31 Vue.js
前端vue+express实现文件的上传下载示例
Feb 18 Vue.js
vue如何使用模拟的json数据查看效果
Mar 31 Vue.js
Vue中使用import进行路由懒加载的原理分析
Apr 01 Vue.js
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
vue backtop组件的实现完整代码
vue中三级导航的菜单权限控制
Mar 31 #Vue.js
vue3中的组件间通信
vue前端工程的搭建
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
You might like
PHP计划任务之关闭浏览器后仍然继续执行的函数
2010/07/22 PHP
php学习之运算符相关概念
2011/06/09 PHP
PHP实现搜索地理位置及计算两点地理位置间距离的实例
2016/01/08 PHP
PHP判断表达式中括号是否匹配的简单实例
2016/10/22 PHP
thinkPHP中配置的读取与C方法详解
2016/12/05 PHP
JavaScript 变量作用域分析
2011/07/04 Javascript
编写高效jQuery代码的4个原则和5个技巧
2014/04/24 Javascript
jQuery链使用指南
2015/01/20 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
2015/11/07 Javascript
AngularJS入门教程之AngularJS表达式
2016/04/18 Javascript
JS如何设置cookie有效期为当天24点并弹出欢迎登陆界面
2016/08/04 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
纯js实现悬浮按钮组件
2016/12/17 Javascript
很棒的vue弹窗组件
2017/05/24 Javascript
关于Google发布的JavaScript代码规范你要知道哪些
2018/04/04 Javascript
js实现聊天对话框
2020/02/08 Javascript
python实现的二叉树算法和kmp算法实例
2014/04/25 Python
python使用mysql数据库示例代码
2017/05/21 Python
python针对excel的操作技巧
2018/03/13 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
python判断设备是否联网的方法
2018/06/29 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
Python中函数的基本定义与调用及内置函数详解
2019/05/13 Python
python按比例随机切分数据的实现
2019/07/11 Python
django 配置阿里云OSS存储media文件的例子
2019/08/20 Python
HTML5 层的叠加的实现
2020/07/07 HTML / CSS
布里斯班女装时尚品牌:Adrift
2017/12/28 全球购物
荷兰电脑专场:Paradigit
2018/05/05 全球购物
斯图尔特·韦茨曼鞋加拿大官网:Stuart Weitzman加拿大
2019/10/13 全球购物
初始化了一个没有run()方法的线程类,是否会出错?
2014/03/27 面试题
校庆接待方案
2014/03/18 职场文书
廉洁校园实施方案
2014/05/25 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
公司仓管员岗位职责
2015/04/01 职场文书
办公用品质量保证书
2015/05/11 职场文书
React如何创建组件
2021/06/27 Javascript