如何用js实现一个简单的react?

haiyicha haiyicha
838
2022-05-11
谢谢邀请! 写一个react应用,可以分为以下几步: 1、写组件 组件分为类组件和函数式组件,类组件需要继承react的Component基类,有自己的生命周期钩子函数 2、状态管理 数据由props传入,类组件内部可以通过state控制组件自身的状态变化(setSta...

谢谢邀请!

写一个react应用,可以分为以下几步:

1、写组件

组件分为类组件和函数式组件,类组件需要继承react的Component基类,有自己的生命周期钩子函数

2、状态管理

数据由props传入,类组件内部可以通过state控制组件自身的状态变化(setState)

3、调用入口函数

ReactDOM.render

4、通过webpack(babel处理jsx)打包编译即可生成react应用

在react中有一个虚拟dom的概念,那么虚拟dom是什么呢?其实它是一个对象,如下图:

它就是对jsx的描述,jsx并不能当做真正的dom插入页面中,需要做进一步的转化,babel会把jsx转化为一堆由createElement组成的执行函数,如下:

再由createElement返回的数据拼装成上面所说的虚拟dom。

那么要实现一个react,需要实现createElement、render和Component三个部分!

1、createElement函数

第一个参数type是类型,可能是类、函数、dom的tagName,第二个参数props就是定义在jsx中标签的属性包括自定义属性和自定义事件

2、render

render索要完成的事情就是将虚拟dom渲染成真实的dom,并且可以更新!办法就是遍历这个虚拟dom树。

遇见dom标签,生成dom节点,从props中拿出属性和事件(事件的key都是以on开头),完成绑定,append进父元素中。

遇见类组件,直接new出一个实例,运行实例的render方法,生成组件的虚拟dom,展开递归,遇见dom标签就加入父元素中,在这个阶段是可以运行生命周期中各个钩子函数的。

遇见函数,直接执行,生成组件的虚拟dom,展开递归,遇见dom标签就加入父元素中。

3、diff(插入一点)

如何做到diff呢?其实就是在内存中保留上一次的虚拟dom树,待生成新的虚拟dom树后,就可以逐层做diff,这就是为什么在写react的state时候需要生成新的对象断开引用,为的就是不能影响diff。react是在属性、类型等改变时有一套规则,diff规则可以自己定,不一定要沿用react的。

之前出去面试,别人问我如果有一千个 一万个节点如何对比,递归下去依然性能很差,被问的垭口无语!读者可以自己思考一下!

4、Component

这个基类比较简单,就是实现一个setSate方法,在方法中调用更新逻辑。

综上,实现这个几个功能基本就能实现一个react了,不过还是比较复杂的,特别是递归那块!

喜欢我的回答就关注我吧,有问题可以发表评论,我们一起学习,共同成长!

首先要去了解react原理,去github找,然后一点点实现部分特性,比如vdom,渲染,数据绑定等等。一点点的了解了原理,自然就可以实现造轮子!!

有很多教程,跟着学起吧

其他相关 RELEVANT MATERIAL
怎样利用业余时间提升学历?

怎样利用业余时间提升学历?

haiyicha haiyicha
782
2022-05-11
可以选择继续教育,时间上比较自由,而且可以选择机构进行报名,也可以省掉很多繁琐得流程,所以,怕麻烦得话选择机构都是不错的。省时省力省钱,重点是通过率极高!想了解更多的话可以详细咨询我哈! 现在成人学历比较普遍的就是自考、网络远程和成人高考这三种了,都是业余制学习的,不......
大家课余时间做些什么呢?

大家课余时间做些什么呢?

haiyicha haiyicha
1003
2022-05-11
本人国企上班,课余时间也挺多的。尽量做一些有意义的事情来丰富自己的课余时间,也可以考一些证件增加自己的收入。 1、如果自己不是理工类毕业的考那些建造师证或者注册安全工程证之类的证书可能性是不大的,如果自己文学挺好,就可以玩玩今日头条或者悟空问答,写写文章,发发小视频。如......
如何自制布丁?

如何自制布丁?

haiyicha haiyicha
801
2022-05-11
布丁其实很容易做的,首先要准备好专用的布丁杯,下面分享一个芒果布丁的做法,很简单的,在即将到来的夏天可以多做一些放在冰箱里,煲剧的时候拿一个出来吃,这才是吃甜品的正确打开方式呢! 材料:芒果300g、牛奶200g、淡奶油100g、炼乳15g、吉利丁粉6g、细砂糖30克、......
有没有一些简单好吃又健康,并且适合在家做的甜品美食?

有没有一些简单好吃又健康,并且适合在家做的甜品美食?

haiyicha haiyicha
652
2022-05-11
简单好吃又健康的甜品,我首选紫薯椰蓉粉,好吃又不腻,甜度完全自己掌控。 紫薯被誉为“抗癌之王”,因此,可以常吃,对身体也很好。单纯吃蒸紫薯可能会过于简单,如果试着加点花样,不仅好吃十倍,而且颜值还很高! 【材料】 1.紫薯150克 2.牛奶20克 3.椰蓉粉少许 【做法......
想吃甜品太贵,自己做又不会,怎样用牛奶做出百搭甜品?

想吃甜品太贵,自己做又不会,怎样用牛奶做出百搭甜品?

haiyicha haiyicha
466
2022-05-11
作为热爱烘焙,爱吃甜品的吃货,很理解友的心情哈,其实想自己做甜品没有那么难。牛奶是我们常用的一款烘焙食材,想要制作简单又美味的百搭甜品,只需搭配一些其他食材即可完成。下面推荐3种以牛奶为主料的制作的甜品和饮品,做法都非常简单快手,特别适合新手“小白”朋友们,欢迎喜欢的伙......
用水果可以做什么甜品或美食呢?

用水果可以做什么甜品或美食呢?

haiyicha haiyicha
196
2022-05-11
我是吃货小筑Vivi,一枚专注于烘焙的美食博主,这是我在悟空问答的第428个原创回答。 “用水果可以做什么甜品或美食呢?”很高兴与友一起探讨这个问题。 作为一枚爱烘焙的吃货,水果在烘焙中还是很常用的,不仅是点缀的作用,更能带给甜品更多层次感和特别的味道。分享4款Vivi......
评论 SAY SOMETHING
年度爆文