码迷,mamicode.com
首页 > 其他好文 > 详细

vue响应式原理的实现

时间:2020-02-05 13:21:57      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:不能   获取   new   alert   set   数据   遍历   efi   OLE   

响应式实现的原理---如何监控数据的变化:两种方法

Vue 2.x defineProperty(es5)

Vue 3.x Proxy(es6)
语法:Object.defineProperty(参数1,参数2,参数3)
参数1:目标对象
参数2:需要修改或者添加的属性名
参数3:目标对象属性的一些特征(是一个对象)

其中参数3中也有一些参数:
参数1:value:属性值
参数2:writable:对象属性值是否可被修改,true表示允许,false表示不允许
参数3:configurable:对象属性是否可被删除,true为允许,false为不允许
参数4:enumerable:对象属性是否可被枚举(即遍历)
参数5:get():给一个属性提供getter方法,当访问这个对象的属性值时触发该方法
参数6:set():给一个属性提供setter方法,当设置这个对象的属性值时触发该方法

这种方式通过下标更改对象属性,或者直接改变数组长度等,就不能检查到是否更改了属性

var obj = {a:1}
object.defineProperty(obj,"wa",{value : 5 })
?var?obj?=?{
????????a:?1
????}
????Object.defineProperty(obj,?'wa',?{
            //添加一个新属性wa,当检测到wa的值改变时,触发set()函数,这时在set()函数中给obj的就旧属性a重新赋值
????????set(value)?{
????????????obj.a?=?value;
????????}
????})
????obj.wa?=?123;
????console.log(obj.a);

可以通过es6的代理(Proxy)来监测,可以对数据改变和数据截取做劫持
Proxy的作用

对于代理模式 Proxy 的作用主要体现在三个方面:
1、 拦截和监视外部对对象的访问
2、 降低函数或类的复杂度
3、 在复杂操作前对操作进行校验或对所需资源进行管理

var?obj?=?{
????????a:?1
????}
????var?pa?=?new?Proxy(obj,?{
????????set(target,?property,?value)?{
????????????console.log(target,?property,?value)
????????????target[property]?=?value;
????????},?get(target,?property)?{
????????????alert("获取到了obj的a值")
????????????return?target[property];
????????}
????})
????pa.a?=?12345

//pa代理了obj 也就是pa拦截了目标对象obj的访问。所有访问obj属性的操作都被get()函数拦截,
所有设置属性都被set()函数拦截,所以,handle就是一个拦截处理函数,必须使用pa(代理对象)代理才能生效,
????console.log(pa.a);
代理的作用就是拦截监控外部对对象的访问

vue响应式原理的实现

标签:不能   获取   new   alert   set   数据   遍历   efi   OLE   

原文地址:https://www.cnblogs.com/lyly96720/p/12263136.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!