淺談vue2的$refs在vue3組合式API中的替代方法
如果你有過(guò)vue2的項(xiàng)目開(kāi)發(fā)經(jīng)驗(yàn),那么對(duì)$refs就很熟悉了。由于vue3的斷崖式的升級(jí),在vue3中如何使用$refs呢?想必有遇到過(guò)類似的問(wèn)題,我也有一樣的疑惑。通過(guò)搜索引擎和github,基本掌握如何使用$refs。在vue3中使用組合式API的函數(shù)ref來(lái)代替靜態(tài)或者動(dòng)態(tài)html元素的應(yīng)用。
最近業(yè)余在學(xué)習(xí)vue3項(xiàng)目《蠟筆(Crayon)管理模板:Vue3 + Vuex4 + Ant Design2》開(kāi)發(fā),這兩天迭代推進(jìn)了一點(diǎn),實(shí)現(xiàn)了chart圖表組件,寫(xiě)文章的時(shí)候發(fā)現(xiàn)提交代碼的commit有錯(cuò)別字。
在vue3中使用組合式API的setup()方法的時(shí)候,無(wú)法正常使用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,通過(guò)把參數(shù)傳遞給setup方法來(lái)使用其屬性值。html中定義一個(gè)ref="refChart"來(lái)作為圖表的dom對(duì)象,在setup方法中通過(guò)方法ref方法來(lái)定義響應(yīng)式可變對(duì)象,并在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>
下面的情況,會(huì)出現(xiàn)程序錯(cuò)誤,無(wú)法達(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>
結(jié)論
本文只是簡(jiǎn)單的介紹ref方法的使用,正好在項(xiàng)目中用到,后續(xù)將繼續(xù)邊學(xué)邊推進(jìn)項(xiàng)目并做好筆記。
到此這篇關(guān)于淺談vue2的$refs在vue3組合式API中的替代方法的文章就介紹到這了,更多相關(guān)vue3組合式API內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vite配置別名并處理報(bào)錯(cuò):找不到模塊“xxx”或其相應(yīng)的類型聲明方法詳解
我在學(xué)習(xí)vue3+vite+ts的時(shí)候,在配置別名這一步的時(shí)候遇到了一個(gè)問(wèn)題,這篇文章主要給大家介紹了關(guān)于vite配置別名并處理報(bào)錯(cuò):找不到模塊“xxx”或其相應(yīng)的類型聲明的相關(guān)資料,需要的朋友可以參考下2022-11-11Vue3使用vue-qrcode-reader實(shí)現(xiàn)掃碼綁定設(shè)備功能(推薦)
本文介紹了在Vue3中使用vue-qrcode-reader版本5.5.7來(lái)實(shí)現(xiàn)移動(dòng)端的掃碼綁定設(shè)備功能,用戶通過(guò)掃描二維碼自動(dòng)獲取設(shè)備序列號(hào),并填充到添加設(shè)備界面,完成設(shè)備綁定的全過(guò)程,包含ScanCode.vue和DeviceAdd.vue兩個(gè)主要界面的實(shí)現(xiàn)方式2024-10-10Pinia簡(jiǎn)單使用以及數(shù)據(jù)持久化詳解
最近正在使用Pinia進(jìn)行狀態(tài)管理,我希望在重新刷新頁(yè)面時(shí)保持狀態(tài),下面這篇文章主要給大家介紹了關(guān)于Pinia簡(jiǎn)單使用以及數(shù)據(jù)持久化的相關(guān)資料,需要的朋友可以參考下2022-05-05vue實(shí)現(xiàn)可改變購(gòu)物數(shù)量的購(gòu)物車
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)可改變購(gòu)物數(shù)量的購(gòu)物車,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07vue表格顯示字符串過(guò)長(zhǎng)的問(wèn)題及解決
這篇文章主要介紹了vue表格顯示字符串過(guò)長(zhǎng)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10vue?動(dòng)態(tài)style?拼接寬度問(wèn)題
這篇文章主要介紹了vue?動(dòng)態(tài)style?拼接寬度問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09el-tree樹(shù)組件懶加載(后端上千條數(shù)據(jù)前端進(jìn)行處理)
本文主要介紹了el-tree樹(shù)組件懶加載(后端上千條數(shù)據(jù)前端進(jìn)行處理),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03