
深入Vue3.2父子组件间ref数组监听机制
本文解析Vue3.2中父子组件间使用ref数组监听的常见问题,尤其关注watch函数参数对监听效果的影响。
问题:
父组件通过v-model将ref类型的数组tableData传递给子组件。子组件使用watch监听tableData变化,但仅当watch第一个参数使用箭头函数() => props.tableData时才生效,直接使用props.tableData则监听失效。
立即学习“前端免费学习笔记(深入)”;
代码示例:
父组件:
import { ref } from 'vue';
const tabledata = ref([]);
async function getcommentlist() {
const res = await api(); // 假设api是一个异步函数
tabledata.value = res.data;
}
子组件:
分析与解答:
watch函数第一个参数source接受两种类型:ref或() => T。ref是响应式ref对象;() => T是返回T类型值的函数。
props.tableData是ref对象,直接用作watch参数无法监听其值的变化,因为watch监听的是值的改变,而非对象本身。而() => props.tableData是一个函数,每次执行返回tableData的当前值。当tableData的值变动时,函数返回值也改变,从而触发watch。
正确监听tableData变化,应在watch函数中获取ref对象的值:
watch(
() => props.tabledata.value, // 获取ref对象的值
(newval) => {
// 处理tableData变化
},
{ deep: true }
);
更简洁的写法,直接使用ref对象并利用其响应式特性:
watch(
props.tableData,
(newVal, oldVal) => {
// 处理tableData变化
},
{ deep: true }
);
由于tableData是数组,deep: true确保监听数组内部元素的变化。若无需监听内部元素,可移除deep: true。
对于reactive定义的响应式对象,原理类似,watch监听的是值的改变。










