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

  • iqoo8pro隐藏应用怎么打开(iqoo7应用隐藏)

    iqoo8pro隐藏应用怎么打开(iqoo7应用隐藏)

  • 苹果手机怎么拍舞台效果(苹果手机怎么拍水印照片)

    苹果手机怎么拍舞台效果(苹果手机怎么拍水印照片)

  • 手机解锁温控会怎么样(手机解除温控降频)

    手机解锁温控会怎么样(手机解除温控降频)

  • 华为p40都是5g手机吗(华为p40都是5g的吗)

    华为p40都是5g手机吗(华为p40都是5g的吗)

  • 华为p40pro有hifi音效吗(华为p40pro有必要换苹果13吗)

    华为p40pro有hifi音效吗(华为p40pro有必要换苹果13吗)

  • 钉钉直播开小窗会计算时间吗(钉钉直播开小窗算时间吗)

    钉钉直播开小窗会计算时间吗(钉钉直播开小窗算时间吗)

  • qq气泡怎么设置(QQ气泡怎么设置成圆的)

    qq气泡怎么设置(QQ气泡怎么设置成圆的)

  • 如何修改微信支付密码怎么修改(如何修改微信支付顺序)

    如何修改微信支付密码怎么修改(如何修改微信支付顺序)

  • 微信双方拉黑是不是都不存在了(微信双方拉黑是否头像双向更新)

    微信双方拉黑是不是都不存在了(微信双方拉黑是否头像双向更新)

  • 电脑波浪号怎么打(电脑上的波浪号怎么打出来快捷键)

    电脑波浪号怎么打(电脑上的波浪号怎么打出来快捷键)

  • 麒麟960什么水平(麒麟960cpu怎么样)

    麒麟960什么水平(麒麟960cpu怎么样)

  • nova系列代表什么(华为nova系列都是什么意思)

    nova系列代表什么(华为nova系列都是什么意思)

  • 美拍登录不了怎么办(美拍登录不了怎么注销以前的账号)

    美拍登录不了怎么办(美拍登录不了怎么注销以前的账号)

  • 苹果a2161是什么版本(苹果a2161是什么运营商)

    苹果a2161是什么版本(苹果a2161是什么运营商)

  • oppok5视频没有美颜吗(oppo手机视频没有美颜怎么办)

    oppok5视频没有美颜吗(oppo手机视频没有美颜怎么办)

  • 微信标签有什么用(微信标签批量管理)

    微信标签有什么用(微信标签批量管理)

  • 怎么开启微信视频美颜功能(怎么开启微信视频号的评论)

    怎么开启微信视频美颜功能(怎么开启微信视频号的评论)

  • 数据中心是指什么(数据中心是指什么意思)

    数据中心是指什么(数据中心是指什么意思)

  • 电脑怎么打开运行程序(电脑怎么打开运行管理器)

    电脑怎么打开运行程序(电脑怎么打开运行管理器)

  • 荣耀v20是什么马达(荣耀v20是什么机身)

    荣耀v20是什么马达(荣耀v20是什么机身)

  • word内容怎么调成一页(word内容怎么调整到一页纸)

    word内容怎么调成一页(word内容怎么调整到一页纸)

  • 如何免费地、完整地把PDF转换为Word(免费地图有哪些)

    如何免费地、完整地把PDF转换为Word(免费地图有哪些)

  • 运营商用户认证失败(运营商用户认证失败passwd err)

    运营商用户认证失败(运营商用户认证失败passwd err)

  • 微信已停止访问该网页(微信已停止访问该网页怎么知道网址)

    微信已停止访问该网页(微信已停止访问该网页怎么知道网址)

  • documents怎么去水印(docx如何去水印)

    documents怎么去水印(docx如何去水印)

  • Win10 2009专业版使用网络适配器重置修复Wi-Fi(win10专业版版本号2009)

    Win10 2009专业版使用网络适配器重置修复Wi-Fi(win10专业版版本号2009)

  • vue中Echarts使用动态数据的两种实现方式(vuejs echarts)

    vue中Echarts使用动态数据的两种实现方式(vuejs echarts)

  • 小规模拍卖公司佣金怎么交税
  • 不得税前扣除的贷款利息
  • 以房抵债如何计算契税?
  • 应交所得税的计算公式
  • 建筑业普票和专票的比例
  • 销项税额是开票金额么
  • 食用油交不交消费税
  • 报销单的经办人写自己吗
  • 固定资产分期付款会计处理
  • 核定企业的征收方式
  • 典当行借贷属于民间借贷吗
  • 员工在社保局报备流程
  • 资产已报废折旧怎么计算
  • 投标保证金支付时间
  • 永续债的利息会计处理
  • 出口当月开票当月申报吗
  • 税务局拍卖资产
  • 税控盘全额抵扣分录
  • 固定资产的残值怎么算出来的
  • 坏账核销后又收回的,增加坏账准备,并转入当期损益
  • mac 的系统
  • 为什么可供出售的金融资产是非流动资产
  • 跨年度增值税发票作废怎么退税
  • 公司收到拆迁补偿款要交税吗
  • 不起眼的暴利小生意农村
  • 冲销以前年度多计提的工资资产负债表怎么平
  • PHP:oci_field_size()的用法_Oracle函数
  • puppetm
  • win10任务栏隐藏正在运行的程序
  • 临时用工怎样做账
  • microsoftedge怎么转换成ie
  • 企业财务人员如何防范电信诈骗
  • 内斯塔特点
  • php redis操作
  • 注册公司时的注册资金
  • 汇算清缴应补税额为负数
  • yolo4损失函数
  • 麻雀优化算法和鲸鱼算法哪个好
  • df -th命令
  • php clob
  • 企业所得税汇算清缴时间
  • 红字信息表开错了怎么撤销
  • 增值税申报销项发票采集少了怎么办
  • 最好用的刷题笔
  • 高温费收税吗
  • 所得税预缴申报表资产总额怎么填
  • 围挡属于市政还是建筑
  • 公司帮员工买的意外险钱是打到公司还是员工账号
  • 政府补助属于不征税金吗
  • 库存商品余额在借方是什么意思
  • 珠宝行业的会计
  • 外汇收入需要缴纳增值税吗
  • 跨区域缴纳个税相关规定
  • 应交税费的进项和销项是什么意思
  • 以物易物有什么好处
  • 外购的商品用于生产
  • 收到不是股东的现金
  • sql中的递归
  • mysql连接是什么协议
  • window所有程序在哪里
  • Win10系统开机出现问题pin码不可用
  • windows使用linux软件
  • crossfire.exe是什么
  • linux系统怎么共享
  • runservice.exe - runservice是什么进程 有什么用
  • win10怎么显示磁盘已用空间
  • win8怎么没有无线网图标不见了
  • wind移动版
  • windows7鼠标设置在哪里
  • cocos2d rpg
  • Unity3D游戏开发标准教程
  • javascript中常见的数据类型有哪些?
  • unity里面如何删除一个项目
  • jQuery扩展实现text提示还能输入多少字节的方法
  • nodejs 调用命令行
  • node搭建博客
  • bootstrap js插件
  • 云税票管家是什么软件
  • 漯河经济开发区税务局电话
  • 北京税务局网上办税服务厅
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设