浅谈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.0+vue-router+element-plus初实践
Dec 02 Vue.js
vue项目中openlayers绘制行政区划
Dec 24 Vue.js
vue+elementui通用弹窗的实现(新增+编辑)
Jan 07 Vue.js
vscode自定义vue模板的实现
Jan 27 Vue.js
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
Feb 20 Vue.js
Vue多选列表组件深入详解
Mar 02 Vue.js
详解Vue.js 可拖放文本框组件的使用
Mar 03 Vue.js
Vue实现tab导航栏并支持左右滑动功能
Jun 28 Vue.js
Vue图片裁剪组件实例代码
Jul 02 Vue.js
vue使用refs获取嵌套组件中的值过程
Mar 31 Vue.js
vue 给数组添加新对象并赋值
Apr 20 Vue.js
vue实现简易音乐播放器
Aug 14 Vue.js
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
vue backtop组件的实现完整代码
vue中三级导航的菜单权限控制
Mar 31 #Vue.js
vue3中的组件间通信
vue前端工程的搭建
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
You might like
php preg_match_all结合str_replace替换内容中所有img
2008/10/11 PHP
php 注释规范
2012/03/29 PHP
PHP的curl实现get,post和cookie(实例介绍)
2013/06/17 PHP
php bootstrap实现简单登录
2016/03/08 PHP
实例讲解php实现多线程
2019/01/27 PHP
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
2013/12/04 Javascript
JavaScript italics方法入门实例(把字符串显示为斜体)
2014/10/17 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
2016/08/28 Javascript
微信小程序 在Chrome浏览器上运行以及WebStorm的使用
2016/09/27 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
2017/02/27 Javascript
js实现手机发送验证码功能
2017/03/13 Javascript
详解如何在vue项目中引入elementUI组件
2018/02/11 Javascript
vue使用xe-utils函数库的具体方法
2018/03/06 Javascript
js构建二叉树进行数值数组的去重与优化详解
2018/03/26 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
Vue.js实现双向数据绑定方法(表单自动赋值、表单自动取值)
2018/08/27 Javascript
webpack dll打包重复问题优化的解决
2018/10/10 Javascript
vue 实现cli3.0中使用proxy进行代理转发
2019/10/30 Javascript
vue-drawer-layout实现手势滑出菜单栏
2020/11/19 Vue.js
[09:33]2015国际邀请赛第四日TOP10
2015/08/08 DOTA
Python中join和split用法实例
2015/04/14 Python
CentOS7下python3.7.0安装教程
2018/07/30 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
2019/02/16 Python
python ---lambda匿名函数介绍
2019/03/13 Python
Python 如何优雅的将数字转化为时间格式的方法
2019/09/26 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
2020/06/04 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
马来西亚最大的电器网站:Senheng
2017/10/13 全球购物
Linux的主要特性
2016/09/03 面试题
电气工程及其自动化自我评价四篇
2013/09/24 职场文书
单位承诺书格式
2014/05/21 职场文书
离婚协议书范本(2014版)
2014/09/28 职场文书
python实现大文本文件分割成多个小文件
2021/04/20 Python
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL
避坑之 JavaScript 中的toFixed()和正则表达式
2022/04/19 Javascript