661 字
3 分钟
React 组件基础

组件是返回 JSX 的函数#

function Profile() {
return <img src="/avatar.png" alt="头像" />
}
export default function Gallery() {
return (
<section>
<h1>团队成员</h1>
<Profile />
<Profile />
</section>
)
}

两条规则。组件名必须以大写字母开头,React 靠这一点区分组件与普通 DOM 标签。组件要返回能被 React 渲染的东西,通常是 JSX。

<Profile /> 看起来像 HTML 标签,实际是在调用那个函数。所谓渲染,就是 React 一层层调用你的组件(Render and Commit)。

入参是只读的#

function Avatar({ person, size = 64 }) {
return (
<img
src={person.src}
alt={person.name}
width={size}
height={size}
/>
)
}

props 由父组件传入,接收方不能改它。渲染必须是纯的:同样的入参给出同样的输出,而且不去动渲染之前就存在的对象。

默认值直接写在解构里,写成 size = 64 这种形式。注意 React 19 起,函数组件的 defaultProps 已经被移除、写了会被静默忽略,别再依赖它(类的 defaultProps 仍然有效)。要改数据,让父组件传一个回调下来。

children 也是一种 props#

function Card({ children }) {
return <div className="card">{children}</div>
}
<Card>
<h2>标题</h2>
<p>正文</p>
</Card>

标签之间的内容会作为 children 传进去。它是最省事的一种组合方式:Card 不必知道里面装的是什么。

类组件只在读旧代码时需要#

class Counter extends Component {
state = { count: 0 }
render() {
return (
<button onClick={() => this.setState({ count: this.state.count + 1 })}>
{this.state.count}
</button>
)
}
}

Component 与 PureComponent 现在归在官方的 Legacy API 里。新代码用函数组件加 Hook。读旧代码时会遇到这些在 React 19 里已被移除的写法:函数组件的 propTypes、字符串 ref(ref="box" 配 this.refs.box)、以及 contextTypes 与 getChildContext。

函数组件的 props 类型直接用 TypeScript 标在参数上,不必额外套一层 React.FC。

拆到什么程度#

判据是可复用与单一职责,不是行数。只在一处出现、又不会再变化的大组件,拆开只是多一层要读的东西。

真正值得抽的是重复的部分:界面重复就抽组件,逻辑重复就抽自定义 Hook,后者见 自定义 Hook。

四条边界#

组件名必须大写开头。小写开头会被当成 HTML 标签,页面直接空掉。

一个组件只返回一个根节点。不想多套一层容器,就用 <> 与 </>。

渲染期间不要改外部对象、不要直接操作 DOM、不要发请求。这些属于事件处理函数或 Effect。

别在渲染里现算随机数或当前时间来生成 key。渲染要可重复,key 应当来自你的数据。

第 5 篇,共 39 篇本文属于系列

React 组件基础
https://www.choria.top/posts/start/
作者
乔瑞雅·克林威尔
发布于
2026-05-03
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取

最后更新于 ,距今已过 189 天

部分内容可能已过时