您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)vue2的$refs在vue3組合式API中的替代方法,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
如果你有過vue2的項(xiàng)目開發(fā)經(jīng)驗(yàn),那么對$refs就很熟悉了。由于vue3的斷崖式的升級,在vue3中如何使用$refs呢?想必有遇到過類似的問題,我也有一樣的疑惑。通過搜索引擎和github,基本掌握如何使用$refs。在vue3中使用組合式API的函數(shù)ref來代替靜態(tài)或者動態(tài)html元素的應(yīng)用。
最近業(yè)余在學(xué)習(xí)vue3項(xiàng)目《蠟筆(Crayon)管理模板:Vue3 + Vuex4 + Ant Design2》開發(fā),這兩天迭代推進(jìn)了一點(diǎn),實(shí)現(xiàn)了chart圖表組件,寫文章的時(shí)候發(fā)現(xiàn)提交代碼的commit有錯別字。
在vue3中使用組合式API的setup()方法的時(shí)候,無法正常使用this.$refs,但可以使用新的函數(shù)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(); }); // 附加一個(gè)實(shí)例給refChart refChart.value.instance = chartHelper; }; // 設(shè)置高度 const setHeight = () => { return { height: props.height, }; }; // 綁定一個(gè)實(shí)例,使用inject注入 const bindInstance = () => { if (props.refKey) { const bind = inject(`bind[${props.refKey}]`); if (bind) { bind(refChart.value); } } }; onMounted(() => { bindInstance(); init(); }); return { refChart, setHeight, }; }, }); </script>
這段代碼完整的實(shí)現(xiàn)了一個(gè)圖表組件Chart,其中自定義了屬性props,通過把參數(shù)傳遞給setup方法來使用其屬性值。html中定義一個(gè)ref="refChart"來作為圖表的dom對象,在setup方法中通過方法ref方法來定義響應(yīng)式可變對象,并在setup函數(shù)結(jié)尾作為返回值。
const refChart = ref();
需要注意的是,返回值的屬性名必須和html中的ref值一致。
下面代碼是可以正常執(zhí)行的。
<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>
下面的情況,會出現(xiàn)程序錯誤,無法達(dá)到預(yù)期效果。應(yīng)為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>
關(guān)于“vue2的$refs在vue3組合式API中的替代方法”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。