📄

【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=ASIAZI2LB466WRE7E5EC%2F20251229%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20251229T135259Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjENX%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLXdlc3QtMiJGMEQCIGXaV1e%2FH63pGbGqC%2FMf8qi5ebf%2Fx7YotOTgK0R292IEAiBPCDaMpGOZqWdCQDRvCas6flf3unJR4CM4J3SxEqCRdyqIBAie%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDYzNzQyMzE4MzgwNSIM35CyYnHaICpUfPGlKtwDpRai1CzEV0geLgIA7BAEKUbtTlnTuGMlp4GmNLrxcFkrw2DhJKhjFYRYNXyVIEoq90t%2FtsEk2RI%2FHeglE8GfO%2Fc9vXm7GGQU1M9CP21Fjq%2F0cZ1pBT7XuYfXdHEACYWtE8ZoXhuUU2NFAfLUVovwzPcqYpOJVWp3T%2FZ%2BBTZqbLYNRr2jIQk%2BhCo7IPOLIE2foiSOnuJKqcigrBoVE9nN1kNCw2gZaNQ%2BHZR18PWM7GdHZy%2BJKUIK8en2%2B5Y6Po2u60WvgHNhza3Dxo2yi43rYurFhGnSZGuBiKK2W9j8iO%2F%2Fse2LTkwIZskF4AYNwnyaf90vnmA9g98yH%2BGbE4KVVmBWcs5f5HP5A7QPEMSrPa3NXOUksSI9vaaR4cb3QpEH%2B06posV3haFmzLuZmkelm9%2BDIJTh%2Fvewss2Y6%2Buj1NHsS1AUdBgYAc%2FhRUC7Jx9j0r65qdQKyNgXKbsf0xn8fQ%2F2c7tgSk5y45oEfJJIsw1ULIXRc06i1uWnetWpKYuhmrQtAm9Xn4muonvMguQKyTd1hzeGQF2SDoMi1Ad7KiaN9AcQKXEwKk8bR6MqLKf96pXIJxPNJtGz84Uo5GfjOBnvzYNyfIzPDWknO4wnY4PqvV0ZGtvm%2BNgXR0YwuezJygY6pgEsiUcX9RKEBzI4utWPuHfc7avw9TztGaZKs1SeYAa4FZF4vzRtCITTwOGIz662mRIAywekxmq1nu0xcC85KzlReel5X2weq2uhvqhKYLuC9VL7nrgH18kEL0%2FmqONSrlF99mmv8qw9KrLcpJA5JJI5wqvr899STBTz6TTAj5Q%2Bjq00FEShSLMRVKYwdPHuB%2Bmv38F%2BqXQfnI%2FZxx5l%2F%2Bqj00Vtyz2F&X-Amz-Signature=b86442e1e1d8227f7518f41a8f35734f7e8e509753bc1938acc04e31f65aa669&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