vue检测数据的原理

一个简单的例子,总结一下vue监测数据

<div id="app">
  <h1>学生信息</h1>
  <button @click="addSex">添加sex属性,默认值为男</button>
  <button @click="changeSex">修改sex属性</button>
  <button @click="unshiftFriend">在列表首位添加一个朋友</button>
  <button @click="changeFriendName">修改第一个朋友的名字为:张三</button>
  <button @click="addHobby">添加一个爱好</button>
  <button @click="changeHobby">修改第一个爱好为:开车</button>
  <h2>姓名:{{student.name}}</h2>
  <h2>性别:{{student.sex}}</h2>
  <h2>爱好:</h2>
  <ul>
    <li v-for="(h,index) in student.hobby" :key="index">{{h}}</li>
  </ul>
  <h2>朋友们:</h2>
  <ul>
    <li v-for="(f,index) in student.friends" :key="index">{{f.name}} -- {{f.age}}</li>
  </ul>
</div>
const app = new Vue({
  el: "#app",
  data: {
    student: {
      name: "AIpoem",
      hobby: ["抽烟","喝酒","烫头"],
      friends: [
        {name: "jerry",age: 18},
        {name: "Cici",age:19}
      ]
    }
  },
  methods: {
    addSex() {
      // this.student.sex = "男"  不是响应式
      this.$set(this.student,"sex","男");
    },
    changeSex() {
      // 直接改即可,因为上面添加的sex属性为响应式
      this.student.sex='女'
    },
    unshiftFriend() {
      this.student.friends.unshift({name:"newFriend",age:20});
    },
    changeFriendName() {
      // 这里直接改即可,name属性是响应式的
      this.student.friends[0].name = "张三";
    },
    addHobby() {
      this.student.hobby.push("新爱好");
    },
    changeHobby() {
      // this.student.hobby[0] = "开车" 不是响应式
      this.student.hobby.splice(0,1,"开车");
    }
  }
})

关于vue监视对象:
直接添加的sex属性,没有getter和setter,无法实现响应式
请添加图片描述
利用Vue.set()添加的sex属性,有getter和setter,可以实现响应式
请添加图片描述
另一种写法,和上面作用一样
请添加图片描述
关于vue监视数组:
请添加图片描述
比如这个例子,一开始页面是抽烟和喝酒,button绑定的点击事件中的语句是this.student.hobby[0] = "学习";,之后再输出app.student.hobby,可以发现数据确实已经改变,但是页面是没有相应变化的,因为这样通过数组下标来改变数据的方式,vue监测不到
正确写法:this.student.hobby.splice(0,1,"学习");
请添加图片描述

总结:

1.vue会监视data中所有层次的数据

vue监视的数据都是响应式的

2.如何监测对象中的数据

通过setter实现监视,且要在new Vue时就传入要监测的数据
(1).对象中后追加的属性,Vue默认不做响应式处理
(2).如需给后添加的属性做响应式处理
Vue.set(target, propertyName/index, value)
app.$set(target, propertyName/index, value)

3.如何监测数组中的数据?

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

  1. 调用原生对应的方法对数组进行更新(push()、pop()、、、)
  2. 重新解析模版,进而更新页面

4.在Vue中修改数组中的某个元素一定要用如下方法:

  1. 使用这些API: push()pop()shift()unshift()splice()sort()reverse()
    ⚠️:以上为变更方法,会变更调用了这些方法的原始数组。也有非变更方法,例如filter()concat()slice(),它们不会变更原始数组,而总是返回一个新数组。当使用非变更方法时,可以用新数组直接替换旧数组
  2. Vue.set()app.$set()

特别注意:Vue.set()app.$set()不能给app或者app的根数据对象(app._data)添加属性
(target参数不可以是app或者app._data)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值