浅谈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中使用mockjs代码实例
Nov 25 Vue.js
VUE中鼠标滚轮使div左右滚动的方法详解
Dec 14 Vue.js
Vue——前端生成二维码的示例
Dec 19 Vue.js
vue 导航守卫和axios拦截器有哪些区别
Dec 19 Vue.js
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 Vue.js
vue实现一个获取按键展示快捷键效果的Input组件
Jan 13 Vue.js
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
Feb 26 Vue.js
使用Vue.js和MJML创建响应式电子邮件
Mar 23 Vue.js
vue backtop组件的实现完整代码
Apr 07 Vue.js
详解Vue的sync修饰符
May 15 Vue.js
Vue实现tab导航栏并支持左右滑动功能
Jun 28 Vue.js
浅谈Vue的computed计算属性
Mar 21 Vue.js
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
vue backtop组件的实现完整代码
vue中三级导航的菜单权限控制
Mar 31 #Vue.js
vue3中的组件间通信
vue前端工程的搭建
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
You might like
一棵php的类树(支持无限分类)
2006/10/09 PHP
献给php初学者(入门学习经验谈)
2010/10/12 PHP
一个简单且很好用的php分页类
2013/10/26 PHP
神盾加密解密教程(一)PHP变量可用字符
2014/05/28 PHP
PHP进阶学习之Geo的地图定位算法详解
2019/06/19 PHP
深入理解Javascript闭包 新手版
2010/12/28 Javascript
js中各浏览器中鼠标按键值的差异
2011/04/07 Javascript
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
修改或扩展jQuery原生方法的代码实例
2015/01/13 Javascript
JavaScript常用脚本汇总(三)
2015/03/04 Javascript
js实现精确到秒的倒计时效果
2016/05/29 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
Node.js的基本知识简单汇总
2016/09/19 Javascript
JQuery事件委托原理与用法实例分析
2019/05/13 jQuery
JS实现返回上一页并刷新页面的方法分析
2019/07/16 Javascript
[03:35]2018年度DOTA2最佳辅助位选手5号位-完美盛典
2018/12/17 DOTA
Python入门篇之条件、循环
2014/10/17 Python
Python爬取京东的商品分类与链接
2016/08/26 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
如何使用Python抓取网页tag操作
2020/02/14 Python
Python3标准库之dbm UNIX键-值数据库问题
2020/03/24 Python
python 等差数列末项计算方式
2020/05/03 Python
Python3如何实现Win10桌面自动切换
2020/08/11 Python
基于PyTorch中view的用法说明
2021/03/03 Python
英国马匹装备和马术用品购物网站:Equine Superstore
2019/03/03 全球购物
怎样声明一个匿名的内部类
2016/06/01 面试题
文明学生标兵事迹
2014/01/21 职场文书
行政管理毕业生自荐信
2014/02/24 职场文书
品质主管岗位职责
2014/03/16 职场文书
社区食品安全实施方案
2014/03/28 职场文书
毕业生就业协议书
2014/04/11 职场文书
大学生安全责任书
2014/07/25 职场文书
小学生美德少年事迹材料
2014/08/24 职场文书
骨干教师个人总结
2015/02/11 职场文书
2015年高中班主任工作总结
2015/04/30 职场文书