vue修改对象的属性值后页面不重新渲染问题

解决方法

  1. 用$.set
  2. 用Object.assign

vue双向绑定原理

Vue采用数据劫持结合发布者-订阅者模式的方法,通过Object.defineProperty()来劫持各个属性的setter,getter属性,在数据变动话,通知订阅者,触发更新回调函数,重新渲染视图。

vue数据

vue中data中定义的数据,都被赋予了getter和setter,当你要给对象添加新的属性的时候,或者你在其他地方直接this.出来的变量,是没有getter和setter属性的。

(当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/setter。受现代 JavaScript 的限制 (以及废弃 Object.observe),Vue 不能检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的。
)

解决办法

<div>{{data.a}}{{data.b}}{{data.c}}</div>
export default {
  name: "addEdit",
  data() {
    return {
      data: {
      	a: 1
      }
    }
  },
  mounted(){
  	this.data = Object.assign({},this.data,{ b: '哈哈哈'});
	
	//数据层次太多的时候,可以手动调用,触发render函数进行自动更新
	this.$forceUpdate();
  	this.$set(this.data,'c','呼呼呼');
  }
}

猜你喜欢

转载自blog.csdn.net/qq_34664239/article/details/107582155