</div>// ot...">
最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 从ReactDOM.render开始学react源码

    正文概述 掘金(代小呆)   2021-02-17   587

    接上:“如何运行react源码” juejin.cn/post/692970…

     // others code ...
     <div id="container"></div>
     
     // others code ...
     ReactDOM.render(
         <h1>Hello World!</h1>,
         document.getElementById('container')
     );
    

    从官网上找到render方法的用法

    zh-hans.reactjs.org/docs/react-…

    从官网上可以看到render方法的使用方法和功能说明; 从ReactDOM.render开始学react源码 从ReactDOM.render开始学react源码

    找到render方法源码

    react-dom源码中的package.json文件中,我们可以找到入口文件为index.js,从index.js中就可以看到render方法,如下图;

    从ReactDOM.render开始学react源码

    源码: 从ReactDOM.render开始学react源码 编译后的代码在react-dom.development.js中可以找到: 从ReactDOM.render开始学react源码

    分析render方法

    render的功能是“在提供的 container 里渲染一个 React 元素,并返回对该组件的引用(或者针对无状态组件返回 null)。”

    语法为

    ReactDOM.render(element, container[, callback])
    

    源码中可以看到接收的参数,

    • element, 是一个ReactElement对象,babel会将jsx语法的dom编译后经过createElement方法生成一个ReactElement对象;
    • container:放element的容器,容器节点里的所有 DOM 元素都会被替换;
    • callback:回调函数
    render(
      element: React$Element<any>,
      container: Container,
      callback: ?Function,
    ) 
    

    render函数中调用了isValidContainer,isContainerMarkedAsRoot,legacyRenderSubtreeIntoContainer三个方法

    isValidContainer

    nodeType 属性返回节点类型。

    • 如果节点是一个元素节点,nodeType 属性返回 1。

    • 如果节点是属性节点, nodeType 属性返回 2。

    • 如果节点是一个文本节点,nodeType 属性返回 3。

    • 如果节点是一个注释节点,nodeType 属性返回 8。

    • 该属性是只读的。

    具体nodeType值可以点击链接查看:nodeType

    源码中,已经定义好常量ELEMENT_NODE,TEXT_NODE等类型值 从ReactDOM.render开始学react源码 从ReactDOM.render开始学react源码

    isContainerMarkedAsRoot

    // 生成随机值
    const randomKey = Math.random()
      .toString(36)
      .slice(2);
      
    // 拼接出key
    const internalContainerInstanceKey = '__reactContainer$' + randomKey;
    
    // 判断节点是否有internalContainerInstanceKey
    export function isContainerMarkedAsRoot(node: Container): boolean {
      return !!node[internalContainerInstanceKey];
    }
    

    legacyRenderSubtreeIntoContainer

    源码: 从ReactDOM.render开始学react源码 render中调用该方法:

    legacyRenderSubtreeIntoContainer(null, element, container, false, callback);
    

    疑问

    render方法是react-dom的入口,单独看方法比较简单,+ isValidContainer只是判断是不是正确的节点,这个大家都容易明白;

    • isContainerMarkedAsRoot判断是不是被标记为root的容器,什么时候会被标记?为什么被标记?
    • legacyRenderSubtreeIntoContainer里面包含了很多方法,整个render的核心应该就是它了,react-dom的其他逻辑是不是都是从这个方法开始被调用的?

    练手项目

        根据中文网提到的相关操作,可以将react,react-dom打包,直接通过dev.html加载运行,为了后期方便学习,我直接将用到的文件复制到新的空项目中,github地址:github.com/dai12544737…

    从ReactDOM.render开始学react源码

        如果有想要一起学习的可以直接clone代码,项目中source目录下的文件是打包后直接复制过来的,本人不会修改该目录中内容,packages下是react没有打包前的代码,可以对比学习。

    打包后的代码适合本地debug调试,查看react运行机制,可以参考react源码查看。

    各位善良的大佬如果发现我学习的方法有问题或者出现了错误,有时间麻烦帮忙指出下,非常感谢~


    起源地下载网 » 从ReactDOM.render开始学react源码

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元