返回顶部
首页 > 资讯 > 精选 >vue2的$refs在vue3组合式API中的替代方法
  • 561
分享到

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

2023-06-14 13:06:39 561人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关Vue2的$refs在vue3组合式api中的替代方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。如果你有过vue2的项目开发经验,那么对$refs就很熟悉了。由于vue3的

这篇文章将为大家详细讲解有关Vue2的$refs在vue3组合式api中的替代方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

如果你有过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>

关于“vue2的$refs在vue3组合式API中的替代方法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: vue2的$refs在vue3组合式API中的替代方法

本文链接: https://lsjlt.com/news/271298.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作