如果你已经使用 React 一段时间了,你可能经常不加思考地混用”组件”、”实例”和”元素”这些术语。我刚开始学习时也是这样!但是理解这些概念之间微妙而重要的区别,真的能帮助你搞清楚 React 应用内部发生了什么。另外,这也是一个相当常见的面试问题,所以绝对值得深入了解一下。
让我通过一些有用的可视化图表,一步步为你解释这些概念。
React 组件到底是什么?

让我们从基础开始。组件就是一个描述用户界面某个部分的 JavaScript 函数。它的特别之处在于:它返回 React 元素(通常用 JSX 编写),这些元素形成了我们所说的元素树。
function Tab({ item }) {
return (
<div className='tab-content'>
<h4>所有联系人</h4>
<p>你的帖子将是可见的</p>
</div>
);
}
你可以把组件看成一个蓝图或模板。它是对 UI 某个部分应该长什么样、如何表现的通用描述。但关键点是:组件本身只是代码中的一个函数——在 React 使用它之前,它实际上并不做任何事情。
组件实例:魔法发生的地方

当你在 JSX 中实际使用一个组件时,React 会创建所谓的组件实例。这就是有趣的地方了。
function App() {
return (
<div className='tabs'>
<Tab item={content[0]} />
<Tab item={content[1]} />
<Tab item={content[2]} />
</div>
);
}
在这个例子中,尽管我们只写了一个 Tab 组件,React 却创建了它的三个独立实例。在后台,React 实际上调用了 Tab 函数三次——每个实例一次。
每个实例就像是你的组件在应用中的实际”物理”体现。这样想想:如果组件是房子的蓝图,那么每个实例就是根据那个蓝图建造的实际房子。每栋房子(实例)可以有不同的油漆颜色(props)、不同的家具布置(state),以及从建造到拆除的自己的时间线(生命周期)。
这就是为什么每个实例可以有:
- 自己的 state 和 props
- 自己的生命周期(它可以”诞生”、”存活”和”死亡”)
- 在组件树中的自己的位置
React 元素:幕后英雄

现在这里变得真正有趣了。当 React 执行每个组件实例中的代码时,它并不直接创建 DOM 元素。相反,它创建 React 元素。
还记得你写的那些 JSX 吗?它们会被转换成 React.createElement() 函数调用:
// 你的 JSX
<div className='tab-content'>
<h4>所有联系人</h4>
<p>你的帖子将是可见的</p>
</div>
// 被转换成
React.createElement('div',
{ className: 'tab-content' },
React.createElement('h4', null, '所有联系人'),
React.createElement('p', null, '你的帖子将是可见的')
);
这些函数调用的结果就是一个 React 元素——一个大的、不可变的 JavaScript 对象,React 将其保存在内存中。这个对象包含了创建实际 DOM 元素所需的所有信息,但它本身并不是 DOM 元素。
你可以把 React 元素想象成一个详细的说明书,它告诉 React 在 DOM 中需要创建什么以及应该如何呈现。
最后一步:DOM 元素
最终,React 将这些 React 元素转换成实际的 DOM 元素——即浏览器在屏幕上绘制的真实 HTML 元素。
这就是用户在浏览器中能够看到和交互的组件实例的实际视觉表现。
完整的旅程:从蓝图到浏览器
让我追踪一下完整的旅程:
- 组件:你编写一个函数(蓝图)
- 组件实例:当你使用
<Tab />时,React 调用你的函数(创建活跃的实例) - React 元素:每个实例返回一个包含渲染指令的 JavaScript 对象
- DOM 元素:React 将这些指令转换成浏览器中的实际 HTML 元素
关于术语的快速说明
在日常的 React 开发中,我们经常互换使用这些术语,这完全没问题!你会听到人们说”组件生命周期”而不是”组件实例生命周期”,或者”UI 由组件组成”而不是”组件实例”。
虽然在许多情况下”组件实例”在技术上更准确,但 React 社区已经习惯了这种更随意的用法,每个人都明白你的意思。只要在阅读文档或调试复杂问题时记住这种区别就行了。
为什么这很重要
理解这个流程有助于你掌握几个重要的 React 概念:
- 为什么会发生重新渲染:当 state 改变时,React 创建新元素并比较它们
- React 如何优化性能:当没有变化时,它可以重用实例并跳过创建新元素
- 协调过程中发生了什么:React 比较新旧元素树
- 为什么列表中的 key 很重要:它们帮助 React 识别哪些实例应该被重用
总结
从单个组件函数到屏幕上渲染的像素这一旅程,涉及这些不同的步骤,每个步骤在 React 架构中都有特定的目的。组件提供模板,实例用自己的 state 和 props 让它们活起来,React 元素充当说明书,而 DOM 元素则是用户实际看到的内容。
下次构建 React 应用时,花点时间思考一下这个流程。它可能会帮助你理解 React 为什么这样工作,并让你成为一个更有效的 React 开发者!


发表回复