组件与 Props
React 应用由组件树组成。Props 是父组件传入子组件的只读参数;子组件通过回调 props 向父组件上报事件。见 JSX、Hooks。
Props 与单向数据流
type ButtonProps = {
label: string;
disabled?: boolean;
onPress: () => void;
};
function Button({ label, disabled = false, onPress }: ButtonProps) {
return (
<button type="button" disabled={disabled} onClick={onPress}>
{label}
</button>
);
}
- 不要修改 props;需要“子改父数据”时由父组件持有 state,通过
onPress等回调更新。 - 展开传递:
<Profile {...user} />等价于逐个属性绑定。
受控与非受控组件
| 类型 | 说明 |
|---|---|
| 受控 | 表单值由 React state 驱动,如 value={text} onChange={e => setText(e.target.value)} |
| 非受控 | 值存在 DOM 中,用 ref 读取,如 <input ref={inputRef} defaultValue="..." /> |
复杂表单可配合 React Hook Form 等库。
组合模式
children
function Card({ children }: { children: React.ReactNode }) {
return <section className="card">{children}</section>;
}
<Card>
<h2>标题</h2>
<p>内容</p>
</Card>;
插槽式 props
function Layout({
header,
footer,
children,
}: {
header?: React.ReactNode;
footer?: React.ReactNode;
children: React.ReactNode;
}) {
return (
<>
{header}
<main>{children}</main>
{footer}
</>
);
}
复合组件(Compound Components)
父组件通过 Context 向子组件共享隐式状态(如 Tabs、Select),避免 props 层层传递。实现时常配合 Context。
提升状态(Lifting State Up)
多个兄弟组件共享状态时,将 state 提升到最近共同父组件,再通过 props 下发。
与 Vue 对照(简表)
| React | Vue | |
|---|---|---|
| 传参 | props 只读 | props 单向 |
| 双向绑定 | 受控 + onChange 或库 | v-model |
| 默认插槽 | children | 默认插槽 |
| 作用域插槽 | render props / 函数 children | v-slot |
参考文献
以下链接在编写时均可正常访问:
| 资料 | 说明 |
|---|---|
| React:组件 | 首组件 |
| React:Props | 传递 props |
| React:受控组件 | 受控 input |
相关文章
渲染与协调
React 将组件渲染为虚拟 DOM 树,再协调(reconciliation)到浏览器 DOM。理解该过程有助于解释 key、memo 与性能优化。涵盖渲染流程、Fiber、startTransition、Suspense、最佳实践与常见坑。
工程化
新建 React 项目时,官方与社区主流工具为 Vite;全栈场景常用 Next.js。涵盖 Vite + React、Create React App 现状、Next.js、目录结构、环境变量、部署、最佳实践与常见坑。
TypeScript
React 官方推荐 TypeScript。类型主要落在 Props、事件、Ref 与 Hooks 返回值上。见 组件。
测试
React 组件测试推荐 React Testing Library(RTL):从用户可见行为断言,而非实现细节。运行器常用 Vitest 或 Jest。涵盖安装配置、查询优先级、异步测试、Mock 网络请求、最佳实践与常见坑。
构建与分包
通过代码分割与构建配置减小首屏 JavaScript 体积。涵盖 React.lazy/Suspense、路由级分割、Tree Shaking、Vite 生产构建、体积分析、最佳实践与常见坑。运行时优化见 runtime。
Effect 与副作用
useEffect 用于在组件渲染后执行与外部系统同步的逻辑(请求、订阅、手动改 DOM 等)。涵盖基本用法、依赖数组、适用/不适用场景、useLayoutEffect、最佳实践与常见坑。