Vue 父子传值 使用watch监听 传同值不发生变化解决方案

最近写Vue页面遇到一个问题父子之间的通信传相同的值第一次生效,第二次之后不生效

先看错误的实例:

父页面引入了子组件的页面

在看子页面:

在子页面中使用props接收父级的数据,如果你写的就像我的一样传相同的值watch不会生效,

watch 只会在监听的属性发生变化时触发(不同值),Vue 的设计目标之一是避免不必要的计算和渲染,所以当值没有真正变化时,触发 watcher 没有意义,并可能导致不必要的计算或其他效果,

Vue 是为了性能和避免不必要的渲染。如果在实际应用中遇到问题,建议从业务逻辑的角度考虑如何优化,而不是试图改变 Vue 的默认行为

Vue 3 在这方面的行为并没有改变。

看一下正确的写法只看父组件子组件没有变化:

在每次传递值给子组件之前,先将menuId设置为一个不同的值,然后使$netxtTick,$nextTick 是在下一次“事件循环”执行回调,但它并不保证 DOM 已经挂载,只是保证当前数据更新队列处理完毕,两者缺一不可,在子组件中watch会执行两次一次0 一次是真正的数据,你在子组件中做一下校验就行了啊 

网络上有很多说法 要么就是加深度监听 deep: true还有加immediate: true 执行一次回调,太坑了真想骂一句脏话 **********

搞定,收工

Vue 3中,监听父子组件变化有多种方法,以下为你详细介绍: ### 组件向子组件监听变化 组件通过`props`将数据递给子组件,子组件接收并监听该`props`的变化。示例代码如下: ```vue <!-- 子组件 ChildComponent.vue --> <template> <div> <!-- 显示组件递过来的 --> <p>Received value from parent: {{ childProp }}</p> </div> </template> <script setup> import { defineProps, watch } from 'vue'; // 定义接收的props const props = defineProps({ childProp: { type: String, default: '' } }); // 监听props变化 watch(() => props.childProp, (newValue, oldValue) => { console.log('childProp changed from', oldValue, 'to', newValue); }); </script> ``` ```vue <!-- 组件 ParentComponent.vue --> <template> <div> <!-- 输入框用于修改递给子组件 --> <input v-model="parentValue" placeholder="Enter a value"> <!-- 使用组件 --> <ChildComponent :childProp="parentValue" /> </div> </template> <script setup> import { ref } from 'vue'; import ChildComponent from './ChildComponent.vue'; // 定义组件的数据 const parentValue = ref(''); </script> ``` 上述代码中,组件通过`props`将`parentValue`递给子组件,子组件使用`watch`函数监听`childProp`的变化,当改变时会触发回调函数并打印新旧。 ### 子组件组件监听变化 子组件通过`emit`方法向组件发送消息,组件监听组件的事件。示例代码如下: ```vue <!-- 子组件 ChildComponent.vue --> <template> <div> <!-- 输入框,输入变化时触发事件 --> <input v-model="inputValue" @input="sendValueToParent"> </div> </template> <script setup> import { ref, defineEmits } from 'vue'; // 定义子组件可以触发的事件 const emit = defineEmits(['updateParentValue']); // 定义子组件的数据 const inputValue = ref(''); // 触发事件将递给组件 const sendValueToParent = () => { emit('updateParentValue', inputValue.value); }; </script> ``` ```vue <!-- 组件 ParentComponent.vue --> <template> <div> <!-- 使用组件监听事件 --> <ChildComponent @updateParentValue="updateParentValue" /> <!-- 显示从子组件接收到的 --> <p>Value received from child: {{ receivedValue }}</p> </div> </template> <script setup> import { ref } from 'vue'; import ChildComponent from './ChildComponent.vue'; // 定义组件的数据 const receivedValue = ref(''); // 处理子组件递过来的 const updateParentValue = (value) => { receivedValue.value = value; console.log('Received value from child:', value); }; </script> ``` 上述代码中,子组件通过`emit`触发`updateParentValue`事件并递`inputValue`,组件监听该事件并在`updateParentValue`方法中更新`receivedValue`。 ### 深度监听递的`props`是对象或数组,需要深度监听其内部变化,可在`watch`中设置`deep: true`。示例代码如下: ```vue <script setup> import { defineProps, watch } from 'vue'; const props = defineProps({ complexProp: { type: Object, default: () => ({}) } }); // 深度监听对象内部变化 watch(() => props.complexProp, (newValue, oldValue) => { console.log('complexProp changed', newValue); }, { deep: true }); </script> ``` 此代码展示了如何深度监听`complexProp`对象内部的变化。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值