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算法,都是不进行跨层级比较,只做同级比较

不同点:

  1. vue会在patch函数中给被操作的节点打补丁(patchflag),在diff的时候更清晰

  2. vue对比节点,当节点元素类型相同,但是className不同时,认为是不同类型的元素,删除重新创建;而react则认为是同类型节点,进行修改操作

  3. diff策略,vue的性能优于react

4、vue组件的渲染和更新流程




完整流程图




评论

此博客中的热门博文

react底层原理

Git操作