React源码阅读2-ReactDOM.render

ReactDOM

const ReactDOM: Object = {
  createPortal,

  findDOMNode(componentOrElement: Element | ?React$Component<any, any>,){},

  hydrate(element: React$Node, container: DOMContainer, callback: ?Function) {},

  // render 渲染
  // element 元素 container 根节点  callback 回调函数
  render(element: React$Element<any> , container: DOMContainer,callback: ?Function) {
    // 返回一个函数
    return legacyRenderSubtreeIntoContainer(
      null,
      element,
      container,
      false,
      callback,
    );
  },

  unstable_renderSubtreeIntoContainer(
    parentComponent: React$Component<any, any>,
    element: React$Element<any>,
    containerNode: DOMContainer,
    callback: ?Function,
  ) {
    return legacyRenderSubtreeIntoContainer(
      parentComponent,
      element,
      containerNode,
      false,
      callback,
    );
  },

  unmountComponentAtNode(container: DOMContainer) { },

  // Temporary alias since we already shipped React 16 RC with it.
  // TODO: remove in React 17.
  unstable_createPortal(...args) {},
};

ReactDOM.render

reactDOM传入一个 element ReactElement , container DOM根节点 , callback 渲染后回调函数
// 返回一个函数
return legacyRenderSubtreeIntoContainer(
null,
element,
container,
false,
callback,
);

legacyRenderSubtreeIntoContainer 直译:渲染子树给容器

function legacyRenderSubtreeIntoContainer(
    // 父组件
  parentComponent: ?React$Component<any, any>,
    // 子元素
  children: ReactNodeList,
  // 根节点
  container: DOMContainer,
  // 
  forceHydrate: boolean,
  // 回调函数
  callback: ?Function,
) {
  // TODO 没有`any`类型,Flow说“不能访问任何属性
  // 交叉类型的成员
  let root: Root = (container._reactRootContainer: any);
  if (!root) {
    // 初始安装
    root = container._reactRootContainer = legacyCreateRootFromDOMContainer(
      container,
      forceHydrate,
    );
    if (typeof callback === 'function') {
      const originalCallback = callback;
      callback = function() {
        const instance = getPublicRootInstance(root._internalRoot);
        originalCallback.call(instance);
      };
    }
    // Initial mount should not be batched.
    unbatchedUpdates(() => {
      if (parentComponent != null) {
        root.legacy_renderSubtreeIntoContainer(
          parentComponent,
          children,
          callback,
        );
      } else {
        root.render(children, callback);
      }
    });
  } else {
    if (typeof callback === 'function') {
      const originalCallback = callback;
      callback = function() {
        const instance = getPublicRootInstance(root._internalRoot);
        originalCallback.call(instance);
      };
    }
    // Update
    if (parentComponent != null) {
      root.legacy_renderSubtreeIntoContainer(
        parentComponent,
        children,
        callback,
      );
    } else {
      root.render(children, callback);
    }
  }
  return getPublicRootInstance(root._internalRoot);
}

代码仓库

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 源站:http://fengyuanchen.github.io/viewer/ 应用: html: 源码上是正常...
    羊绘霖阅读 5,595评论 0 2
  • 40、React 什么是React?React 是一个用于构建用户界面的框架(采用的是MVC模式):集中处理VIE...
    萌妹撒阅读 1,091评论 0 1
  • 狗猫鼠 一个人做到只剩了回忆的时候,生涯大概总要算是无聊了罢,但有时竟会连回忆也没有。
    AH卖萌君阅读 316评论 0 0
  • 我从来没有去过桃林 看盛开的桃花 多少次 我只是路过 所说的人面桃花相映红 有点儿远了 我也没有在清明节踏过青 多...
    叮咚的你阅读 260评论 2 5
  • 定位调整偏见是一种谈判技巧,在信息不对称、利益不平衡中争取最大利益的一种方法。利用这个谈判技巧,需要坚持三个原则:...
    自如得己阅读 476评论 0 0