Vue.set视图更新,vue中数组发生变化但视图没有更新

  Vue.set视图更新,vue中数组发生变化但视图没有更新

  本文主要介绍这一点。$set()方法解决vue中数据更新视图不更新的问题,有很好的参考价值。希望对你有帮助。如有错误或不足之处,请不吝赐教。

  

目录

   vue数据更新视图未更新以解决问题。vue数据未更新的原因(数据已更改,但视图未更新)。具体解决流程如下:数组更新检测注意事项;物体变化检测预防措施。

  

vue数据更新视图不更新

  1.1.data中有对象obj:{姓名:元航,年龄:18}

  2.这时候加个电话。

  这个电话=123456

  this.obj.phone=654321 的视图再次更新,但它不是用this更新的。$ set (this.obj, phone , 654321 );也不更新。

  3.添加后,数据会更新,但视图不会。

  

解决问题

  因为obj中没有电话字段,这个。首次添加属性时应使用$ set (this.obj, phone , 123456 );就是这样。

  我没有用这个。$set()第一次添加属性,所以我没有设置数据监控。

  添加多个属性方法

  //而不是“object.assign (this.someobject,{a: 1,b: 2})”

  this.someObject=object . assign({ },this . someobject,{ a: 1,b: 2 })

  

vue数据不更新的原因(数据更改了,但是视图没有更新)

  模板:

  div id=应用程序

  h2{{dataObj.text}}/h2

  /div

  js:

  新Vue({

  埃尔: #app ,

  数据:{

  dataObj: {}

  },

  就绪:函数(){

  var self=this

  /**

  *异步请求模拟

  */

  setTimeout(function () {

  self . data obj={ };//真正更新数据的就是这一行代码。

  self . data obj[ text ]= new text ;

  }, 3000);

  }

  })

  上面的代码非常简单。我们都知道vue中data声明的数据具有响应性的特点,所以我们先在data中声明一个dataObj空对象,然后在异步请求中执行两行代码,如下:

  self . data obj={ };

  self . data obj[ text ]= new text ;

  

解决办法

  首先清除原始数据,然后添加一个文本属性并赋值。然后更新数据和模板。

  其中.text属性不具有响应式,但是数据更新了。原因:

  vue的dom更新是异步的,即当setter操作发生时,指令不会立即更新,指令的更新操作会延迟。当指令更新实际执行时。text属性,所以当指令更新模板时会获得新值。

  

具体流程如下

  self . data obj={ };发生Setter操作。vue检测setter操作,并通知相关指令自行执行更新操作。data obj[ text ]= new text ;赋值语句指示更新开始,所以真正的触发器更新操作是self . data obj={ };这句话,所以只看上面的例子,具有响应式特征的数据只有dataObj,其子属性不可用。

  

数组更新检测

  Vue包含了一套观察数组的变异方法,所以它们也会触发视图更新。这些方法如下:

  push()pop()shift()unshift()splice()sort()reverse()

  

注意事项

  由于JavaScript的限制,Vue无法检测到以下更改的数组:

  当您使用索引直接设置一个项目时,例如:vm.items[indexOfItem]=newValue

  修改数组长度时,例如:vm.items.length=newLength

  例如:

  var vm=new Vue({

  数据:{

  项目:[a , b , c]

  }

  })

  Vm.items[1]=x //没有响应

  Vm.items.length=2 //没有响应

  解决第一类问题,下面两种方式可以达到和vm.items[indexOfItem]=newValue一样的效果,也会触发状态更新:

  //Vue.set

  Vue.set(vm.items,indexOfItem,newValue)

  //Array.prototype.splice

  vm.items.splice(indexOfItem,1,newValue)

  您也可以使用虚拟机。$set实例方法,它是全局方法Vue.set的别名:

  vm。$set(vm.items,indexOfItem,newValue)

  要解决第二种问题,您可以使用splice:

  vm.items.splice(新长度)

  

对象更改检测注意事项

  仍然由于JavaScript的限制,Vue无法检测对象属性的添加或删除:

  var vm=new Vue({

  数据:{

  答:1

  }

  })

  //`VM.a `现在有响应了。

  vm.b=2

  //`VM.b `没有响应。

  对于创建的实例,Vue不能动态添加根级别的响应属性。但是,您可以使用Vue.set(object,key,value)方法向嵌套对象添加响应属性。例如,对于:

  var vm=new Vue({

  数据:{

  用户配置文件:{

  姓名:“夏嫣”

  }

  }

  })

  您可以向嵌套的userProfile对象添加新的年龄属性:

  Vue.set(vm.userProfile, age ,27)

  您也可以使用虚拟机。$set实例方法,它只是全局Vue的别名。set:

  vm。$set(vm.userProfile, age ,27)

  有时您可能需要为现有对象分配多个新属性,例如使用Object.assign()或_。扩展()。在这种情况下,您应该使用两个对象的属性创建一个新对象。所以,如果你想添加一个新的响应属性,不要像这样:

  Object.assign(vm.userProfile,{

  年龄:27,

  收藏夹颜色:“绿色”

  })

  你应该这样做:

  vm.userProfile=object . assign({ },VM . user profile,{

  年龄:27,

  收藏夹颜色:“绿色”

  })

  以上个人经历,希望能给大家一个参考,也希望大家多多支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: