Vue学习(三)数据监视

ゝ一世哀愁。 2022-09-09 13:46 277阅读 0赞

文章目录

  • 一、Vue更新数据存在的问题
  • 二、Vue监测数据改变的原理
  • 三、Vue 数据监视总结

一、Vue更新数据存在的问题

示例代码如下:

  1. <div id="app">
  2. <h2>人员信息</h2>
  3. <button @click="update">点击更新Robert人员信息</button>
  4. <ul>
  5. <li v-for="(p,index) of perArr" :key="p.id">
  6. {
  7. {p}}
  8. </li>
  9. </ul>
  10. </div>
  11. <script type="text/javascript"> const vm = new Vue({ el: '#app', data: { perArr: [{ id: '001', name: 'Robert', age: 19}, { id: '002',name: 'Rose', age: 18}, { id: '003', name: 'Jack', age: 20}] }, methods:{ update(){ //方式一:更换数组元素,有效 this.perArr[0].name ='Robin' this.perArr[0].age =20 //方式二:替换数组数据 // this.perArr[0] ={id: '001', name: 'Robin', age: 20} } } }) </script>

效果如下:
在这里插入图片描述
我们通过替换数组元素的方式能够成功修改人员数据,页面也能够成功显示最新数据;而通过修改数组数据我们可以发现页面无法正常显示最新数据,在Vue工具中也无法看到最新的数据,而我们在控制台中打印vm对象数据可以看到最新的数据,这是什么原因呢?

点开vm对象的详细数据,我们可以发现第一个数据数据中数据代理生成的getset方法被破坏了,导致页面无法响应式的显示。
在这里插入图片描述

二、Vue监测数据改变的原理

示例代码如下:

  1. <body>
  2. <div id="app">
  3. <button @click="addSex">添加属性</button>
  4. <ul>
  5. <li v-for="(friend,index) of student.friends" :key="index">
  6. {
  7. {friend}}
  8. </li>
  9. </ul>
  10. </div>
  11. </body>
  12. <script type="text/javascript"> Vue.config.productionTip = false const vm = new Vue({ el:'#app', data:{ name:'Peking', address:'北京', student:{ name:'tom', parents:{ father:40, mom:39, }, friends:[ 'Jerry','Able','Apple' ] } }, methods:{ addSex(){ // this.student.sex='男' Vue.set(this.student,'sex','男') } } }) </script>

① 对象

通过打印vm对象我们可以看到Vuevm中的对象属性中的属性添加了多个getset代理方法。在这里插入图片描述
② 数组

通过观察数组的代理方法我们可以看到Vue并没有给数组里的每个元素都添加代理方法,所以说当我们只是修改数组中的某个元素时,页面不会有响应式的变化,需要使用Vue包裹过的方法才会触发视图更新。这些被包裹过的方法包括:push()pop()shift()unshift()splice()sort()reverse()

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

三、Vue 数据监视总结

Vue会监视data中所有层次的数据

② 如何监测对象中的数据?

通过setter实现监视,且要在new Vue时就传入要监测的数据,对象中后追加的属性,Vue默认不做响应式处理,如需给后添加的属性做响应式,请使用如下API

  • Vue.set(target,propertyName/index,value)
  • vm.$set(target,propertyName/index,value)

③ 如何监测数组中的数据?

通过包裹数组更新元素的方法实现,本质就是做了两件事:

  • 调用原生对应的方法对数组进行更新
  • 重新解析模板,进而更新页面

在Vue修改数组中的某个元素一定要用如下方法:push()pop()shift()unshift()splice()sort()reverse()

④ 特别注意:Vue.set()vm.$set()不能给vmvm的根数据对象添加属性!!!

发表评论

表情:
评论列表 (有 0 条评论,277人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Vue数据监视

    Vue监视数据的原理: 1. vue会监视data中所有层次的数据。 2. 如何监测对象中的数据? 通过setter实现监视,且要在new Vue时就传

    相关 学习Vue

    第一步:搭建vue环境 由于之前已经安装好了node.js,和一些依赖,所以在这就直接创建vue项目了。 可参考:[http://www.jianshu.com/p/