vue给数组和对象进行增加删除字段不更新数据的解决方法 — Vue.set(object, key, value)

关于为什么数据变动不重新渲染, 官网已经介绍了, 这里就不再多说:

下面主要记录一下如何利用Vue.set方法手动的触发Vue的渲染:

具体的操作代码如下:
组件基本代码:

<style lang="sass">

</style>
<template>
<div>
    <div>
        <div>

        </div>
    </div>
</div>
</template>
<script>
    export default {
        data(){
            return {

            }
        },
        methods: {
            ceshi(){

            }
        }
    }
</script>

1.数组的增加,删除(数组的push等方法排除)

</style>
<template>
<div>
    <div>
        <div>
            <div v-for="item in items">
               <span>{{ item }}</span>
            </div>
            <button @click="ceshi">anniu</button>
        </div>
    </div>
</div>
</template>

<script>
    export default {
        data(){
            return {
                items: [11,22],
                obj: { a: 'aa', b: 'bb' }
            }
        },
        methods: {
            ceshi(){
                this.items[2] = 33; // 这样的写法数据是无法重新渲染的
            }
        }
    }
</script>

点击按钮操作ceshi事件前后,没发生变化

这里写图片描述

解决方法:

  1. 就是利用数据的push方法是可以实现的
  2. 利用Vue.set方法

具体实现如下:

methods: {
    ceshi(){
        this.$set(this.items, 2, 33)
    }
},

同理,如果items: [{a: ‘11’}] –> items: [{a: ‘11’, b: ‘22’}]

<div v-for="item in items">
  <span v-for="(i, j) in item">{{ i }}--{{ j }}</span>
</div>

this.items[0] = Object.assign({}, this.items[0], { b: '22' });
this.$set(this.items, 0, this.items[0]);

2.给对象增加新属性(同理)

<template>
    <div>
        <div v-for="item in obj">
          <span>{{ item }}</span>
        </div>
    </div>
</template>

data(){
    return {
        obj: { a: 'aa', b: 'bb' }
    }
}

methods: {
    ceshi(){
       this.obj['c'] = '000'; // 不起作用
       this.$set(this.obj, 'c', '000'); //起作用 
    }
},
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值