自己写一个 react 3.状态更新
这一步跨度比较大,主要有两个方面,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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论