我在做低代码可视化编辑器,拖拽组件后想监听用户修改的属性值,但用 watch 监听不到变化,是哪里写错了吗?
我试过在 setup 里用 watch 监听 props,也试过把属性放进 reactive 对象,但都不触发。比如下面这段代码:
const props = defineProps({
config: Object
});
watch(() => props.config, (newVal) => {
console.log('配置变了', newVal);
}, { deep: true });
可以试试这样:在 watch 里直接监听 config 的某个具体字段,或者用 function 的方式把要监听的内容“拆开”传进去。比如:
或者你父组件那边是不是用
v-model或者v-bind的时候传的是一个静态对象?比如:config="{ a: 1 }",每次渲染都会生成新对象,这种情况下 props 确实会变,但如果你是用变量引用传进去的,比如:config="configRef",而 configRef 本身没变,那 watch 就不会触发。还有一种常见情况是:你在子组件里改了 props(虽然不推荐),但 Vue 严格模式下这会被忽略,所以你以为改了,其实没生效,自然也监听不到。
如果还是不行,你可以在 setup 里加个
console.log(props.config)看看父组件是不是真传进来了,有时候低代码平台的配置数据是异步加载的,等你 setup 执行完才传进来,watch 就收不到第一次变更。可以试试这样兜底:
或者用
nextTick包一下,看是不是时机问题。总之核心是:watch 要监听到变化,前提是那个值真的变了,而低代码平台里“值变了”往往藏在异步、引用、对象浅比较这些坑里,得一点点排查。