Vue2中$forceUpdate()的使用

1dcfcbf322b023780cec00f0f8353b30.png

首先我们知道在vue中,数据的绑定都不用我们操心,例如在data中有一个 msg 的变量,你修改它,那么在页面上,msg 的内容就会自动发生变化。但是如果对于一个复杂的对象,例如一个对象数组,你直接去给数组上某一个元素增加属性,或者直接把数组的 length 变成0,vue就无法知道发生了改变。

vue中我们尝试直接给某个item增加一个属性,发现页面上没有效果;直接将 length 变成0来清空数组,也没有效果,关键代码如下:

change: function(index) {//增加性别属性
    this.list[index].sex = '男';
},
clear: function() {//清空数组
    this.list.length = 0;
}

其实呢,上面的写法没有效果,是因为没有按照vue的规范去写,因为vue文档里面写了,对于深层的,最好用$set方法,这样vue就可以知道发生了变化,同时vue也不建议直接修改length,可以给一个空数组来置空。

上面是我们按照vue的规范去写的,是可以实现变化的,关键代码如下:

change: function(index) {//增加性别属性
    this.$set(this.list[index],'sex','男')
},
clear: function() {//清空数组
    this.list=[];
}

可是如果我们不想利用 $set 去设置,非要按照我们第一种方式去写,可以实现么?答案是可以的,就是利用 $forceUpdate 了,因为你修改了数据,但是页面层没有变动,说明数据本身是被修改了,但是vue没有监听到而已,用$forceUpdate就相当于按照最新数据给渲染一下。

关键代码如下:

change: function(index) {
    this.list[index].sex = '男';
    this.$forceUpdate();
},
clear: function() {
    this.list.length = 0;
    this.$forceUpdate();
}

这个和vue内部的实现机制有关,(vue不同版本可能不一定有此问题),可以看到,当我们用$forceUpdate 之后,就会得到正确的结果。当然,一般我们也不会这么去使用,我们可以在 data 里面定义一个变量,在 mounted 之后给变量赋值 this.$children.length ;或者直接在 mounted 之后使用 $forceUpdate 强制刷新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值