位置: 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图片不存在的解决办法(图片加载不存在)

  • 华为无法获取内容怎么办(华为无法获取内存信息)

    华为无法获取内容怎么办(华为无法获取内存信息)

  • 苹果手机怎么投屏华为电视智慧屏(苹果手机怎么投屏到电视上去)

    苹果手机怎么投屏华为电视智慧屏(苹果手机怎么投屏到电视上去)

  • 快手赞取消了动态还显示吗(快手赞了取消了对方还看得见吗)

    快手赞取消了动态还显示吗(快手赞了取消了对方还看得见吗)

  • oppo findx2有无线充电功能吗(oppofindx2有无线充电吗)

    oppo findx2有无线充电功能吗(oppofindx2有无线充电吗)

  • 小程序商家不退款(小程序商家不退款,能自动退吗)

    小程序商家不退款(小程序商家不退款,能自动退吗)

  • 戴蓝牙耳机打电话对哪里说话(戴蓝牙耳机打电话)

    戴蓝牙耳机打电话对哪里说话(戴蓝牙耳机打电话)

  • jeet蓝牙耳机怎么配对(JEET蓝牙耳机怎么连接华为手机)

    jeet蓝牙耳机怎么配对(JEET蓝牙耳机怎么连接华为手机)

  • 超清和高清区别大吗(超清和高清哪个更清晰一些)

    超清和高清区别大吗(超清和高清哪个更清晰一些)

  • 手机录屏是干什么用的(手机录屏是干嘛的)

    手机录屏是干什么用的(手机录屏是干嘛的)

  • 手机卡突然没信号无服务不能用了怎么办(手机卡突然没信号无服务怎么恢复)

    手机卡突然没信号无服务不能用了怎么办(手机卡突然没信号无服务怎么恢复)

  • 华为watchgt2和荣耀magicwatch2区别(华为watchgt2和荣耀gspro的区别)

    华为watchgt2和荣耀magicwatch2区别(华为watchgt2和荣耀gspro的区别)

  • 激活锁是什么(激活锁是什么玩意儿)

    激活锁是什么(激活锁是什么玩意儿)

  • linux是多用户多任务操作系统吗(linux是多用户吗)

    linux是多用户多任务操作系统吗(linux是多用户吗)

  • 网络信号hd是什么意思(网络信号上出现hd是什么意思啊)

    网络信号hd是什么意思(网络信号上出现hd是什么意思啊)

  • 华为gt2可单独打电话吗(华为gt2可以独立打电话吗)

    华为gt2可单独打电话吗(华为gt2可以独立打电话吗)

  • 小米5s什么时候上市的(小米5s 上市时间)

    小米5s什么时候上市的(小米5s 上市时间)

  • 苹果11官方标配有耳机吗(苹果11官方标配和套餐一的区别是什么)

    苹果11官方标配有耳机吗(苹果11官方标配和套餐一的区别是什么)

  • 卡贴机不能打电话(卡贴机不能打电话能上网发短信是怎么回事)

    卡贴机不能打电话(卡贴机不能打电话能上网发短信是怎么回事)

  • 手机qq怎么新建分组(手机qq怎么新建文件夹发给好友)

    手机qq怎么新建分组(手机qq怎么新建文件夹发给好友)

  • 畅享10s什么时候上市(畅享10s什么时候出厂)

    畅享10s什么时候上市(畅享10s什么时候出厂)

  • 拼多多不退款怎样投诉(拼多多不退款怎么申请客服强制介入)

    拼多多不退款怎样投诉(拼多多不退款怎么申请客服强制介入)

  • 图片合成器怎么使用(图片合成器怎么拼图)

    图片合成器怎么使用(图片合成器怎么拼图)

  • 为什么Windows 7搜索到无线信号连不上?(为什么Windows 7搜不到网)

    为什么Windows 7搜索到无线信号连不上?(为什么Windows 7搜不到网)

  • python进程池的使用注意(进程 python)

    python进程池的使用注意(进程 python)

  • 销售额是含税价还是不含税价
  • 其他应收款重分类
  • 公司租用私人汽车违法吗
  • 政府单位临聘人员辞退
  • 印花税是不是必须要交
  • 甲方代付材料费合法吗
  • 当期处置子公司,当期还纳入合报范围嘛
  • 企业所得税查增值税吗
  • 税收制度具体内容
  • 转移性支出包括上解上级支出
  • 其他应付款转入营业外收入
  • 上年的应收帐款在本年度如何录入?
  • 招待住宿费计入什么科目
  • 免税商品销售要缴税吗
  • 发票勾选没有确认怎么办
  • 幼儿园开学费发票内容
  • 开办期间的税控设备怎么入账?
  • 机动车销售发票如何补开?
  • 发票已认证未抵扣怎么办
  • 企业汇算清缴弥补以前年度亏损后还需退税
  • 租房修缮费扣除
  • 物业费分摊会计分录
  • 固定资产抵扣的税率
  • 企业筹建期发生的广告宣传费怎么抵减所得税
  • 保证金计入哪个会计科目
  • 企业所得税调增调减项目有哪些
  • 超市购销和联营有什么区别
  • 工程什么情况下可以索赔
  • 废品损失涉及的税种
  • 在国内和国外
  • 上年度的费用今年怎么算
  • npm sill idealTree buildDeps 安装踩坑指南(详细版)
  • 自己怎么做电脑系统
  • php中this的用法
  • 递延所得税资产是什么意思
  • PHP:ftp_nb_continue()的用法_FTP函数
  • 什么是坏账,坏账的核算方法有哪些
  • php新手入门
  • 期间费用的会计科目
  • 月末结转本年利润怎么算
  • 国家纪念品
  • 金蝶 账无忧 使用说明
  • 购买方未抵扣,销售方申请红字
  • 增值税专用发票丢了怎么补救
  • 小微企业开通社保
  • 命令行 压缩
  • jetbrainsnews
  • 资产减值损失如何确定
  • 税控盘技术维护费计入什么科目
  • 累计预扣法计算并预扣预缴税款
  • 支付国外佣金的税率多少
  • 基金管理公司是什么意思
  • 商业企业购入商品
  • 公司租赁的车辆发生的费用都可以报销吗?
  • 差旅费所得税扣除标准2023
  • 质量问题的扣款计入什么科目
  • 收到电费发票做账怎么做
  • 赞助支出为什么纳税调整
  • 不开票收入怎么报税
  • 对于银行已入账企业未入账的未达账项应该
  • 年终返利销售政策范本
  • 印花税申报流程视频
  • 财产裁定书
  • 班车租赁服务
  • mysql数据库中文
  • w10专业版最新版本
  • win7系统怎样设置
  • win10系统免费升级
  • 常用原生js兼容软件
  • javascript基础笔记
  • 变量js
  • ztree getnodebytid
  • Windows上安装Python
  • shell脚本自动化
  • 如何查看驱动器
  • javascript图片
  • Javascript字符串对象函数
  • js object的原型
  • androidobb
  • 杨静儿多少岁
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设