回顾下前几章的内容,在前几章中主要讲述了以下内容。

  1. 新构建工具 vite 的原理和从零开始实现
  2. vue3 使用新姿势
  3. 新api:reactive 使用和源码解析
  4. 追踪收集 track 实现和源码解析
  5. 追踪触发器 trigger 实现和源码解析
  6. 响应式核心 effect 与 track、trigger 工作原理和源码解析

好的,这章的目标:从零开始完成一个 Vue3 !

必须要知道的前置知识 effect 与 track、trigger 工作原理,具体详情请看公众号 -> 前端进阶课,一个有温度且没有广告的前端技术公众号。

在这里还是简单解析下这3个函数的作用吧

  1. track: 收集依赖,存入 targetMap
  2. trigger:触发依赖,使用 targetMap
  3. effect:副作用处理

本章源码请看 uuz 急需 star 维持生计。

手摸手实现 Vue3

首先。我们2个全局变量,用来存放和定位追踪的依赖,也就是给 track 和 trigger 使用的仓库。

let targetMap = new WeakMap();
let activeEffect;

所以第一个需要设计的方法就是 track,还记得该track在vue3是如何调用的吗?

track(obj, 'get', 'x');

track 会去找 obj.x 是否被追踪,如果没找到就将obj.x放入targetMap(完成追踪任务),将 obj.x 作为 map 的 key 将 activeEffect 作为 map 的 value。

抛开取值异常处理之类的,track 只做了一件事,将activeEffect塞入targetMap;

然后就是写一个 trigger,还记得trigger在vue是如何调用的吗?

trigger(obj, 'set', 'x')

trigger 只会去 targetMap 中寻找obj.x的追踪任务,如果找到了就去重,然后执行任务。

也就是说:抛开取值异常相关,trigger 也只做了一件事:从 targetMap 取值然后调用该函数值。

最后就是 effect,还记得该打工仔的api在vue3中是如何调用的吗?

effect 接收一个回调函数,然后会被送给 track。所以我们可以这么完成 effect

  1. 定义一个内部函数 _effect,并执行。
  2. 返回一个闭包

而内部 _effect 也做了两件事

  1. 将自身赋值给 activeEffect
  2. 执行 effect 回调函数

优秀的代码呼之欲出。

所有的前置项都完成了,现在开始完成一个 reactive,也就是对象式响应式的api。还记得vue3中如何使用 reactive 吗?

通过上面的的优秀代码,很轻易的实现了vue3的响应式操作。通过回顾前几章的内容,我们知道 reactive 是通过 Proxy 代理数据实现的。

这样我们就可以通过 Proxy 来调用 track 和 trigger,劫持 getter 和 setter 完成响应式设计

好了。一切就绪,那么我们挂载下我们的 fake vue3 吧

用 self-vue3 写一个 demo

测试一下。参照 vue3 的写法。定义个 setup 和 render

执行一下,果然是优秀的代码。响应式正常执行,每次 setInterval 执行后,页面都重写刷新了 count.num 的数据。

源码请看 uuz,ps:7月23日该源码已经支持 jsx 了。

以上通过 50+行代码,轻轻松松的实现了 vue3的响应式。但这就结束了吗?

还有以下问题

  1. Proxy 一定需要传入对象
  2. render 函数 和 h 函数并正确(Vue3的h函数现在是2个不是以前的createElement了)
  3. 虚拟 dom 的递归
  4. 别再说了- -!,我不听。

ref

使用 reactive 会有一个缺点,那就是,Proxy 只能代理对象,但不能代理基础类型。

如果你调用这段代码 new Proxy(0, {}),浏览器会反馈你 Uncaught TypeError: Cannot create proxy with a non-object as target or handler

所以,对于基础类型的代理。我们需要一个新的方式,而在 vue3 中,对于基础类型的新 api 是 ref

总结:

  1. reactive 的核心是 track + trigger + Proxy
  2. ref 是通过对象自有的 getter 和 setter 配合 track + trigger 实现的
  3. computed 其实是一个在 effect 基础上的改进

下章内容:vue3 该怎么结合 jsx

