• react 渲染原理


      总体概括:

    • JSX代码经过babel编译之后变成React.createElement的表达式,这个表达式在render函数被调用的时候执行生成一个element。
    • 在首次渲染的时候,先去按照规则初始化element,接着ReactComponentWrapper通过递归,最终调用ReactDOMComponent的mountComponent方法来帮助生成真实DOM节点。

      详细解说:

      

    一、JSX如何生成element

    这里是一段写在render里的jsx代码。

    return (
        <div className="cn">
             <Header> Hello, This is React </Header>
             <div>Start to learn right now!</div>
             Right Reserve.
        </div>
    )

    首先,它会经过babel编译成React.createElement的表达式。

    return (
        React.createElement(
            'div',
            { className: 'cn' },
            React.createElement(
                Header,
                null,
                'Hello, This is React'
            ),
            React.createElement(
                'div',
                null,
                'Start to learn right now!'
            ),
            'Right Reserve'
        )
    )

    这个React.createElement的表达式会在render函数被调用的时候执行,换句话说,当render函数被调用的时候,会返回一个element。二、element如何生成真实节点

    二、element如何生成真实节点

    顺利得到element之后,我们再来看看React是如何把element转化成真实DOM节点的。

    首先,需要去初始化element,初始化的规则如下:

    以第一条为例:先判断是否为Object类型,是的话,看它的type是否是原生DOM标签,是的话,给它创建ReactDOMComponent的实例对象,其他同理。

     

    这时候有的人可能会有所疑问:这些个ReactDOMComponent, ReactCompositeComponentWrapper怎么开发的时候都没有见过?

    其实这些都是React的私有类,React自己使用,不会暴露给用户的。它们的常用方法有:mountComponent,updateComponent等。其中mountComponent 用于创建组件,而updateComponent用于用户更新组件。

    而我们自定义组件的生命周期函数以及render函数都是在这些私有类的方法里被调用的。

  • 相关阅读:
    HttpServletRequest和HttpServletResponse实例
    ioc autofac简单示例
    sql left join 字符串
    sqlserver split函数
    类型同时存在于A.dll和B.dll中的解决办法
    ef使用dbfirst方式连接mysql
    html5 图片上传 预览
    webservice使用EF生成的model序列化问题
    sqlserver2008数据库文件降级为sqlserver2005文件
    [转]webapi部署在IIS7.5报404的解决方案
  • 原文地址:https://www.cnblogs.com/nini123123/p/11193845.html
Copyright © 2020-2023  润新知