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

  • boss直聘可以同时几个人登录

    boss直聘可以同时几个人登录

  • oppo手机来电播报姓名怎么设置(oppo手机来电播报电话号码怎么取消)

    oppo手机来电播报姓名怎么设置(oppo手机来电播报电话号码怎么取消)

  • 华为freebuds3怎么配对(华为freebuds3怎么查找位置)

    华为freebuds3怎么配对(华为freebuds3怎么查找位置)

  • 电脑没声音是怎么回事(电脑没声音是怎么一回事)

    电脑没声音是怎么回事(电脑没声音是怎么一回事)

  • 苹果11省电模式怎么关闭(苹果11省电模式和正常模式有什么区别)

    苹果11省电模式怎么关闭(苹果11省电模式和正常模式有什么区别)

  • 笔记本除法符号在哪里(笔记本除法符号怎么打)

    笔记本除法符号在哪里(笔记本除法符号怎么打)

  • 更新数据库的查询称为(更新数据库的查询命令)

    更新数据库的查询称为(更新数据库的查询命令)

  • 苹果手机看抖音发烫(苹果手机看抖音模糊是什么原因)

    苹果手机看抖音发烫(苹果手机看抖音模糊是什么原因)

  • 三星手机出现蓝屏英文要怎么处理(三星手机出现蓝线滑动)

    三星手机出现蓝屏英文要怎么处理(三星手机出现蓝线滑动)

  • 家里要不要装无线ap

    家里要不要装无线ap

  • wps页眉横线怎么设置粗细(wps页眉横线怎么设置磅数)

    wps页眉横线怎么设置粗细(wps页眉横线怎么设置磅数)

  • 抖音消息免打扰对方知道吗(抖音消息免打扰怎么设置)

    抖音消息免打扰对方知道吗(抖音消息免打扰怎么设置)

  • 微信读书无限卡为什么有的书看不了(微信读书无限卡兑换付费无限卡)

    微信读书无限卡为什么有的书看不了(微信读书无限卡兑换付费无限卡)

  • 屏幕中间一行无法触控(屏幕 中间一行 自动 乱点)

    屏幕中间一行无法触控(屏幕 中间一行 自动 乱点)

  • 快手注销成功会显示什么(快手注销是不是会马上消失)

    快手注销成功会显示什么(快手注销是不是会马上消失)

  • 淘宝退货时间一般多久(淘宝退货时间一般多长)

    淘宝退货时间一般多久(淘宝退货时间一般多长)

  • ipad2018可以连接鼠标吗(ipad能连接ipod吗)

    ipad2018可以连接鼠标吗(ipad能连接ipod吗)

  • 为什么快手无法连接网络(为什么快手无法观看本场直播)

    为什么快手无法连接网络(为什么快手无法观看本场直播)

  • 谷歌是哪个国家开发的(谷歌是哪个国家的公司总部在哪里)

    谷歌是哪个国家开发的(谷歌是哪个国家的公司总部在哪里)

  • 美团账单怎么删除(美团怎么删除账单)

    美团账单怎么删除(美团怎么删除账单)

  • 苹果x呼吸灯怎么设置颜色(iphone x 呼吸灯)

    苹果x呼吸灯怎么设置颜色(iphone x 呼吸灯)

  • wegam连接服务器失败(连接wwz服务器失败)

    wegam连接服务器失败(连接wwz服务器失败)

  • 虾米音乐怎么下载歌词(虾米音乐怎么下载歌曲)

    虾米音乐怎么下载歌词(虾米音乐怎么下载歌曲)

  • 什么是网站?-知乎(什么是网站域名)

    什么是网站?-知乎(什么是网站域名)

  • 微信如何设置超长名字(微信如何设置超长备注名)

    微信如何设置超长名字(微信如何设置超长备注名)

  • 快手小店怎么赚佣金(快手小店怎么赚佣金挂链接)

    快手小店怎么赚佣金(快手小店怎么赚佣金挂链接)

  • 手机怎么查看图片大小(手机怎么查看图片的exif信息)

    手机怎么查看图片大小(手机怎么查看图片的exif信息)

  • 触漫怎么发到快手上(触漫怎么发到快手上而且是自己翻的)

    触漫怎么发到快手上(触漫怎么发到快手上而且是自己翻的)

  •  oppo手机主页面时间怎么调出来(oppo手机主页面字体怎么调大)

    oppo手机主页面时间怎么调出来(oppo手机主页面字体怎么调大)

  • 微信可以查历史头像吗(微信可以查历史头像吗怎么查)

    微信可以查历史头像吗(微信可以查历史头像吗怎么查)

  • 企业中秋晚会活动方案
  • 超率累进税率有哪些税种呢怎么算
  • 制单会计岗位实验报告
  • 工会经费的会计核算方法
  • 增值税票购买份数满了怎么办
  • 上年结转未抵扣
  • 普通发票金额和申报工资有关系吗
  • 母公司及子公司借款要利息吗
  • 生鲜配送公司财务制度
  • 工资3700扣多少社保钱
  • 去年的进项发票今年还能抵扣吗
  • 为职工提供免费午餐
  • 工程承建方给予的工期奖励如何做账?
  • 一次性伤残就业赔偿标准
  • 预付水电费后应怎么做账
  • 在建工程预付款项记入什么会计科目
  • 电商一般纳税人如何报税
  • 食用盐适用的增值税税率
  • 税务师几年内考完几门
  • 在建工程印花税计税依据
  • 年终奖需要计入工资交社保吗
  • 主营业务收入明细账图片
  • 银行授信额度如何分配
  • 费用摊销的常用方法有哪些
  • win7电脑加入域
  • 固定资产进项税额怎么做账
  • 收到负数发票怎么办
  • 消费税组成计税价格公式推导
  • 公司装修款怎么做分录
  • PHP:oci_field_scale()的用法_Oracle函数
  • PHP:pg_unescape_bytea()的用法_PostgreSQL函数
  • 其他业务收入与营业外收入
  • 新建vue项目
  • php chr函数
  • 生产成本二级科目会计分录
  • 小规模纳税人收入会计分录
  • b站怎么进抖音模式
  • javaweb项目简介
  • ChatGPT可以做什么
  • 房地产企业出售房产增值税
  • 企业资产损失税前扣除管理办法最新
  • 独立核算的分公司注销时账面怎么处理
  • 增值税普通发票可以抵扣吗
  • 分公司能给总公司担保吗
  • 收到借款利息收入的会计分录怎么做账
  • 用于研发的材料后期销售了应该怎么账务处理
  • php获取参数值的三种方式
  • 零申报社保是否可以报销
  • sqlserver数据库和mysql区别
  • 使用XQuery查询DB2 XML数据
  • sql server 内存管理
  • 申报工资金额
  • 未使用的机器设备有没有实体性贬值
  • 样机 研发费用归集与核算
  • 招待费如何做账科目
  • 电话费可以自动扣银行钱吗
  • 除了增值税专用发票,还有什么发票可抵扣
  • linux文件与目录
  • centos 网络监控
  • win8系统 Cisco VPN 442错误怎么办?解决方法介绍
  • 怎样把系统及软件迁移到固态
  • 一开机弹出个微软重新设定
  • windows7旗舰版怎么打字
  • win10 edge浏览器怎样添加信任站点
  • linux查看使用率命令
  • jquery教程
  • ubuntu搭建android开发环境
  • jquery图片轮播无缝连接
  • node做爬虫
  • unity协程的工作原理
  • 基础的重要性
  • androidstudio性能检测工具
  • 千元版的发票
  • 对税务工作者的赞美
  • 处级工作调动用什么手续
  • 行政服务事项包含哪些
  • 杭州国税咨询电话
  • 怎样在开票系统中增加新的名称
  • 2o21年公租房
  • 福建莆田社保局在哪里
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设