You don't have javascript enabled. Good luck! :(

欢迎页

Welcome to Ganace's Blog


欢迎您来到Ganace 的个人博客。

在茫茫互联网的海洋里能够遇见,实在是一份不小的幸运。

诚挚地向您问候一声:您好,朋友!

这里是属于Ganace个人的隐秘小空间,记录了工作学习中遇到的知识点与灵感,以及生活中的碎碎念与吐槽突如其来的中二病尬尬的文艺时间锻炼腹肌的时刻惊喜的小发现等等。

想要在自己的平淡无奇的人生长河中留下些什么,

或者只是为了拯救老人家岌岌可危的记忆力,

仅此而已。

来到此地,分享与你。

也期待与您的再次相遇!

Share with Me


有任何的分享或者建议与吐槽,都可以Email我:ganace@foxmail.com

欢迎您的来信!

【Vue】Vue2与Vue3的区别总结(二) Diff算法/响应式原理

  Mar 22, 2024     Ganace     Front-end-Foundation

Vue

Vue3 作为当前 Vue 的项目大势,开发当中需要注意区分 Vue2 与 Vue3 的区别以便切换新旧项目时可以流畅工作。记录一下 Vue2 与 Vue3 的区别总结笔记,温故知新。

Diff 算法 | 响应式原理

Diff 算法

一、Vue2 diff 算法

遍历每个虚拟节点,返回对比的 patch 对象

用 patch 更新 DOM 消耗性能,有不参与更新的元素

二、Vue3 diff 算法

初始化时给每个虚拟节点添加 patchFlags ,只比较 patchFlags 发生变化的节点,进行视图更新。

patchFlags 没有变化的元素作静态标记,渲染时直接复用

响应式原理

一、Vue2 Object.defineProperty()

实现原理

对象类型:

通过 Object.defineProperty()对属性的读取、修改进行拦截(数据劫持)。

数组类型:

通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)。

Object.defineProperty(data, "count", {
    get() {},
    set() {},
});

存在问题

新增属性、删除属性, 界面不会更新。

直接通过下标修改数组, 界面不会自动更新。

解决方案

使用 Vue.setVue.delete 或者 vm.$setvm.$delete 这些 API

数组:push()pop()shift()unshift()splice()sort()reverse()

二、Vue3 Proxy()

实现原理

通过 Proxy(代理)

拦截对象中任意属性的变化, 包括:属性值的读写、属性的添加、属性的删除等。

通过Reflect(反射)

对源对象的属性进行操作。 get set deleteProperty Proxy 对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。