React源码分析(二) React渲染机制

React渲染机制

一、react-dom 渲染

模块说明

  • 作用:React的DOM和服务器渲染器的入口点。它可以与通用的React包配对,一般用于渲染web端

执行过程

  1. 执行react-dom的render方法。
    // ReactDOM.render
    render(
        element: React$Element<any>, // react创建的基础对象
        container: DOMContainer, // 根节点
        callback: ?Function, // 执行完毕后的回调函数
    ) {
         
        /*
        ...处理一些警告等
        */
        // 实际执行的方法
        return legacyRenderSubtreeIntoContainer(
            null,
            element,
            container,
            false, // 是否为服务端渲染
            callback,
        );
    }
    
  2. 初始化ReactRoot节点作为react根节点容器
     //--------legacyRenderSubtreeIntoContainer--------//
     // 为了方便阅读,只保留了关键代码
     function legacyRenderSubtreeIntoContainer(
         parentComponent: ?React$Component<any, any>,
         children: ReactNodeList,
         container: DOMContainer,
         forceHydrate: boolean, // 默认为false
         callback: ?Function,
     ) {
         
         // 检查是否存在root,即ReactRoot
         let root: Root = (container._reactRootContainer: any);
         if (!root) {
         
             // 创建ReactRoot实例
             // 清除div#root内容并返回 new ReactRoot()
             root = container._reactRootContainer = legacyCreateRootFromDOMContainer(container,forceHydrate);
    
             // 调用ReactRoot.prototype.render
             root.render(children, callback);
         }
     }
    
    • 创建FiberRoot,作为fiber架构树根节点
      function ReactRoot(
       container: DOMContainer, // 真实的dom节点
       isConcurrent: boolean, // 是否是异步挂载(默认是false)
       hydrate: boolean, // 是否是服务端渲染(默认是false)
      ) {
             
          // 创建一个FiberRoot,挂在this上,也就是root节点上
          // 作为渲染树的根节点,待调度过程使用
          const root = createContainer(container, isConcurrent, hydrate);
          this._internalRoot = root;
      }
      ReactRoot.prototype.render = function() {
             /* ... */}
      ReactRoot.prototype.unmount = function() {
             /* ... */}
      ReactRoot.prototype.legacy_renderSubtreeIntoContainer = function() {
             /* ... */}
      ReactRoot.prototype.createBatch = function() {
             /* ... */}
      
    • 调用ReactRoot.prototype.render方法
      //-------ReactRoot.prototype.render-------方法
      // 获取FiberRoot
      const root = this._internalRoot;
      // 创建一个Work实例,类似于Promise
      const work = new ReactWork();
      callback = callback === undefined ? null : callback;
      /* dev警告 */
      if (callback !== null) {
             
          work.then(callback);
      }
      // 更新容器,不一定是实时更新
      updateContainer(children, root, null, work._onCommit);
      return work;                           
      
    • 创建调度任务,并同步执行该调度任务
  3. 执行performWorkOnRoot方法,初始化一颗工作树,并提交该树渲染到页面上
    let finishedWork = root.finishedWork;
    if (finishedWork !== <
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Echarts 是一个在 React 中使用 Echarts 的库,它可以帮助我们简化 Echarts 在 React 中的使用和管理。在使用 React Echarts 进行渲染时,如果发现渲染不生效,一般可以从以下几个方面进行排查和解决。 1. 检查数据更新:渲染的前提是数据已经更新了,首先要确保数据已经发生了变化。可以通过打印数据或者使用调试工具确认数据是否正确。 2. 确保组件重新渲染React 组件的重新渲染是根据其 props 和 state 的改变触发的,如果渲染不生效,可能是由于组件没有重新渲染导致的。可以通过设置组件的 key 值来强制重新渲染,或者在组件的父组件中修改其 props 或 state 的值来触发重新渲染。 3. 检查 Echarts 实例:在渲染前,需要确保 Echarts 实例已经被正确创建并挂载到容器元素上。可以在 React 组件的 componentDidMount 或 componentDidUpdate 生命周期钩子中调用相应的方法来获取和更新 Echarts 实例。 4. 刷新图表:如果数据和配置都正确,但是图表仍然没有更新,可以尝试使用 Echarts 的刷新方法来手动刷新图表。可以在组件的 componentDidUpdate 生命周期钩子中调用 echarts 实例的 setOption 方法,传入新的配置来实现刷新。 总结来说,渲染不生效可能是因为数据没有更新、组件没有重新渲染、Echarts 实例没有正确挂载或者没有手动刷新图表等原因导致的。通过检查数据和配置,确保组件重新渲染以及正确操作 Echarts 实例,一般可以解决渲染不生效的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值