js递归函数(js递归函数 children)

谢谢邀请js递归函数!

js递归函数(js递归函数 children)

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

js递归函数(js递归函数 children)

1、写组件

js递归函数(js递归函数 children)

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

js递归函数(js递归函数 children)

2、状态管理

js递归函数(js递归函数 children)

数据由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了,不过还是比较复杂的,特别是递归那块!

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

  • js递归函数(js递归函数 children)已关闭评论
  • 10 views
    A+
发布日期:2021年09月14日 2:29:11  所属分类:SEO优化