深入Vue3.2父子组件间ref数组监听机制
本文解析Vue3.2中父子组件间使用ref数组监听的常见问题,尤其关注watch函数参数对监听效果的影响。
问题:
父组件通过v-model将ref类型的数组tableData传递给子组件。子组件使用watch监听tableData变化,但仅当watch第一个参数使用箭头函数() => props.tableData时才生效,直接使用props.tableData则监听失效。
立即学习“前端免费学习笔记(深入)”;
代码示例:
父组件:
<comp v-model:tabledata="tabledata"></comp>
import { ref } from 'vue'; const tabledata = ref([]); async function getcommentlist() { const res = await api(); // 假设api是一个异步函数 tabledata.value = res.data; }
子组件:
<script setup> const props = defineProps({ tabledata: { type: Array, default: () => [], } }); watch( () => props.tabledata, // 为什么这里不加()=>就无法监听? (newval) => { // 处理tableData变化 }, { deep: true } ); </script>
分析与解答:
watch函数第一个参数source接受两种类型:ref
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监听的是值的改变。
以上就是Vue3.2父子组件间ref数组监听:为什么watch监听props.tableData失效?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号