登录
首页 >  文章 >  前端

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

时间:2025-03-12 21:07:22 421浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《Vue3.2父子组件间ref数组监听:为什么watch监听props.tableData无效?》,很明显是关于文章的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

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

Vue3.2父子组件间Ref数组监听详解及最佳实践

在Vue3.2中,使用ref进行父子组件间数据传递和监听很常见。本文分析一个父子组件间ref数组监听的常见问题,并提供最佳解决方案。

问题: 父组件通过v-model将ref数组tableData传递给子组件。子组件需要监听tableData的变化并做出响应。然而,watch监听props.tableData时,只有使用箭头函数() => props.tableData才能生效,直接使用props.tableData无效。

原因分析:

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

子组件中,props.tableDataRef对象。直接使用它作为watch参数,watch监听的是ref对象本身,而非其内部值。ref对象只有在赋值时才触发变化,tableData.value内部值变化不会触发ref对象变更,导致监听失效。

箭头函数() => props.tableData创建了一个getter函数,每次watch执行都获取props.tableData的当前值。这样,即使tableData.value内部值变化,watch也能检测到。

最佳方案:

为提高代码清晰度和可维护性,建议在子组件中直接使用父组件传递的tableData ref对象,而非通过props访问:

// 子组件
const props = defineProps({
  tableData: {
    type: Object, // tableData 是一个 ref 对象
    default: () => ({ value: [] }),
  }
});

watch(
  () => props.tableData.value, // 监听 ref 对象的 value 属性
  (newVal) => {
    // ...处理逻辑...
  },
  { deep: true } // 监听数组内部元素变化
);

或者,父组件直接传递tableData.value

// 父组件


// 子组件
const props = defineProps({
  tableData: {
    type: Array,
    default: () => [],
  }
});

watch(
  props.tableData,
  (newVal) => {
    // ...处理逻辑...
  },
  { deep: true }
);

注意:tableData是数组,需要deep: true选项监听内部元素变化。如果是reactive创建的响应式对象,则无需deep: true

总结: 正确理解watch函数参数类型和ref对象特性,对于父子组件间ref数组监听至关重要。选择合适的监听方法,可以提升代码的可读性和可维护性。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Vue3.2父子组件间ref数组监听:为什么watch监听props.tableData无效?》文章吧,也可关注golang学习网公众号了解相关技术文章。

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>