Vue.js 中如何监听通过 .sync 修饰符传递的对象变化?

作者站长头像
站长
· 阅读数 18

vue2 父组件定义了一个对象,通过.sync方法传递给子组件,子组件会改变这个对象的值,然后想watch这个值发现产生变化的时候调用某个回调,发现watch不到。。为什么会watch不到呢?应该通过defineOxxx函数进行了监听?有什么解决方法吗Vue.js 中如何监听通过 .sync 修饰符传递的对象变化?Vue.js 中如何监听通过 .sync 修饰符传递的对象变化?Vue.js 中如何监听通过 .sync 修饰符传递的对象变化?

在子组件也尝试监听,没监听到

回复
1个回答
avatar
test
2024-06-23

因为不知道你在子组件内部是否是正确的通过 $emit('update:show', { ... }) 提交的修改。如果是正确提交的 emit 触发的修改应该是可以正确出发 watch 的。

所以只能建议你在父级添加一下 deep 应该就可以触发监听了:

// 父级组件
export default {
  data(){
    return {
      easyShow: {
        ...
      }
    }
  },
  watch: {
    easyShow: {
      handler(val) {
        console.log(val, this.easyShow);
      },
      deep: true
    }
  }
}

以下是一个简单的通过 bind.sync 更新父组件绑定值的一个小Demo:

<template>
  <div id="app">
    <test-component :show.sync="show"/>
  </div>
</template>

<script>
import TestComponent from './components/TestComponent.vue'
export default {
  name: 'App',
  components: { TestComponent },
  data() {
    return {
      show: {
        a: true,
        b: false,
        c: true
      }
    }
  },
  watch: {
    show: {
      handler(val) {
        console.log('app.vue show changed', val, this.show);
      },
      // deep: true
    }
  }
}
</script>
<template>
  <div>
    <button @click="handleClick">点击变更Show值</button>
    <div>{{ show }}</div>
  </div>
</template>

<script>
export default {
  name: 'TestComponent',
  props: {
    show: Object
  },
  watch: {
    show(){
      console.log('components.vue show changed', this.show);
    }
  },
  methods:{
    handleClick(){
      this.$emit('update:show', { a: !this.show.a, b: !this.show.b, c: !this.show.c})
    }
  }
}
</script>
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容