📄

【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=ASIAZI2LB4665LNYMLSQ%2F20251229%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20251229T134855Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjENX%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLXdlc3QtMiJGMEQCIC04mh0I8p94zYzeLsG0wazmr7iBp9g%2BVcpDXhExTb6eAiBq1dlbiVcH1JHrefzDoPRDbgZaD7M%2Bcc7kpG9SKj3CdCqIBAie%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDYzNzQyMzE4MzgwNSIMCamZMNaS5mdxIWC6KtwDpJLy3qff8FOoq3Nx%2FwcU4hh2l8c5jWsfAlOiyveU8L%2BURd2u4JJJKWxxUDMyz0OY%2BR7du5jVx88s6w4KJM9Eoy1zK%2BU2CMgfVerICdtN7u4aAs4beL%2BgUhX9aS%2Fl4D7lBfv0Ws6nQNx1eNC9s5UjveR4ZbSkElFQuJEgSqZzLOdhnNofW9Olbea%2BTOHjoEphQytxbgNAXoBKUihAlZT%2FiwQ%2FR9V5Tm9nhf7fK7x1veGbDYktzo50w0atEq4YC3A%2FWdEQpTupa8nWu%2FrIMLYJgl8wv1elQ6u80o6wSWgsLE146%2FLCUto3svi6l4ZZcNxEJK6g4YqP%2F9vnY8uZjSAsA6I5tgQqqTzH4TrgMXHui%2Fm6lMkCYfaQBfAzKxWD70RFtUc0C8NLsmtqG4DIYLW8oiscKkECYyuz%2BqypYRliKFIslJcf0UCvJgfWpL7BchLjb6o9vxQiY%2F54D37iV0h2FN8kApZ1l7IoZfDcy7n3IaXCJPtQDybBfnzh6sfFOCeG2%2F9X%2BBPV6jVhbjhiIGasqNvDgUyls%2B19xiBLUpNC5SGYnb7%2FWJSWkcIkgVk1Uu6xiPW7Wx%2FNFCNFBqNPLThysob27rvWSAvq%2F1bIPfK%2B99yrBSlU6huU5H2wcgAw1enJygY6pgFJCocbYFasFpbacJTu3%2F2HE88C3EokzxgLWBJuCKXbKofc5mB15tV3EoVWa1y%2F3UEn7RB5EzYvuZHwndTMleExlOYiklGtmK0qGS7Wp%2FriDz581v%2Bgwbk4%2FY%2FqmDnF9CXmlMWghpx9IA%2BtE9sTmrM8TtTyvj6L1wo3Sriydg2%2BpO5XFFTqcJstXh1ddvAg%2BSSjnMfjSctbxyr%2FRZerBNDn%2FIM1UzqV&X-Amz-Signature=cd6b769a787b5a757afe4a25a0a9818e3364c08e1f8ae8272c4a65a2155ac0fd&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