目录
为什么我们要研究一下Vue监测数据的原理?
以防我们后续在给data赋值或者修改data中数据时导致修改不成功
比如下面这个例子:
- html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title> 初识vuetitle>
-
- <script type="text/javascript" src="../js/vue.js">script>
- head>
- <body>
- <div id="root">
- <h2>人员列表h2>
-
- <button @click="updateMei">更改马冬梅信息button>
- <ul>
- <li v-for="(p,index) in persons" :key="p.id" >
- {{p.name}}-{{p.age}}-{{p.sex}}
- li>
- ul>
-
- div>
-
- <script type="text/javascript">
- //阻止vue在启动时生成生产提示
- Vue.config.productionTip=false
-
- const vm= new Vue({
- el:'#root',
- data:{
-
- persons:[
- {id:'001',name:'马冬梅',age:19,sex:'女'},
- {id:'002',name:'周冬雨',age:20,sex:'女'},
- {id:'003',name:'周杰伦',age:21,sex:'男'},
- {id:'004',name:'温兆伦',age:22,sex:'男'}
- ],
-
- },
- methods: {
- updateMei(){
- this.persons[0].name = '马老师'
- this.persons[0].age = 50,
- this.persons[0].sex = '男'
-
-
- }
- },
-
- })
-
- script>
- body>
- html>
当我们点击按钮之后,会发生下面这种情况
我们不难发现:页面中的内容修改了,Vue中的数据也修改了
但是如果我们把代码中的数据改成下面这个样子:
- methods: {
- updateMei(){
- //this.persons[0].name = '马老师'
- //this.persons[0].age = 50,
- //this.persons[0].sex = '男'
- this.persons[0] ={id:'001',name:'马老师',age:50,sex:'男'}
-
- }
- },
初始界面和上面还是相同的,但是我们点击按钮之后,页面和Vue并没有反应
原因:我们直接操作的数组的索引值,用赋值的方式去改(具体参照Vue监测数据的原理---数组)
数组中 persons[0] persons[1] persons[2].....这种没有getter和setter,但是persons[0] persons[1]里面的属性有getter和setter,比如name、age、sex都会有getter和setter
修改成下面这个样子:
所以我们就要研究一下Vue监测数据的原理
过程:
对于上面监视对象的例子我们不难发现,只要我们有对象,就会有getter和setter
我们在代码中没有写某个对象,但是在后期我们想添加上
比如下面这种情形
我们在页面的Vue中给学生添加一个性别,我们不难发现我们新添加的这个性别没有getter和setter
那如果我们前期没添加,但是后期又想添加怎么把?
API给我提供了一个Vue.set(target,key,val)方法
target:我们要往谁的身上追加一个属性
key:往target身上加一个什么属性
val:值
虽然我们是后天添加,但是我们依然享有getter和setter
另外一种方法:
案例:我们要点击一个按钮,给学生追加性别
- html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title> 初识vuetitle>
-
- <script type="text/javascript" src="../js/vue.js">script>
- head>
-
- <body>
- <div id="root">
- 、<h1>学校信息h1>
- <h2>学校名称:{{name}}h2>
- <h2>学校地址:{{address}}h2>
- <hr/>
- <h1>学生信息h1>
- <button @click="addSex" >添加一个学校信息,默认值是男button>
-
- <h2>学生姓名:{{student.name}}h2>
- <h2>学生性别:{{student.sex}}h2>
- <h2>学生年龄:真实{{student.age.rAge}},对外{{student.age.sAge}}h2>
- <hr/>
- <ul>
- <li v-for="(f,index) in student.friends">
- {{f.name}}---{{f.age}}
- li>
- ul>
- div>
-
- body>
- <script type="text/javascript">
- //阻止vue在启动时生成生产提示
- Vue.config.productionTip=false
-
- const vm= new Vue({
- el:'#root',
- data:{
- name:'尚硅谷',
- address:'北京',
- student:{
- name:'tom',
- // sex:'男',
- age:{
- // 真实年龄
- rAge:40,
- sAge:29
- },
- friends:[
- {name:'jerry',age:35},
- {name:'tony',age:36}
- ]
- },
- },
-
- methods: {
- addSex(){
- Vue.set(this.student,'sex','男')
- }
- },
- })
- script>
- html>
不难发现,我们上面那个案例成功了
但是!!!!!我们现在要变一下,我们不给data里面的对象追加属性了,我们给data追加!
不难发现,出错了!
结论:Vue.set不能给data追加属性(也不能给vm 追加),但是可以给data里面的对象追加属性
- html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title> 初识vuetitle>
-
- <script type="text/javascript" src="../js/vue.js">script>
- head>
-
- <body>
- <div id="root">
- 、<h1>学校信息h1>
- <h2>学校名称:{{school.name}}h2>
- <h2>学校地址:{{school.address}}h2>
- <h2>校长是:{{school.leader}}
- <hr/>
- <h1>学生信息h1>
- <button @click="addSex" >添加一个学校信息,默认值是男button>
-
- <h2>学生姓名:{{student.name}}h2>
- <h2>学生性别:{{student.sex}}h2>
- <h2>学生年龄:真实{{student.age.rAge}},对外{{student.age.sAge}}h2>
- <hr/>
- <h1>爱好h1>
- <ul>
- <li v-for="(h,index) in student.hobby">
- {{h}}
- li>
- ul>
- <h1>朋友们h1>
- <ul>
- <li v-for="(f,index) in student.friends">
- {{f.name}}---{{f.age}}
- li>
- ul>
- div>
-
- body>
- <script type="text/javascript">
- //阻止vue在启动时生成生产提示
- Vue.config.productionTip=false
-
- const vm= new Vue({
- el:'#root',
- data:{
- school:{
- name:'尚硅谷',
- address:'北京'
- },
- student:{
- name:'tom',
- // sex:'男',
- age:{
- // 真实年龄
- rAge:40,
- sAge:29
- },
- hobby:['抽烟','喝酒','烫头'],
- friends:[
- {name:'jerry',age:35},
- {name:'tony',age:36}
- ]
- },
- },
-
- methods: {
- addSex(){
- Vue.set(this.student,'sex','男')
- }
- },
- })
- script>
- html>
注意看,我们的爱好写成的是一个数组的形式,我们在下面观察,我们并没有发现爱好的getter和setter(如果把爱好的属性写成对象的模式,会有getter和setter),那说明我们直接修改数组的话,页面的内容可能不会改变
那我们怎么修改数组呢?
这个push已经和我们以前学的数组的push有一点不一样了
下面这个是数组中的push
参数0 代表数组的下标 参数1 代表干掉 参数‘打台球’代表替换成打台球
- html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title> 初识vuetitle>
-
- <script type="text/javascript" src="../js/vue.js">script>
- head>
-
- <body>
- <div id="root">
- <button @click="student.age++">年龄+1岁button><br/>
-
- <button @click="addSex">添加性别属性,默认值:男button><br/>
-
- <button @click="addFriend">在列表首位添加一个朋友button><br/>
-
- <button @click="updateFirstFriendName">修改第一个好友的名字button><br/>
-
- <button @click="addHobby">添加一个爱好button><br/>
-
- <button @click="updateHobby">修改第一个爱好为:开车button><br/>
-
- <h1>学生信息h1>
- <h2>学生姓名:{{student.name}}h2>
- <h2>学生年龄:{{student.age}}h2>
-
- <h2 v-if="student.sex">学生性别:{{student.sex}}h2>
- <hr/>
- <h1>爱好h1>
- <ul>
- <li v-for="(h,index) in student.hobby">
- {{h}}
- li>
- ul>
- <h1>朋友们h1>
- <ul>
- <li v-for="(f,index) in student.friends">
- {{f.name}}---{{f.age}}
- li>
- ul>
- div>
-
- body>
- <script type="text/javascript">
- //阻止vue在启动时生成生产提示
- Vue.config.productionTip=false
-
- const vm= new Vue({
- el:'#root',
- data:{
- student:{
- name:'tom',
- // sex:'男',
- age:18,
- hobby:['抽烟','喝酒','烫头'],
- friends:[
- {name:'jerry',age:35},
- {name:'tony',age:36}
- ]
- },
- },
-
- methods: {
- addSex(){
- Vue.set(this.student,"sex",'男')
- },
- addFriend(){
- // 往前面加一个
- this.student.friends.unshift({name:'jack',age:70})
- },
- updateFirstFriendName(){
- // 下面注释这么写就费了
- // this.student.friends[0] ='123'
- this.student.friends[0].name ='张三'
- },
- addHobby(){
- this.student.hobby.push('学习')
- },
- updateHobby(){
- // 从第0个开始,删除一个,并再加入一个开车
- // this.student.hobby.splice(0,1,'开车')
-
- // 将数组中的下标为0的修改为开车
- Vue.set(this.student.hobby,0,'开车')
-
- }
- },
- })
- script>
- html>
1.vue会监视data中所有层次的数据
2.如何检测对象中的数据?
通过setter实现监视,且要在new Vue时就传入要监测的数据
①对象中后追加的属性,Vue默认不做响应式处理
②如需给后添加的属性做响应式处理,需要下面的API
3. 如何监测数组中额的数据?
通过包裹数组更新元素的方法实现,本质就是做了两件事:
①调用原生对应的方法对数组进行更新
②重新解析模板,进而更新页面
4.在Vue修改数组中的某个元素一定要用如下方法