解决Vue2,0 实例创建之后添加新的属性到实例上,不会触发视图更新问题?

  • Post author:
  • Post category:vue


在我们使用vue进行开发的过程中,可能会遇到一种情况:当生成vue实例后,当再次给数据赋值时,有时候并不会自动更新到视图上去?

比如我在做项目遇到一个问题就是,数据列表的选中,我经常做法就是给每个列表的item,动态设置一个check属性,然后点击选中图标,check取反,这个就可以达到选中切换的效果,以下是我的代码:

上图中 item.check这个属性原本在我的数据是没有的,我们利用js中的prototype就可以动态添加上的。按照以上的逻辑,我们只要在点击事件中对check取反就可以了:

从上两张图可以看出,check值是有的,且数据也有变化,但在vue中不会更新到视图中,也就是界面没有变化!这时我就那梦了,我在用angular的时候这个是完全没问题的,我开始怀疑我的人生了,于是我就是官网查看文档,终于某处看到了….


官网地址

为什么会这样呢?当去查对应文档时,你会发现响应系统 ,把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项,Vue 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter,如上示例,将data在控制台打印出来会发现:

从上面除了动态添加的check属性外,其它不是动态添加都有get和set方法,,但是在check里面并没有这两个方法,因此,设置了check值后vue并不会自动更新视图;

官网给出的解决方法

1、通过Vue.set方法设置data属性,如上:

   Vue.set(item,'check', !item.check)
复制代码

2、您还可以使用 vm.$set实例方法,这也是全局 Vue.set方法的别名:

this$.set(item,'check', !item.check)
复制代码

3、自己还一个想法

双向是Vue 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter,这样我们是不是在还没绑定,通过动态遍历对象,添加上check属性,不就可以啦,当然对于数据量很大的时候,这种做法肯定是不理想的。


愿你成为终身学习者