vue父组件值变化,子组件不刷新的问题(三种方案)

目录

1、在子组件使用 watch 监听 props传过来的值,如果发现改变,调用forceUpdate刷新视图。

2、父组件中声明一个布尔变量,数据发生变化后,切换一下变量状态,可刷新子组件视图。

3、数据发生变化后,在下面调用一下splice方法修改原数组长度(索引、截取长度都为0),数组不变,但视图可成功渲染。

4.使用this.$set

一、对象 使用this.$set(),修改和新增

1、对象修改

2.对象新增

3.对象新增未知属性(这里的item是传递的参数,不带引号,"reading"是参数值)

二、数组 使用this.$set(),修改和新增

1.数组修改

2.数组新增

三、同理,执行删除操作时,对象或数组不更新时可以使用this.$delete


父组件传递给子组件的数据,如果是一个复杂对象(例如一个数组或对象),那么子组件只会监听对象的引用而不是对象的内容。这意味着当对象的内容发生变化时,子组件不会更新。

解决:

1、在子组件使用 watch 监听 props传过来的值,如果发现改变,调用forceUpdate刷新视图。

this.$forceUpdate()

2、父组件中声明一个布尔变量,数据发生变化后,切换一下变量状态,可刷新子组件视图。

3、数据发生变化后,在下面调用一下splice方法修改原数组长度(索引、截取长度都为0),数组不变,但视图可成功渲染。

----------------------------------------------------推荐使用这种方案---------------------------------------------------

this.list.splice(0, 0)

4.使用this.$set

一、对象 使用this.$set(),修改和新增

定义数据对象:
obj: { name: "小明", age: 18, },        

  基本语法:
      this.$set(需要改变的对象,"需要改变的对象属性","新值")

1、对象修改

this.$set(this.obj, "name", "小刘");

控制台输出:obj: { name: "小刘", age: 18, },

2.对象新增

this.$set(this.obj, "hobby", "study");

控制台输出:obj: { name: "小明", age: 18, hobby: "study"},

3.对象新增未知属性(这里的item是传递的参数,不带引号,"reading"是参数值)

二、数组 使用this.$set(),修改和新增

定义数组包对象:
arr: [                                           
  { name: "小王", age: 18 },
  { name: "小张", age: 20 },
],

  定义普通数组:       
twoArr: [11, 22, 33, ],                          

  基本语法:
this.$set(需要修改的数组,需要修改的数组下标,{ "要修改的数组对象,一个/多个" })

1.数组修改

修改数组对象:

this.$set(this.arr, 1, { name: "小王", age: 19 });

控制台输出:arr: [ { name: "小王", age: 18 },{ name: "小王", age: 19 }, ],

修改普通数组:

this.$set(this.twoArr, 0, 99);

控制台输出:twoArr: [99, 22, 33, ],

2.数组新增

首先需要获取新增的数组长度:

let reslg = this.arr.length;  

this.$set(this.arr, reslg,{ name: "小紫", age: 18 },);
 
控制台输出:
arr: [ 
        { name: "小王", age: 18 },
        { name: "小张", age: 20 },
        { name: "小紫", age: 18 },
     ],

三、同理,执行删除操作时,对象或数组不更新时可以使用this.$delete

this.$delete 也是一个实例方法,用于从响应式对象中删除属性,并确保该操作也是响应式的。

使用this.$delete 可以解决Vue响应式系统的另一个限制,即无法检测到通过索引直接删除数组元素的变化。通过this.$delete 方法,可以显式地告诉Vue,某个属性已经被删除,从而触发视图的更新。

基本语法:
 
this.$delete(this.obj, "name")
  • 19
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
为了实现组件修改input后调用组件刷新,可以使用以下方法: 1. 在组件中定义一个data属性,用于存储input的。 2. 将这个data属性通过props传递给组件。 3. 在组件中,使用这个props来绑定input的value属性。 4. 在组件中,定义一个方法来修改data属性的,并通过$emit方法触发一个自定义事件。 5. 在组件中,监听这个自定义事件,并在事件处理函数中重新绑定input的value属性。 下面是一个示例代码: ```html <!-- 组件 --> <template> <div> <input type="text" v-model="inputValue" @input="updateInputValue"> <ChildComponent :value="inputValue" @update="updateInputValue"></ChildComponent> </div> </template> <script> import ChildComponent from './ChildComponent.vue' export default { components: { ChildComponent }, data() { return { inputValue: '' } }, methods: { updateInputValue(value) { this.inputValue = value this.$emit('input-change', value) } } } </script> <!-- 组件 --> <template> <div> <input type="text" :value="value" @input="updateValue"> </div> </template> <script> export default { props: { value: { type: String, default: '' } }, methods: { updateValue(event) { this.$emit('update', event.target.value) } } } </script> ``` 在这个示例中,组件中的inputValue属性通过props传递给了组件,并绑定到了组件的input元素的value属性上。当组件中的input发生变化时,会触发updateInputValue方法,该方法会修改inputValue属性的,并通过$emit方法触发一个自定义事件。组件中监听这个自定义事件,并在事件处理函数中重新绑定input的value属性,从而实现了组件修改input后调用组件刷新的效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值