📄

【React源码】2.Jsx & ReactElement

2023-07-26 1 min read

`JSX`

  • 语法糖:通过`babel` 转译成`ReactCreateElement`
  • 1. 开发阶段:编写`JSX`

    2. 打包阶段:通过`babel`转译成`React.createElement()`

    3. `render`阶段:执行`React.createElement()` 形成 `ReactElement`,再通过`ReactDom.render()` 转换成真实`dom`;

    ![Untitled.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/8e5bfe67-e2ba-8161-8de8-0003776f4664/180c3b77-e171-4672-8166-7c0fa2f99cf7/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466T7NR6RSE%2F20251229%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20251229T134556Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjENX%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLXdlc3QtMiJHMEUCIQD%2Fz6uOEor%2BE97uNgzI3WIz42Mhw31vz%2F1HdkE%2BmTJ7PQIgTpfZhCwrP21sB1bOMIvd4QfLoMR6%2Blw9OLh9FI4P%2FkMqiAQInv%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDAZQuJ76eMc88tp38ircA9I6bj7hxpRLmiv8HLDOUR3FjknDOnPcy4hODB7cqz3nH7p0j04AiSEOj392mFif%2FUaTGeCyKuIMRxn7vGgjuW%2FHH%2Fbl6%2FYV5BuyN4vuNuLkbmqM%2FxJmC0WE0HwTHkitMG4abZ8wTonBUVvbHtrM8IMIAzaoYhyXkY8XSKrDKuVAvAyIh2mJBpQSDiVeOvQyyM8cfjJi3bSRSU283ZoHA5v6lMaNkIbVPG7EGXOz81iR%2FhHBVSDnVGDIF%2FEOyaVP7mRJ3M5IOaQ8ZRjinr0tHkh7XmoMhoCOL66SLy0YGbtG0jHghdiAALJ0kA2eOxtCzXD3tYANViwWA1FOqI8OumzCXlfG0VLq%2BtjXVx0RljFRg8073GgC6%2BsAd82BJtVj7ckWGlKlUiaYUjZHSR07JHKXzhk6HktGuY8AAEV7gjZbHZAGSmFTL9J3WvoNj1JGsCK1JdAIX0CiWCWDr25FqFxjsEqyDBAbW%2BlrchPdy3nqqJzTfXbZDilMXmCYAA%2B%2BPk%2F6N0bUuwCH087zYxeXEeSScwfrLYS1YdXZqoeUkIhCzDYjz5w7xCBtV163zkgjxT8VKxNUBbJCFhe25ICiWEzNINzwMYLTKAmrGYQ%2FvcMGDeqQ09TmgPzFobjDMLnsycoGOqUBuAia1%2Fq%2FeZmEH%2FfCqsYTizCJWNEV3AZN2JqC%2FlEZCISDgdo0QiQdM7agWwDYcM2pPddpM%2FBbdVs1rAgbsMYlT0mH6vFU4lqReW5Z0OMoelQbTa1aN8PLsQvnSdrSb70j4V5asBBq8EJ46EQapcYU7v9iL4s1JCw1XD1TBSjTFYjlUUI8nOwBxmAd9Ay0Rs9ZzisiOpXbF8yvBhbmmgWbXslXRgaf&X-Amz-Signature=752aac05f4dd29a3e8c7ff7c896b1ab51929f49aa4c30dc0cdc71f32ae016fc9&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject)

    `React`元素

    {

    type:'div',//标签

    props:{

    id:'title',

    children:'hello',//如果是多个子的话,是Array类型

    }

    }

    `ReactDom.createElement`

    const REACT_ELEMENT = Symbol('react.element');

    /**

    * 创建React元素

    * @param type 标签

    * @param config 配置

    * @param children 子元素,可能多个

    * @returns React.Element

    */

    function createElement(type, config, children) {
      const { __source, __self, ref, key, ...props } = config;

    if (arguments.length > 3) {

    props.children = Array.prototype.slice.call(arguments, 2);

    } else {

    props.children = children;

    }

    return {

    $$typeof: REACT_ELEMENT,//html标签类型

    type,//标签名:如div

    props,//属性:如id,className

    key,//用于dom:diff

    ref,//真实dom

    };

    }

    End of file