這篇文章將為大家詳細講解有關vue2的$refs在vue3組合式API中的替代方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
如果你有過vue2的項目開發經驗,那么對$refs就很熟悉了。由于vue3的斷崖式的升級,在vue3中如何使用$refs呢?想必有遇到過類似的問題,我也有一樣的疑惑。通過搜索引擎和github,基本掌握如何使用$refs。在vue3中使用組合式API的函數ref來代替靜態或者動態html元素的應用。
最近業余在學習vue3項目《蠟筆(Crayon)管理模板:Vue3 + Vuex4 + Ant Design2》開發,這兩天迭代推進了一點,實現了chart圖表組件,寫文章的時候發現提交代碼的commit有錯別字。

在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中的替代方法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。