在vue中,想要改变自己新增的一个属性值,但数据改变了,视图没有发生改变

本文探讨了在Vue.js中,如何正确地添加和更新动态属性以确保视图能够响应变化。通过实例演示了直接修改对象属性与使用Vue.set方法的区别,以及这两种方法在实际开发中的应用。

举个常见的栗子:展开和关闭。在数据请求到数据后,新增展开和关闭的一个开关属性 flag
我的数据结构:

obj:{
	arr:[
		{
			id: 1,
			content:''
		},{
			id: 2,
			content:''
		}
	]
}
<span class="pointer" v-if="item.flag" @click="switchOpen(item, false)">收起评论</span>
<span class="pointer" v-else @click="switchOpen(item, true)">展开评论</span>

一开始:


数据请求后新增属性:

async getFAQTitleApprovedDetail() {
      const res = await getFAQTitleApprovedDetail(this.FAQTitleApprovedDetail)
      this.obj = res.data
      this.obj.answers.map(item => { item.flag = false })
},
switchOpen(item, val) {
      item.flag = val
},

然后点击后,值改变了,但是上面的dom没有改变,一直是展开评论。

在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的。
根据官方文档定义:如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。

后来:


方法一:(先做处理,再赋值)

async getFAQTitleApprovedDetail() {
      const res = await getFAQTitleApprovedDetail(this.FAQTitleApprovedDetail)
      res.data.answers.map(item => { item.flag = false })
      this.obj = res.data
},
switchOpen(item, val) {
      item.flag = val
},

方法二:(使用 this.$set 赋值)

async getFAQTitleApprovedDetail() {
      const res = await getFAQTitleApprovedDetail(this.FAQTitleApprovedDetail)
      this.approvedDetailObj = res.data
      this.approvedDetailObj.answers.forEach(item => {
        this.$set(item, 'flag', false)
      })
},
switchOpen(item, val) {
      item.flag = val
},
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值