发布于 2026-01-06 0 阅读
0

使用 document.createElement、React.createElement 和 JSX 构建函数式组件 DEV 的全球展示挑战赛,由 Mux 呈现:展示你的项目!

使用 document.createElement、React.createElement 和 JSX 实现函数式组件

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

上周我旁听了Lambda School的学生们学习如何使用原生JavaScript创建可复用的函数式组件。这周他们将学习如何在React中创建函数式组件。为了帮助他们更好地衔接知识,我将他们用原生JavaScript编写的组件分别用React.createElement和JSX重新创建。

那么,让我们开始吧。
首先,我们来看一个原生的 JavaScript 组件。目标是创建一个可复用的面板组件。(为了方便阅读,我省略了一些与本文无关的代码和目标。)

学生们学习了函数式组件以及如何使用 document.createElement 向 DOM 添加元素。

我想展示如何使用 React.createElement 和 JSX 以“React 的方式”来实现这个功能。
我们先来看看 React.createElement。

React.createElement

var Panel = function Panel(props) {
  var title = props.title,
    content = props.content;
  return React.createElement(
    "div",
    {
      className: "panel"
    },
    React.createElement(
      "div",
      {
        className: "panel-bar"
      },
      React.createElement("h3", null, title),
      React.createElement(
        "div",
        {
          className: "panel-buttons"
        },
        React.createElement(
          "button",
          {
            className: "panel-btn-open"
          },
          "Open"
        ),
        React.createElement(
          "button",
          {
            className: "panel-btn-close hide-btn"
          },
          "Close"
        )
      )
    ),
    React.createElement(
      "div",
      {
        className: "panel-content"
      },
      content
    )
  );
};
Enter fullscreen mode Exit fullscreen mode

从上面的代码可以看出,React.createElement 的方式与使用 document.createElement 的方式非常相似。

React.createElement

React.createElement(
          "button",
          {
            className: "panel-btn-open"
          },
          "Open"
        ),
Enter fullscreen mode Exit fullscreen mode

document.CreateElement

 const buttonOpen = document.createElement('button');
 buttonOpen.classList.add('panel-btn-open');
 buttonOpen.textContent = 'Open';
Enter fullscreen mode Exit fullscreen mode

我们创建一个元素,在本例中是一个div元素。我们给它添加一个类名panel-btn-open,并给它添加文本内容“打开”。

这两种方法都能实现相同的功能,但都非常冗长。
这时就需要用到 JSX 了。

JSX

JSX 的外观几乎与 HTML 完全相同,但它允许使用 JavaScript 为组件添加更多功能。
以下示例展示了我们的 JSX 代码与使用 React.createElement 实现的代码的对比。

我们在 Babel 网站上对 JSX 代码和 React.createElement 代码进行了比较。

const Panel = props => {
  const { title, content } = props;

  return (
    <div className="panel">
      <div className="panel-bar">
        <h3>{title}</h3>
        <div className="panel-buttons">
          <button className="panel-btn-open">Open</button>
          <button className="panel-btn-close hide-btn">Close</button>
        </div>
      </div>
      <div className="panel-content">{content}</div>
    </div>
  );
};
Enter fullscreen mode Exit fullscreen mode

在我看来,这种方法比前两种方法更容易阅读和理解。
我们像之前一样创建每个元素,给它们命名,并添加文本内容。

本文简要比较了使用 document.createElement、React.createElement 和 JSX 创建组件的方法,希望能帮助大家理解每种方法的用法。您可以查看这个 CodeSandbox 示例,了解这里使用的所有代码,以及我们如何使用 props 和一种获取数据的方法。

文章来源:https://dev.to/coffeecraftcode/functions-components-with-document-createelement-react-createelement-and-jsx-28kp