让我们先从原生 JS 开始,一步步过渡到 React,毕竟 React 也是用一行行 JS 代码搭建的,对吧

我们会用这个仅有 3 行的 React app 作为这一节的核心内容

const element = <h1 title="foo">Hello</h1>
const container = document.getElementById("root")
ReactDOM.render(element, container)

简单分析这段代码

现在,让我们去掉所有 React 代码,回到原生 JavaScript 中!


const element = <h1 title="foo">Hello</h1>

第一行的 element 是使用 JSX 定义的,它甚至不是有效的 JavaScript,所以,为了能够使用原生 JS 替换它,首先,我们需要将其改为有效的 JS 代码。

JSX 通过类似 Babel 这样的工具转换为 JS。这一转换过程通常也很简单:将标签替换为 createElement 这一函数的调用,再把标签名、props 和 children(子元素)以参数的形式传递给它

const element = React.createElement(
	"h1", // 标签名
	{ title: "foo" }, // 标签上的 props
	"Hello" // 标签内的子元素,这里是一个文本节点
)

React.createElement 依据传入的参数创建一个对象,再加上一些额外的验证,就没了!所以我们可以安全地将这个函数调用替换成它的输出(返回值)

const element = {
	type: "h1",
	props: {
		title: "foo",
		children: "Hello",
	},
}

而这就是一个 element,一个有 type 和 props 属性的对象(好吧,其实还有更多,但是我们只关注这两个)