浅谈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 相关文章推荐
深入了解Vue3模板编译原理
Nov 19 Vue.js
vue实现广告栏上下滚动效果
Nov 26 Vue.js
vue祖孙组件之间的数据传递案例
Dec 07 Vue.js
vue实现两个区域滚动条同步滚动
Dec 13 Vue.js
vue element el-transfer增加拖拽功能
Jan 15 Vue.js
Vue看了就会的8个小技巧
Jan 21 Vue.js
vue前端工程的搭建
Mar 31 Vue.js
详解Vue的sync修饰符
May 15 Vue.js
vue中this.$http.post()跨域和请求参数丢失的解决
Apr 08 Vue.js
vue打包时去掉所有的console.log
Apr 10 Vue.js
Vue2项目中对百度地图的封装使用详解
Jun 16 Vue.js
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
vue backtop组件的实现完整代码
vue中三级导航的菜单权限控制
Mar 31 #Vue.js
vue3中的组件间通信
vue前端工程的搭建
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
You might like
PHP操作数组的一些函数整理介绍
2011/07/17 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
php实现websocket实时消息推送
2018/03/30 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
2019/09/03 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
2020/06/06 PHP
PHP之header函数详解
2021/03/02 PHP
清华大学出版的事半功倍系列 javascript全部源代码
2007/05/04 Javascript
js屏蔽鼠标键盘(右键/Ctrl+N/Shift+F10/F11/F5刷新/退格键)
2013/01/24 Javascript
回车直接实现点击某按钮的效果即触发单击事件
2014/02/27 Javascript
js控制容器隐藏出现防止样式变化的两种方法
2014/04/25 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
2015/09/17 Javascript
JavaScript中数组去除重复的三种方法
2016/04/22 Javascript
javascript cookie基础应用之记录用户名的方法
2016/09/20 Javascript
vue.js选中动态绑定的radio的指定项
2017/06/02 Javascript
Vue.js移动端左滑删除组件的实现代码
2017/09/08 Javascript
Bootstrap一款超好用的前端框架
2017/09/25 Javascript
浅谈Vue.js中ref ($refs)用法举例总结
2017/12/19 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
vue-cli配置环境变量的方法
2018/07/09 Javascript
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
python如何实现excel数据添加到mongodb
2015/07/30 Python
Python地图绘制实操详解
2019/03/04 Python
使用Python实现跳一跳自动跳跃功能
2019/07/10 Python
Python HTTP下载文件并显示下载进度条功能的实现
2020/04/02 Python
世界首屈一指的钓鱼用品商店:TackleDirect
2016/07/26 全球购物
精美的手工家居和生活用品:Nkuku
2019/11/01 全球购物
Web Service面试题:如何搭建Axis2的开发环境
2012/06/20 面试题
迟到检讨书800字
2014/01/13 职场文书
乡镇干部个人对照检查材料(群众路线)
2014/09/26 职场文书
2015年乡镇环保工作总结
2015/04/22 职场文书
2016年员工年度考核评语
2015/12/02 职场文书
2016年党风廉政建设承诺书
2016/03/25 职场文书
创业计划书之家教托管
2019/09/25 职场文书
MySQL的join buffer原理
2021/04/29 MySQL
python 对图片进行简单的处理
2021/06/23 Python