官方的介绍:https://react.docschina.org/docs/react-api.html#createelement

    初学React时,打开React官网首页的示例项目,发现在不使用jsx时,代码的渲染是这样的:
    image.png
    这看起来有点懵,为什么是这样写的?参数又如何传呢?

    于是进入到官网的createElementapi介绍页,就说了这么个东西:
    image.png
    看了这个介绍,我脑海中就直接冒出了一个黑人问号脸的表情包。除了解释了的type,props是什么?类型是什么?children是什么?

    props:搜索了一番资料了解到,props是一个对象,这个对象里面的属性内容可以给当前元素设定相关属性(包括属性名,事件等)

    children:根据官方的资料总结得出,这个children指的是被渲染到节点的子节点。你可以把这些子节点当做createElement的参数一个一个放如函数,也可以用数组包裹住这些子元素,createElment会自动展开这个数组。需要注意的是,子元素被渲染的顺序和参数顺序一致。

    要说的几个坑点:

    1. 官方不解释清楚被中括号包裹的props是什么,也不解释中括号是不是就表示数组,搞得不试一下的话,还以为props可以是多个内容放在数组中的;
    2. 假使理解了中括号不是一个数组,而理解为这个参数为可选参数,那么却又有示例允许这个children参数可以被数组包裹;

    最后看一个非完整代码的示例,更清晰明白createElement的用法:
    方式一,不用数组包裹子元素:

    1. const React = window.React;
    2. const ReactDOM = window.ReactDOM;
    3. const root = document.querySelector("#root");
    4. let n = 0;
    5. const App = () =>
    6. React.createElement(
    7. "div",
    8. /* 不设置元素属性和事件,这里就传 null */
    9. null,
    10. React.createElement("p", null, "666"),
    11. n,
    12. React.createElement(
    13. "button",
    14. {
    15. className: "red",
    16. onClick() {
    17. n += 1;
    18. ReactDOM.render(App(), root);
    19. }
    20. },
    21. "+1"
    22. ),
    23. React.createElement("span", null, "ccc")
    24. );
    25. ReactDOM.render(App(), root);

    方式二,数组包裹子元素:

    1. const React = window.React;
    2. const ReactDOM = window.ReactDOM;
    3. const root = document.querySelector("#root");
    4. let n = 0;
    5. const App = () =>
    6. React.createElement(
    7. "div",
    8. /* 不设置元素属性和事件,这里就传 null */
    9. null,
    10. [
    11. React.createElement("p", null, "666"),
    12. n,
    13. React.createElement(
    14. "button",
    15. {
    16. className: "red",
    17. onClick() {
    18. n += 1;
    19. ReactDOM.render(App(), root);
    20. }
    21. },
    22. "+1"
    23. ),
    24. React.createElement("span", null, "ccc")],
    25. );
    26. ReactDOM.render(App(), root);