位置: IT常识 - 正文

Vue2响应式原理(vue2响应式原理面试回答)

编辑:rootadmin
🍀vue2响应式原理 vue的特性:数据驱动视图和双向数据绑定。vue官方文档也提供了响应式原理的解释: 深入响应式原理 Object.defineProperty() Object.defineProperty()的作用是直接在一个对象上定义一个新属性,或者修改一个属性 使用方式:Object. ... ?vue2响应式原理

推荐整理分享Vue2响应式原理(vue2响应式原理面试回答),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue2响应式原理循环便利源码,vue2响应式原理和vue3的区别,vue2响应式原理循环便利源码,vue2响应式原理源码,vue2响应式原理代码实现,vue2响应式原理和vue3的区别,vue2响应式原理缺点,vue2响应式原理缺点,内容如对您有帮助,希望把文章链接给更多的朋友!

vue的特性:数据驱动视图和双向数据绑定。vue官方文档也提供了响应式原理的解释:

深入响应式原理

Object.defineProperty()

Object.defineProperty()的作用是直接在一个对象上定义一个新属性,或者修改一个属性

使用方式:Object.defineProperty(对象名,属性名,配置项)

<script>let person = {name: '张三',sex: '男',}Object.defineProperty(person,'age',{value: 18}) //不能参与遍历</script>

上述写法是给person对象添加一个age属性,属性的值是18

但是这种写法:

不能进行枚举,即无法在遍历的时候获取到age属性的值不能被修改不能删除

所以Object.defineProperty()还有其他配置项

