Vue3子组件watch无法监听父组件传递的属性值

Vue3子组件watch无法监听父组件传递的属性值

概要

父组件传递数组或对象给子组件,子组件无法watch监听到,控制台不打印内容。

一、原因

1.异步传值:使用 props 进行父子组件通信时,父组件通过接口获取值再传给子组件,子组件可能会在父组件传递之前就渲染完成,导致父组件无法将新内容传递给子组件。
2.代码问题:要么是组件传值时,props传递的内容:list,层次太深,导致watch无法监听到其发生变化;再者就是watch监听的代码有问题。

二、解决办法

首先是代码问题,可以将自己的代码与下面的watch监听代码比对,看是否有问题
特别是下面这行代码,需要格外注意。
()=>props.userData
然后是watch特殊的参数:
deep: true :深度监听:在 Vue.js 的watch选项中,deep: true表示深度监听。当你监听一个对象或数组时,默认情况下,Vue.js 只会在对象或数组的引用发生变化时才会触发watch回调函数。
immediate: true :立即执行:在watch选项中,immediate: true表示在watch被创建时,立即执行一次watch回调函数。


const props = defineProps({
  userData: {
    type: Object,
    default: () => {},
  },
  loading: Boolean,
})
// 子组件向父组件传值代码
const emit = defineEmits()

watch(
  () => props.userData,
  (res) => {
      getList()
  },
  { deep: true, immediate: true }
)

这样基本就解决了大部分问题。
如果还不行,可以在父组件传值时,使用 JSON.parse(JSON.stringify(list)),以及在子组件使用nextTick(()=>{})等方法来尝试解决。(要是还不行,就百度或AI)

小结

watch监听在我的前端生涯里用的还是挺多的,这里总结一下。