vue项目中子组件watch不到父组件传递的props变化

一、现象

      父组件中引入了一个弹框组件,并传递props——columnField。子组件中watch该props的变化,并执行相应操作。代码如下

父组件

子组件

      当父组件中执行openSetFieldDialog方法时,columnField的值发生了变化,但子子组件并没有监听到。

二、原因

      我在父组件的data中定义columnField时,只赋值了一个空对象,没有添加alias和description属性。

data(){
    return{
        columnField:{}
    }
}

      当给columnField的alias和description属性直接赋值时,这两个属性并不是响应式的,所以子组件中watch不到columnField的变化。

三、解决方案

1、定义columnField的同时定义属性

data(){
    return{
        columnField:{
            alias:'',
            description:''
        }
    }
}

2、使用vue.set添加属性,保证属性是响应式的

openSetFieldDialog(element){
    this.curColumn = element;
    this.setFieldDialog = true;
    Vue.set(this.columnField,'alias',element.alias);
    Vue.set(this.columnField,'description',element.description);
}

 

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3 中子组件传递数据给组件的方式有以下几种: 1. 使用事件触发: - 在组件中使用 `$emit` 方法触发一个自定义事件,并传递需要传递的数据。 - 在组件中使用 `v-on` 或 `@` 监听组件触发的自定义事件,并在事件处理函数中获取传递的数据。 2. 使用`v-model`指令: - 在组件内部,使用 `props` 接收来自组件的数据,并在组件内部修改该数据。 - 在组件内部使用 `$emit('update:modelValue', value)` 触发一个名为 `update:modelValue` 的事件,将修改后的数据作为参数传递组件。 - 在组件中使用 `v-model` 指令绑定组件的数据,并监听组件触发的 `update:modelValue` 事件。 3. 使用 provide/inject: - 在组件中使用 `provide` 方法提供数据,组件中使用 `inject` 方法接收数据。 - 通过这种方式,组件中的数据会被组件共享,并且当组件中的数据发生变化时,组件也会联动变化。 示例代码如下: // 组件 <template> <div> <ChildComponent @customEvent="handleCustomEvent" v-model="parentData" /> </div> </template> <script> import { ref } from 'vue'; import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent, }, setup() { const parentData = ref(''); const handleCustomEvent = (data) => { console.log(data); // 组件传递过来的数据 }; return { parentData, handleCustomEvent, }; }, }; </script> // 组件 ChildComponent.vue <template> <div> <input v-model="childData" /> <button @click="handleClick">发送数据给组件</button> </div> </template> <script> import { ref, provide, inject } from 'vue'; export default { props: ['modelValue'], emits: ['update:modelValue', 'customEvent'], setup(props, { emit }) { const childData = ref(''); const handleClick = () => { emit('update:modelValue', childData.value); // 发送数据给组件 emit('customEvent', childData.value); // 触发一个自定义事件,并传递数据给组件 }; provide('childData', childData); // 使用 provide 共享组件的数据 return { childData, handleClick, }; }, created() { const sharedData = inject('childData'); // 使用 inject 接收共享的数据 console.log(sharedData); // 组件传递过来的数据 }, }; </script> 在上述代码中,组件通过传递 `parentData` 给组件,并监听 `customEvent` 事件和 `update:modelValue` 事件,以接收组件传递过来的数据。组件内部使用 `v-model` 绑定 `childData` 数据,并通过 `$emit` 触发 `update:modelValue` 事件和 `customEvent` 事件,以传递数据给组件。同时,组件也使用 `provide` 共享 `childData` 数据给其他组件使用。 以上是 Vue 3 中子组件传递数据给组件的几种常用方式,根据具体的业务需求选择合适的方式使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值