Object.defineProperty(person,'age',{ value: 18 enumerable: true //控制属性是否可以枚举,get="_blank">默认值是false writeable: true //控制属性是否可以被修改,默认值是false configurable: true //控制属性是否可以被删除,默认值是false})

现在有一个需求:定义一个新的变量number,当number的值修改后,person中age的值也相应被修改;而person中age的值被修改后,number的值也相应被修改。

这个时候需要借助新的配置项get和set

<script>let number = 18let person = {name: '张三',sex: '男',}//能够实现number的值修改后,person中age的值也相应被修改 Object.defineProperty(person,'age',{ //当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值 get:function(){ return number }, //当有人修改person的age属性时,set函数(setter)就会被调用,且接收到修改的具体值 set(value){ number = value } })</script>数据代理

数据代理就是通过一个对象代理另一个对象中属性的操作

vue就是通过vm对象来代理data对象中属性的操作

<body> <div id="app"> <h2>姓名:{{name}}</h2> <h2>年龄:{{age}}</h2> </div></body><script> const vm = new Vue({ el: '#app', data: { name: '张三', age: 18 } })</script>

控制台输出vm,我们可以看到name和age这两个属性

这两个属性都是通过Object.defineProperty()添加到vm上,所以可以发现他们都有对应的getter/setter

也就是说:当读取vm中的name时,会调用getter,把data.name给name;当修改vm中的name时,会调用setter,修改data.name中的值(这里跟第一个例子是同一个道理)

但是我们会发现vm上没有data(疑惑:明明在创建vue实例对象的时候,设置了data,为什么取不到)

Vue2响应式原理(vue2响应式原理面试回答)

其实我们以为的这个data其实是_data,可以验证一下:

let data = { name: '张三', age: 18}const vm = new Vue({ el: '#app', data})

控制台进行一下判断:

所以我们获取数据的时候,也可以通过vm._data.age来获取

vue为了编码更方便,进行了数据代理,遍历data中的所有属性,把每个属性都添加到vm中,指定getter/setter。

所以可以直接通过vm.age来获取数据

基本原理:

通过Object.defineProperty()把data对象中所有属性添加到vm上为每一个添加vm上的属性,都指定一个getter/setter在getter/setter内部去操作(读/写)data中对应的属性实现双向绑定

双向绑定就是数据发生变化时,视图也跟着变。核心是数据劫持和发布者-订阅者模式

数据劫持实质就是使用defineProperty重写getter/setter。当数据改变时,set就会劫持这个数据的变化,更新视图(view)

但是由于defineProperty无法检测到对象和数组内部的变化,所以遇到属性为对象时,会递归观察该属性;遇到数组时,会重写push、pop、shift等方法。

监测对象中的数据

最开始会想认为利用getter/setter,但是这样会造成死循环。只要有人获取name的值,就会调用get,然后又会获取一次person.name,造成死循环。set同理。

//错误的代码!!!!!!!!!let person = { name: '张三',}Object.defineProperty(person, 'name', { get: function() { return person.name }, set(value) { person.age = name }})

正确的做法是:监听数据的每一个属性,当监听到属性值发生变化时,通知订阅者去更新视图,重新进行模板解析。

<script> let data = { name: '张三', } //创建一个观察者实例对象,用于监视data中属性的变化 const obs = new Observer(data) //准备一个vm实例对象 let vm = {} vm._data = data = obs function Observer(obj) { //汇总对象中所有的属性形成一个数组 const keys = Object.keys(obj) //遍历 keys.forEach((k) => { Object.defineProperty(this, k, { get() { return obj[k] }, set(val) { obj[k] = val } }) }) }</script>

上述代码只是一个例子,只会对一层对象进行处理,vue的操作是递归,直到数据类型是简单数据类型。

如需给后添加的属性做响应式,可以使用

Vue.set(object,propertyName,value)或vm.$set(object,propertyName,value)data: {student:{name: '张三',age: 18,friends:[{name:'小明',age:20},{name:'李四',age:15}]}}Vue.set(this.student, 'sex', '男')this.$set(this.student, 'sex', '男')监测数组中的数据

这里可以去看一下vue的官方文档:

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

(1)调用原生对应的方法对数组进行更新

(2)重新解析模板,进而更新页面

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

使用API:push(),pop(),shift(),splice(),sort(),reverse()等Vue.set(),vm.$set()
本文链接地址:https://www.jiuchutong.com/zhishi/313020.html 转载请保留说明!

上一篇:Dedecms标签Tag长度使用Titlelen属性控制(aspcms标签)

下一篇:phpcms图片不存在的解决办法(图片加载不存在)

  • 微信怎么指定回复别人发的消息(微信怎么指定回答问题)

    微信怎么指定回复别人发的消息(微信怎么指定回答问题)

  • 平台介入商家会退款吗(平台介入商家会扣钱吗)

    平台介入商家会退款吗(平台介入商家会扣钱吗)

  • 退出合种树对方有提醒(如何退出合种的树)

    退出合种树对方有提醒(如何退出合种的树)

  • 为什么我的抖音没有live(为什么我的抖音没有一键成片功能)

    为什么我的抖音没有live(为什么我的抖音没有一键成片功能)

  • 天猫旗舰店入驻需要什么条件(天猫旗舰店入驻难吗)

    天猫旗舰店入驻需要什么条件(天猫旗舰店入驻难吗)

  • 小米手环4一直显示蓝牙标志(小米手环4一直连接不上怎么办)

    小米手环4一直显示蓝牙标志(小米手环4一直连接不上怎么办)

  • 华为nova7se是什么意思(华为nova7se是什么意思se)

    华为nova7se是什么意思(华为nova7se是什么意思se)

  • qq音乐下载的歌不是mp3格式(qq音乐下载的歌曲为什么本地找不到)

    qq音乐下载的歌不是mp3格式(qq音乐下载的歌曲为什么本地找不到)

  • 更换显卡后字体不平滑(更换显卡之后图标特别大)

    更换显卡后字体不平滑(更换显卡之后图标特别大)

  • win100x80070002无法上网(win100x80070002无法开机)

    win100x80070002无法上网(win100x80070002无法开机)

  • qq下载的视频在哪个文件夹(QQ下载的视频在哪个文件夹)

    qq下载的视频在哪个文件夹(QQ下载的视频在哪个文件夹)

  • vivov1829a是什么型号的手机(vivoV1829A是什么型号)

    vivov1829a是什么型号的手机(vivoV1829A是什么型号)

  • 华为保时捷怎么截屏(华为保时捷怎么看是不是翻新机)

    华为保时捷怎么截屏(华为保时捷怎么看是不是翻新机)

  • 双v会员要钱吗(双v会员月费多少)

    双v会员要钱吗(双v会员月费多少)

  • 买错app怎么申请退款(app买错了怎么用手机退款)

    买错app怎么申请退款(app买错了怎么用手机退款)

  • oppo小爱同学怎么唤醒(oppo的小爱同学)

    oppo小爱同学怎么唤醒(oppo的小爱同学)

  • 苹果x绿屏闪烁怎么处理(苹果x绿屏闪烁后又好了)

    苹果x绿屏闪烁怎么处理(苹果x绿屏闪烁后又好了)

  • 抖音播放为0怎么解决(抖音播放0怎么回事)

    抖音播放为0怎么解决(抖音播放0怎么回事)

  • rfid属于物联网的哪个层(RFID属于物联网的( )层)

    rfid属于物联网的哪个层(RFID属于物联网的( )层)

  • 华为手环3pro可以接电话吗(华为手环3pro可以下载表盘么)

    华为手环3pro可以接电话吗(华为手环3pro可以下载表盘么)

  • 视频美颜怎么弄(华为手机微信视频美颜怎么弄)

    视频美颜怎么弄(华为手机微信视频美颜怎么弄)

  • 前端项目部署,阿里云服务器部署前端项目,超详细(前端项目部署到nginx)

    前端项目部署,阿里云服务器部署前端项目,超详细(前端项目部署到nginx)

  • Vue开发实例(11)之el-menu实现左侧菜单导航(vue实战开发项目视频)

    Vue开发实例(11)之el-menu实现左侧菜单导航(vue实战开发项目视频)

  • 所得税汇算申报完之后可以修改吗
  • 劳务报酬所得税可以退税吗
  • 不动产租赁服务属于现代服务吗
  • 做账一定要银行对账单吗
  • 邀请客户参加公司会议
  • 固定资产用于集体福利也算经营管理需要吗
  • 股票发行费用属于资本成本中的筹资费用
  • 收到电子退库如何操作
  • 小规模纳税人印花税减免税优惠政策
  • 辞退员工补偿金账务处理
  • 签订代销合同的人有没有退货权
  • 固定资产原价的结余额
  • 租赁的房子
  • 小规模开票数量怎么算
  • 公司购买的绿植普票怎么抵扣
  • 印花税申报完成后如何缴款
  • 小规模纳税人购进商品的会计分录
  • 汇算清缴后如何进行调帐处理
  • 增值税记账流程
  • 职工福利进项税可以抵扣吗
  • 软件项目成本包括直接成本和间接成本,一般而言
  • 销售应税消费品应交的消费税分录
  • 调整暂估有差价怎么办
  • 税收法定原则的意义
  • 工商局打印公司章程介绍信
  • 如何理解总分机的概念
  • 向客户发放,赠品怎么写
  • 普通股优先股后配股区别
  • 笔记本windows10截屏
  • 虚拟机怎么安装iso镜像文件
  • 会计管理制度范本
  • 促销礼物
  • win8.1怎么用
  • 什么电脑系统比较好
  • win10自带的清理对固态有影响吗
  • 生产企业结账流程
  • php经典教程
  • linux检测
  • 债券利息计算方法
  • 微信小程序解决跨域问题
  • 4个生活小常识简短
  • 哪种审计证据更可靠
  • 个人所得税减免政策2023
  • php调用其他php函数
  • win10系统安装配置
  • 手续费及佣金收入会计分录
  • 关于持股平台的法律法规
  • okhttp源码
  • 事业结余是事业单位当年全部收支相抵后的余额
  • 打车费计入哪个科目
  • 计算分配本月职工工资会计分录
  • 研发费用的会计处理方法
  • php.ini上传限制
  • 个体户怎么交医保社保
  • 小微企业报税是多久报一次
  • mysql数据库压力测试工具
  • 网络平台服务商
  • 期末库存商品结转分录
  • 公司员工垫付款项
  • 出口退税转免税怎么写个说明
  • 应付账款跟应收的区别
  • 营改增后被挂靠的企业如何做账?
  • 资本增值率计算公式是什么?
  • win10屏幕显示
  • freebsd怎么用
  • 怎样设置禁
  • windowsxp开机启动项在哪里设置
  • 口袋pe下载
  • winxp网络设置在哪
  • macbook pro右上角按键
  • 怎么关闭无服务状态
  • -f linux命令
  • windows7电脑无法正常运行
  • js移动到指定位置
  • jquery获取某个属性的值
  • 浙江税务app不能网上办税
  • 税控盘时间不对有影响吗
  • 小规模开票税金怎么算
  • 什么是企业融资,什么是政府融资
  • 土地整理费用由谁承担
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设