vue原理
1、mvvm
M:模型Model --->也就是data中的数据
V:视图View --->也就是dom
VM:视图模型ViewModel --->也就是Vue实例(vm)
2、vue响应式原理
核心api object.defineProperty
vue响应式也叫作数据双向绑定,大致原理阐述:
首先我们需要通过Object.defineProperty()方法把数据(data)设置为getter和setter的访问形式,这样我们就可以在数据被修改时在setter方法设置监视修改页面信息,也就是说每当数据被修改,就会触发对应的set方法,然后我们可以在set方法中去调用操作dom的方法。
此外,如果页面有input用v-model绑定数据,我们需要在这种绑定了data的input元素上添加监听,添加input事件监听,每当input事件被触发时,就修改对应的data
原文链接:https://blog.csdn.net/weixin_48181168/article/details/120158346
vue3启用proxy
https://blog.csdn.net/pagnzong/article/details/120389514
代码
proxy和object.defineProperty响应式的对比
vue2响应式的缺点:
检测不到对象属性的添加和删除 (需要使用vue.set, vue.delete)
数组
API
方法无法监听到 (需要特殊处理)深度监听需要递归到底,造成性能问题
proxy解决的问题
克服了vue2响应式的问题
缺点:没有兼容ie等其他浏览器,无法实现polyfill
3、diff算法
当数据发生改变时,订阅者
watcher
就会调用patch
给真实的DOM
打补丁通过
isSameVnode
进行判断,相同则调用patchVnode
方法patchVnode
做了以下操作:
找到对应的真实
dom
,称为el
如果都有都有文本节点且不相等,将
el
文本节点设置为Vnode
的文本节点如果
oldVnode
有子节点而VNode
没有,则删除el
子节点如果
oldVnode
没有子节点而VNode
有,则将VNode
的子节点真实化后添加到el
如果两者都有子节点,则执行
updateChildren
函数比较子节点
updateChildren
主要做了以下操作:
设置新旧
VNode
的头尾指针新旧头尾指针进行比较,循环向中间靠拢,根据情况调用
patchVnode
进行patch
重复流程、调用createElem
创建一个新节点,从哈希表寻找key
一致的VNode
节点再分情况操作
相同点: Vue和react的diff算法,都是不进行跨层级比较,只做同级比较
不同点:
vue会在patch函数中给被操作的节点打补丁(patchflag),在diff的时候更清晰
vue对比节点,当节点元素类型相同,但是className不同时,认为是不同类型的元素,删除重新创建;而react则认为是同类型节点,进行修改操作
diff策略,vue的性能优于react
评论
发表评论