Vue监视数据的原理详解

Vue监视数据的原理详解

目录

1. Vue监视数据的原理(set方法)

1.1 Vue监视不同类型数据的原理

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

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

1.1.3 小案例

1.1.4 set()小案例

总结

1. Vue监视数据的原理(set方法) 1.1 Vue监视不同类型数据的原理

特点:vue会监视data中所有层级的数据,并且如果他检测到是对象那么就会给对象里面所有的属性配置getter和setter函数

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

通过setter实现监视,且要在new Vue时就传入要监测的数据

​(1).对象中后追加的属性,Vue默认不做响应式处理(就是没有配置getter和setter函数)

(2).如需给后添加的属性做响应式,请使用如下API:

​ Vue.set(target,propertyName/index,value) 

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

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

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

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

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

​ (1). 使用这些API:push()pop()shift()unshift()splice()sort()reverse()

​ (2). Vue.set() 或 vm.$set()

1.1.3 小案例 <div id="root"> <h2>人员信息</h2> <button @click="updatep">点击更新马东梅的信息</button> <ul> <li v-for='p in person' :key="p.id"> {{p.name}} -- {{p.age}} -- {{p.gender}} </li> </ul> <button @click="addNew">在结尾添加一个人的信息</button> </div> <script> Vue.config.productionTip = false let vm = new Vue({ el: '#root', data: { person: [ { id: "001", name: "马冬梅", age: 20, gender: "女" }, { id: "002", name: "夏洛特", age: 33, gender: "男" }, { id: "003", name: "沈腾", age: 50, gender: "男" }, { id: "004", name: "贾玲", age: 45, gender: "女" }, ] }, methods: { updatep() { // 但是下面方法不奏效,此方法Vue检测不到, // 原因是因为数组上面没有getter和setter方法所以检测不到数据发生改变 // this.person[0] = {id:"001",name:"李焕英",age:66,gender:"女"} // 下面方法奏效,是因为属性上面已经配置了getter和setter方法 // this.person[0].name = "李焕英" // this.person[0].age = "66" // this.person[0].gender = "女" // this.person.splice(0, 1, { id: "001", name: "李焕英", age: 66, gender: "女" }) this.$set(this.person, 0, { id: "001", name: "李焕英", age: 66, gender: "女" }) }, addNew() { this.person.push({id: "005", name: "老妹啊", age: 99, gender: "女"}) } }, }) </script> 1.1.4 set()小案例 <div id="root"> <h2>学生信息</h2> <p>姓名:{{student.name}}</p> <!-- 一个很重要的点:如果是查找对象中不存在的属性,返回的是一个undefined 不管v-show或者是v-if,如果等到undefined的就不显示 --> <p v-show="student.sex">性别:{{student.sex}}</p> <p>年龄:{{student.age}}</p> <p>地址:{{student.address}}</p> <p>联系方式:{{student.contact}}</p> 朋友:<p v-for="(v,index) in student.friends" :key="index">{{v.name}} -- {{v.age}}</p> <button @click="add">点击添加性别</button> </div> <script> Vue.config.productionTip = false let vm = new Vue({ el: '#root', data: { student: { name: "Jack", age: 18, address: "北京", contact: "13xxxxxxx56", friends: [ { name: 'Mark', age: 12 }, { name: 'Lisa', age: 52 }, { name: 'Guli', age: 25 }, ] } }, methods: { add() { 两种写法都可以 // this.$set(vm.student,"sex","男") Vue.set(this.student,"sex","男") } }, }) </script> 总结

以上就是今天要讲的内容,本文介绍了Vue监视数据的原理和set方法,该部分很重要需要好好理解,希望对大家有所帮助!

推荐阅读