美文网首页
vue中 数组通过循环添加新属性页面不更新

vue中 数组通过循环添加新属性页面不更新

作者: 啊杜杜杜 | 来源:发表于2019-03-25 15:43 被阅读0次

  vue中在一个数组中,通过循环添加一个新属性,添加后数据变了,属性没有改变。这是为什么呢?

受现代JavaScript的限制,Vue不能检测到对象属性的添加或删除。由于Vue会在初始化实例时对属性执行 getter/setter转化过程,所以属性必须在data对象上存在才能让Vue转换它,这样才能让它是响应式的。

一、分析说明

官网上关于数据的说明

   当一个Vue实例被创建时,它将data对象中的所有属性加入到Vue的响应式系统中。当这些属性的值发生改变时,视图将会产生“响应”,即匹配更新为新的值。
   当这些数据改变时,视图会进行重新渲染。值得注意的是只有当实例被创建时data中存在的属性才是响应式的。也就是说如果你添加一个新的属性b,那么对b的改动将不会触发任何视图的更新。如果你知道你会在晚些时候需要一个属性,但是一开始它为空或不存在,那么你仅需要设置一些初始值,比如。

data: {
  newTodoText: '',
  visitCount: 0,
  hideCompletedTodos: false,
  todos: [],
  error: null
}

这里唯一的例外是使用Object.freeze(),这会阻止修改现有的属性,也意味着响应系统无法再追踪变化。以下是一些具体的分析:

data(){
   return {
       user:{
            name:"Helle",
            age:"19",
         }
    }
}


//其中user.name  和user.age都是相应的,因为他们初始化时在data对象上存在
//可以直接通过user.name="LiLi"  的方式来修改

//user.sex  是非响应的,因为在data对象上不存在。

  Vue不允许在已经创建的实例上动态添加新的根级响应式属性。然而它可以使用Vue.set(obj,key,value)方法将响应式属性添加到嵌套对象上:

Vue.set(vm.someObject,'sex','girl');

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

this.$set(this.someObject,'sex','girl');

//上面的例子可以写为
this.$set(this.user,'sex','girl');
//则user为{name:"Helle", age:"19",sex:"girl"} ,三个属性都是响应式的。切记this.user.sex="girl"这样写是无效的。

  有时你想向一个已有对象添加多个属性,例如使用 Object.assign() 或 _.extend() 方法来添加属性。但是,这样添加到对象上的新属性不会触发更新。在这种情况下可以创建一个新的对象,让它包含原对象的属性和新的属性:


二、列表渲染



相关文章

网友评论

      本文标题:vue中 数组通过循环添加新属性页面不更新

      本文链接:https://www.haomeiwen.com/subject/szzvvqtx.html