vue3:我来吹牛皮相关推荐

  1. ubuntu16.04安装cajviewer(亲测有效)

    可以在Ubuntu下看知网下下来的文献了,虽然可能用不多,还是很开心的啦~ 参考: 查看全文 http://www.taodudu.cc/news/show-5040303.html 相关文章: CA ...

  2. 【Vue】新建一个Vue3项目

    目录 1.新建vue项目 2.路径更改至新建的vue项目处 3.安装cnpm 4.cnpm安装vant3 5.安装babel-plugin 6.安装vue路由 7.安装axios 其他注意事项 仅用于 ...

  3. vue 后台返回的文件流进行预览_基于 Vue3+Ts 后台前端管理系统Vue3-Admin

    今天再给大家分享一款超不错的Vue中后台管理系统Vue3Admin. vue3-admin 基于VueCli4+Ts+ElementUI构建的后台系统.采用组件化开发模式及Flex布局,支持移动端适配 ...

  4. vue3.0环境搭建

    安装最新版nodejs Node.jshttps://nodejs.org/zh-cn/安装过程非常傻瓜,一直下一步到完成 -------------------------------------- ...

  5. 如何优雅的在 vue 中使用 非响应式对象_一篇文章上手Vue3中新增的API

    1. 初始化项目 // ① npm i -g @vue/cli // ② vue create my-project // ③ npm install @vue/composition-api -S/ ...

  6. VUE3.0 二. vue-cli3 配置指南

    VUE3.0 二. vue-cli3配置指南 一.vue.config.js 详解 官网地址: https://cli.vuejs.org/zh/config/ 使用vue3 的时候需要添加一个vue ...

  7. VUE3.0 一.安装node.js、vue3.0脚手架

    VUE3.0 一.安装node.js.vue3.0脚手架 1.安装nodejs 首先去官网下载nodejs 查看npm和node版本,出现版本号即安装成功. npm -v # 6.13.4node - ...

  8. 从Proxy到Vue3数据绑定

    导言: 本菜鸡在Vue2没多久,结果就Vue3发布了.赶紧学习和体验了一番Vue3,发现和Vue2有较大不同.其中最让我印象深刻的是他们有一个叫ref和reactive的用来绑定和更新数据.然后再略微 ...

  9. vue 组件以字符串插入_今日分享:vue3多层嵌套组件如何访问到最外层组件的数据?...

    我们都知道在vue中父组件向子组件传参需要在组件使用的位置使用属性绑定的方式,然后在子组件中通过props接收父组件中传递过来的数据,如果涉及到多层组件嵌套我们需要涉及到好多次属性绑定和好多次prop ...

最新文章

  1. 拥有全球最大指令集的“意念打字“系统,创下世界纪录
  2. Django使用心得(二)
  3. Go + Excel 学习 Excelize rows.go
  4. AngularJs ng-route路由详解
  5. c++无锁链表的实现
  6. abaqus pythonreader_【技术邻】Abaqus里应用Python的一些技巧
  7. x264 struct 学习
  8. Java SecurityManager checkDelete()方法与示例
  9. 冷热水龙头_冷热水龙头结构图是怎么样的
  10. java解析xml串标签_Java反射解析XML字符串并封装到指定的JavaBean
  11. Spring Boot整合MyBatis连接Oracle数据库
  12. 游戏服务器信息未初始化,游戏服务器初始化
  13. lt;九度 OJgt;题目1545:奇怪的连通图
  14. C# 如何遍历删除某个控件上的所有子控件
  15. 大话企业IT安全解决方案
  16. 唯美的英文短文!!!
  17. 天线学习笔记——串馈网络设计
  18. 三相异步电机基于模型的效率估计算法
  19. AGS量化自动炒币机器人与同类软件对比
  20. restful什么意思_RESTful的真正含义是什么?

热门文章

  1. el-table入门学习
  2. DaZeng:3分钟搞定内网渗透之外网访问指定域名
  3. c 语言运行库组件下载地址,VC++运行库一键安装
  4. python3 学习(2):在网站地图爬虫时的cannot use a string pattern on a bytes-like object 问题的解决方法...
  5. excel poi导入,数字和日期格式校验
  6. 计算机与应用工程技术职称答辩,技术工程师职称论文答辩流程
  7. 微信小程序-如何实现实现横纵滚动轴?【亲测有效】
  8. linux里用于剪切文件,Linux_拷贝,剪切,删除和创建文件
  9. 眼睛流泪是什么原因?
  10. 简单粒子群优化算法的函数寻优