vue响应式原理

介绍

什么是数据响应式?
我们只需要关注数据本身,当数据变化的时候,视图也会随之更新

vue2.x

vue2.x实现响应式的核心是使用Object.defineProperty,因为该方法只能处理属性,所以需要遍历vue实例的所有属性,并通过这个方法将这些属性转化为getter/setter,这里相当于拦截器的作用,无论是访问实例的属性还是设置其属性,都要先通过getter/setter。具体在setter方法中,其实还是操作了DOM,然后才能更新视图

官网中也说到了“Object.defineProperty 是 ES5 中一个无法 shim 的特性,这也就是 Vue 不支持 IE8 以及更低版本浏览器的原因。”

具体讲vue2.x响应式原理的核心就是利用object.defineProperty()为vue实例中data的每一个属性添加getter、setter方法,基于观察者模式,当数据发生变化的时候,更新视图

观察者模式就是一个dep类,负责添加观察者,发布通知;另一个是watcher类,负责更新视图。每当获取属性使用getter的时候,就添加观察者;当设置属性用setter的时候,就发布通知,调用观察者的update方法更新视图

创建dep类的实例为每一个data中的属性,在compliler类(用来解析指令和差值表达式)中,为每一个渲染模板的函数添加watcher实例。这样只要数据发生变化,那与这个数据相关的视图都会得到更新

vue3

vue3的响应式是通过proxy完成,Proxy直接监听对象,而非属性,所以将多个属性转换成getter/setter的时候,不需要使用循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值