Vue3.2父子组件间ref数组监听:为什么watch监听props.tableData失效?

vue3.2父子组件间ref数组监听:为什么watch监听props.tabledata失效?

深入Vue3.2父子组件间ref数组监听机制

本文解析Vue3.2中父子组件间使用ref数组监听的常见问题,尤其关注watch函数参数对监听效果的影响。

问题:

父组件通过v-modelref类型的数组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;}

子组件:

阿里云-虚拟数字人 阿里云-虚拟数字人

阿里云-虚拟数字人是什么? …

阿里云-虚拟数字人 2 查看详情 阿里云-虚拟数字人

const props = defineProps({  tabledata: {    type: Array,    default: () => [],  }});watch(  () => props.tabledata, // 为什么这里不加()=>就无法监听?  (newval) => {    // 处理tableData变化  },  { deep: true });

分析与解答:

watch函数第一个参数source接受两种类型:ref() => Tref是响应式ref对象;() => T是返回T类型值的函数。

props.tableDataref对象,直接用作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失效?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/277377.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月4日 15:07:55
下一篇 2025年11月4日 15:09:14

相关推荐

发表回复

登录后才能评论
关注微信