关于Vue3
话说,Vue3已经进行到rc4版本了,4月份beta发布的时候前端圈红红火火,不知道大家开始学了没
整理了一些资源,现在开始学习应该还不算晚[狗头]
- vue-next仓库
- 20200723 Vue3 官方发布的beta文档
- Vue3 Roadmap & FAQ
- Vue3仓库已经合并的780多个PR
- 尤大在Vue Mastery的Vue3课:Vue 3 Deep Dive with Evan You
- 202007 尤大在前端会客厅节目关于Vue3的访谈
- 202005 The process: Making Vue 3
- 202004 尤大 - 聊聊 Vue.js 3.0 Beta 官方直播
- 2018 VueConf 杭州 尤大关于Vue3的演讲视频
vue2 响应式原理回顾
- 对象响应化:遍历每个key,通过
Object.definePropertyAPI定义getter,setter
1 | // 伪代码 |
- 数组响应化:覆盖数组的原型方法,增加通知变更的逻辑
1 | // 伪代码 |
vue2响应式痛点
- 递归,消耗大
- 新增/删除属性,需要额外实现单独的API
- 数组,需要额外实现
- Map Set Class等数据类型,无法响应式
- 修改语法有限制
vue3响应式方案
使用ES6的 Proxy 进行数据响应化,解决上述Vue2所有痛点
Proxy可以在目标对象上加一层拦截/代理,外界对目标对象的操作,都会经过这层拦截
相比 Object.defineProperty ,Proxy支持的对象操作十分全面:get、set、has、deleteProperty、ownKeys、defineProperty……等等
1 | // reactive 伪代码 |
响应式原理

- 通过
effect声明依赖响应式数据的函数cb ( 例如视图渲染函数render函数),并执行cb函数,执行过程中,会触发响应式数据getter - 在响应式数据
getter中进行track依赖收集:建立 数据&cb 的映射关系存储于targetMap - 当变更响应式数据时,触发
trigger,根据targetMap找到关联的cb执行 - 映射关系
targetMap结构:
1 | targetMap: WeakMap{ |
手写vue3响应式
大致结构
1 | // mini-vue3.js |
reactive
1 | /* 建立响应式数据 */ |
effect
1 | /* 声明响应函数cb */ |
track
1 | /* 依赖收集:建立 数据&cb 映射关系 */ |
trigger
1 | /* 触发更新:根据映射关系,执行cb */ |
测试demo
1 | <!-- test.html --> |
效果:

如果想获取上述代码,放在了这个仓库:mini-vue3-reactive
