基础 - JSX - 图1

一:不同类型的 fiber Tag

React 中不同的 React Element 对象会产生不同 Tag 的 fiber 对象。如下是,Tag 与 element 的对应关系。

  1. export const FunctionComponent = 0; // 函数组件
  2. export const ClassComponent = 1; // 类组件
  3. export const IndeterminateComponent = 2; // 初始化的时候不知道是函数组件还是类组件
  4. export const HostRoot = 3; // Root Fiber 可以理解为根元素 , 通过reactDom.render()产生的根元素
  5. export const HostPortal = 4; // 对应 ReactDOM.createPortal 产生的 Portal
  6. export const HostComponent = 5; // dom 元素 比如 <div>
  7. export const HostText = 6; // 文本节点
  8. export const Fragment = 7; // 对应 <React.Fragment>
  9. export const Mode = 8; // 对应 <React.StrictMode>
  10. export const ContextConsumer = 9; // 对应 <Context.Consumer>
  11. export const ContextProvider = 10; // 对应 <Context.Provider>
  12. export const ForwardRef = 11; // 对应 React.ForwardRef
  13. export const Profiler = 12; // 对应 <Profiler/ >
  14. export const SuspenseComponent = 13; // 对应 <Suspense>
  15. export const MemoComponent = 14; // 对应 React.memo 返回的组件

知识点:

Q:老版本的 React 中,为什么写 jsx 的文件要默认引入 React?
答:因为 jsx 在被 babel 编译后,写的 jsx 会变成上述 React.createElement 形式,所以需要引入 React,防止找不到 React 引起报错。
注意:新版本 React 已经不需要引入createElement,因为编译后是通过jsx/jsxsruntime 来执行的。
【官网】- 介绍全新的 JSX 转换


Q: React.createElement 和 React.cloneElement 到底有什么区别呢?
答: 可以完全理解为,一个是用来创建 element 。另一个是用来修改 element,并返回一个新的 React.element 对象。