自己写一个 react 3.状态更新

发布于 2022-02-22 13:51:08 字数 1510 浏览 1030 评论 0

这一步跨度比较大,主要有两个方面,react组件的状态更新基础设施升级

react 组件的状态更新

这个话题十分庞大,涉及到 setState内部机制 与 domdiff算法问题,react 的几个精髓之二就在这里了,不过我并没有一步吃下这两个大内容。我们回顾一下我们是怎么更新 react 组件的?一般说来途径是这样子的

用户触发行为->调用到组件的setState->组件进行更新

用户触发行为

本质上就是事件绑定,因为没有事件,不能响应用户的行为,而事件绑定又涉及到react里面的一个大点合成事件了,fb还用这个去申请了专利,不过也有人觉得这里面的代码很冗余。我这里简单起见,直接针对onClick属性的dom进行事件绑定

    if(props.onClick){
        //react中是使用合成事件的,鉴于时间问题先省略
        domElement.addEventListener('click',props.onClick);
      }

调用到组件的setState

这里面就是按照事件绑定->调用api->合并state->生成新虚拟dom->下一步的步骤进行

组件更新

简单起见,我是直接比较组件有没有差异,一但有,就整个dom更新掉。

把以上思路串起来,就做完了这个阶段的代码,实测也是可以运行的。
https://github.com/p2227/diyReact/blob/dbaebfc6fd58432cae3ea427ffd9851783a5eaa4/src/stage2-update.js

基础设施升级

在实现本次升级的过程中,我经常修改实例代码,要设计一个不太复杂但是又能体现以上功能点的交互实例,还是有很多细节需要打磨的。由于受不了一次次复制粘贴babel,也不想配置构建环境。于是把关注点放在了online版本的babel上 http://babeljs.io/setup#installation ,但是文档里面的用法我不太喜欢,他是每个实例都要写一个页面的。我观察了一下 standalone 的代码,进行了一些试验,发现它加了个全局对象Babel,上面有一些熟悉的方法如 transform ,就自己写了个交互,把代码扔给Babel,再执行。鉴于效率的考虑把transform部分放到一个worker里面,这样就把demo页面做成可以直观切换不同版本的效果。
https://gh.p2227.com/diyReact/index.html

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84961 人气
更多

推荐作者

胡图图

文章 0 评论 0

zt006

文章 0 评论 0

z祗昰~

文章 0 评论 0

冰葑

文章 0 评论 0

野の

文章 0 评论 0

天空

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文