React源码解析笔记---ReactDOM.render

本文探讨了React源码中ReactDOM.render的实现,从获取ReactRoot、定义callback到调用unbatchedUpdates的过程。通过源码分析,揭示了ReactRoot对象的结构,包括_interalRoot属性和其与FiberRoot的关系。文章还提到了legacyRenderSubtreeIntoContainer函数的作用,并预告了调度更新的相关内容。
摘要由CSDN通过智能技术生成

前言:为了搞清楚react到底是个什么样的“框架”以及它的内部机制,因此开始阅读react源码。在阅读源码的时候,为了梳理流程,根据自己的理解以及网上的一些资料做了一些(大致流程的)笔记。笔记是当时的理解,写的时候,仍然有很多不理解的地方待后续完善。而写出来的部分,可能会有很多理解不到位甚至是错误的地方,一旦有新的理解或者发现了错误,会补充与修正。

react源码版本:16.8.6

ReactDOM.render用法:
import ReactDOM from 'react-dom';

ReactDOM.render(<App />, document.getElementById('root));
ReactDOM.render源码(这里只摘录了主要代码):

代码路径:packages/react-dom/src/client/ReactDOM.js

const ReactDOM: Object = {
   
  ...
  render(
    element: React$Element<any>, // React Element,也就是上面的<App />
    container: DOMContainer, // 一个dom节点,也就是上面的root
    callback: ?Function, // 回调函数,可不传
  ) {
   
    ...
    return legacyRenderSubtreeIntoContainer(
      null,
      element,
      container,
      false,
      callback,
    );
  },
  ...

可以看到这里调用了legacyRenderSubtreeIntoContainer函数并返回,然后找到该函数源码。

legacyRenderSubtreeIntoContainer函数代码:

代码路径:packages/react-dom/src/client/ReactDOM.js

// 将子组件树渲染进container中
function legacyRenderSubtreeIntoContainer(
  parentComponent: ?React$Component<any, any>, // 父组件,这里传入的是null
  children: ReactNodeList, // 子节点,这里是上面传入的<App />
  container: DOMContainer, // 这里是root节点
  forceHydrate: boolean, // 是否进行组合,render传入的是false
  callback: ?Function, // 上面的回调函数
) {
   
 ...
  // TODO: Without `any` type, Flow says "Property cannot be accessed on any
  // member of intersection type." Whyyyyyy.
  // 这里是初次渲染,container上没有_reactRootContainer属性,root为false
  let root: Root = (container._reactRootContainer: any); 
  if (!root) {
   
    // 初次挂载
    root = container._reactRootContainer = legacyCreateRootFromDOMContainer(
      container,
      forceHydrate,
    );
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React 是一个用于构建用户界面的 JavaScript 库,它是由 Facebook 团队开发和维护的。React 可以帮助我们快速、高效地构建交互式用户界面,而不需要担心如何管理底层的 DOM 操作。 在 React 中,UI 是通过组件来构建的。组件是一种可复用的代码块,可以封装 HTML、CSS 和 JavaScript 代码,并且可以在其他地方重复使用。React 组件被设计为具有单向数据流,即从父组件流向子组件,保证了组件的可预测性和可维护性。 在 React 中,我们使用 ReactDOM.render() 函数来将组件渲染到页面上。该函数接受两个参数:第一个参数是要渲染的组件,第二个参数是要将组件渲染到的 DOM 元素。 例如,下面是一个简单的 React 组件和它的渲染代码: ```javascript // 定义一个简单的组件 function Greeting(props) { return <h1>Hello, {props.name}!</h1>; } // 渲染组件到页面ReactDOM.render( <Greeting name="World" />, document.getElementById('root') ); ``` 在上面的代码中,我们定义了一个名为 Greeting 的组件,它接受一个名为 name 的属性,并返回一个包含该属性值的 h1 元素。然后,我们使用 ReactDOM.render() 函数将该组件渲染到页面上,将其放置在具有 id 为 root 的 DOM 元素中。 当我们运行该代码时,React 将会把 Greeting 组件渲染成一个 h1 元素,显示出 "Hello, World!" 的文本。这是 React 入门的第一步,我们可以从这里开始探索更多的 React 组件和功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值