Vue2(四):Vue监测数据的原理

news/2024/4/27 17:48:58

一、先来看一个问题

添加一个按钮点击更新马冬梅的信息:

<button @click="gengxin">点击更新马冬梅的信息</button>
methods:{gengxin(){this.person[1].name='马老师',this.person[1].age=50,this.person[1].sex='男'}}

下面这种方式就不能奏效,但是在控制台查看person[1]姓名年龄啥的都是更改之后的。如果先点击按钮在点击vue后台可以看到信息更改页面却不更改,先点击vue后台就vue也没改页面也没改,这是为啥呢?

 this.person[1]={id:'002',name:'马老师',age:'50',sex:'男'}

二、Vue监视对象改变的原理

我们写的data是要传入的数据,传入到vm._data,这两个其实不是一摸一样的,打开控制台可以看到vm._data里面还有一堆东西,就是因为data在传入给vm._data之前,还要进行一些处理。

加工一下就能做响应式了(数据变了页面也跟着变),vm._data里面还有name.get/address.get和name.set等等函数

我们用原生js写也可以大概模拟一下name和address的getter和setter但是vue做的事情要更多,比如直接输入vue.name就可以查看,js还要vue._data.name

而且如果data里面数据套娃的话vue是自动递归嵌套有getter和setter的,js就没有了,vue连嵌套的数组也能给你挖出来配套getter和setter。

三、Vue监测对象中的数据

1.Vue.set()

实现后添加的数据也能有响应式的功能调用Vue给的API:

Vue.set(vm.student,'sex','男');

vm.$set(vm.student,'sex','男');

实现点击按钮添加性别

<div id="root"><h2>学校名称:{{name}}</h2><h2>学校地址:{{address}}</h2><hr/><button @click="addSex">点我添加性别</button><h2>学生姓名:{{student.name}}</h2><h2 v-if="student.sex">学生性别:{{student.sex}}</h2><!-- 判断一下有没有性别,有就展示没有就隐藏 --><h2>学生真实年龄:{{student.age.rAge}},对外年龄:{{student.age.lAge}}</h2><h2><ul><li v-for="(f,index) in student.friends" :key="index">{{f.name}}--{{f.age}}</li></ul></h2></div><script type="text/javascript">const vm=new Vue({el:'#root',data:{name:'尚硅谷',address:'北京',student:{name:'tom',age:{rAge:40,lAge:18},friends:[{name:'jerry',age:35}]}},methods: {addSex(){Vue.set(this.student,'sex','男')}},})

set的局限性:最开始我们在student里面没有加sex但是盒子上面引用了没有报错,是因为a.b,只要data里有a就不会报错,如果我们再想添加一个校长是不可以给data里面追加属性的,第一个参数不可以是data或者vm。

四、Vue监测数组中的数据

数组中的数据不能靠setter和getter取得和改变数据,在Vue修改数组中的某个元素实现响应式的方法:

1.使用这些API:

push:在最后一个位置添加元素

pop:删除最后一个元素

shift:删除第一个

unshift:往前边加一个

splice:在指定位置插入一个元素

sort:分类

reverse:反转这个数组

filter不算,因为它都不能改变原数组,可以筛选完之后再赋值到之前的数组

所以我们就知道一当中的问题是为什么了,我们对数组的索引值直接去赋值肯定不行

vue当中的数组调用push方法和原始的数组调用push不一样,它是先像原始数组那样调,然后去重新解析模版,生成虚拟dom等等

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

Vue.set(vm.student.hobby,1,'跳舞')

五、综合大练习

 <div id="root"><hr/><h1>学生信息</h1><button @click="student.age++">年龄+1</button><button @click="addSex">添加性别属性,默认值为男</button><button @click="addFriend">在列表首页添加一个朋友</button><button @click="xiugai">修改第一个朋友的名字为张三</button><button @click="addHobby">添加一个爱好</button><button @click="xiugaiaihao">修改第一个爱好为开车</button><h2>学生姓名:{{student.name}}</h2><h2 v-if="student.sex">学生性别:{{student.sex}}</h2><h2>学生真实年龄:{{student.age}}</h2><h2><ul>朋友<li v-for="(f,index) in student.friends" :key="index">{{f.name}}--{{f.age}}</li></ul><ul>爱好<li v-for="(h,index) in student.hobby" :key="index">{{h}}</li></ul></h2></div><script type="text/javascript">const vm=new Vue({el:'#root',data:{student:{name:'tom',age:18,hobby:['抽烟','喝酒','打麻将'],friends:[{name:'jerry',age:35},{name:'tony',age:40}]}},methods: {addSex(){Vue.set(this.student,'sex','男')},addFriend(){this.student.friends.unshift({name:'tt',age:18})},xiugai(){//this.student.friends[0].name.splice(0,1,'张三')this.student.friends[0].name='张三'},addHobby(){this.student.hobby.unshift('唱歌')},xiugaiaihao(){this.student.hobby.splice(0,1,'开车')}},})</script>

我做的时候修改第一个朋友的名字为张三的出了点问题,我光记着不能直接赋值了,但是像这种给数组下的某一个去赋值是可以的,不可以的是不能数组那一条直接赋值frined[0]={,,}这种

说的是0这一项的setter 和getter没有,0本身是对象,下面的name是一个属性,有属性就有setter 和getter。

不能通过数组的索引值直接赋值!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/10812.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

10:00面试,10:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

金融知识分享系列之:出场信号RSI指标

金融知识分享系列之&#xff1a;出场信号RSI指标 一、出场信号RSI指标二、RSI指标原理三、 指标用法四、RSI指标总结 一、出场信号RSI指标 名称&#xff1a;相对强弱指标参数&#xff1a;(默认14)组成&#xff1a;RSI线以及30轴、50轴、70轴构成 0-30是极弱&#xff1a;0-30的…

蓝桥杯之动态规划冲刺

文章目录 动态规划01背包小练一下01背包网格图上的DP完全背包 最长公共字符串最长递增子序列 动态规划 动态规划&#xff1a;确定好状态方程&#xff0c;我们常常是确定前 当状态来到 i 时&#xff0c;前 i 个物体的状态是怎么样的&#xff0c;我们并不是从一个点去考虑&#x…

Linux工具 - 耀眼的git

~~~~ 前言耀眼的GitGit是什么&#xff08;本质&#xff09;Git出现的背景&#xff08;本着开源的精神&#xff09;在命令行中使用Git&#xff08;Come on 来使用Git吧&#xff09;.git文件说明新建仓库git clone 克隆云端仓库到本地git addgit commit -mgit pushgit pullgit st…

vue项目设置通过IP和localhost可同时访问

vue项目设置通过IP和localhost可同时访问 打开package.json文件 在要运行的分支下添加host,最后重新运行项目 重新运行项目 "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js --host 0.0.0.0",

Spring6--基于注解管理Bean / 手写IOC

1. 基于注入管理Bean概念 Java 5 引入了注解&#xff08;Annotation&#xff09;这一特性&#xff0c;它允许程序员在源代码中插入元数据&#xff0c;这些元数据以标签形式存在&#xff0c;可以被编译器、类加载器或运行时环境所识别和处理。注解可以帮助开发者在不修改业务逻…