纯组件与避免渲染副作用
编写不包含修改操作和外部读取的渲染函数。
纯组件与避免渲染副作用 是 CoddyKit 上的免费 React Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。
欢迎
在本课中,您将了解纯组件在 React 中的含义、渲染函数为何必须没有副作用,以及如何发现并修复常见的纯度问题。
什么是纯函数
对于相同的输入,纯函数始终返回相同的输出,并且不会产生可观察的副作用。React 希望您的组件函数是纯函数:给定相同的属性和状态,它应始终返回相同的 JSX。
纯度为何在 React 中很重要
React 可能会多次调用您的组件(StrictMode、并发功能、服务器渲染)。如果您的渲染包含 API 调用、DOM 修改或写入全局变量等副作用,这些操作就可能以不可预测的方式执行多次。
常见的不纯操作:修改外部状态
绝不要在渲染期间修改定义在组件外部的变量。在事件处理程序或 useEffect 中进行修改没有问题,但不能在渲染时修改。
let totalRenders = 0; // external
function Counter() {
totalRenders++; // BAD: side effect in render
return <p>{totalRenders}</p>;
}常见的不纯操作:修改属性
绝不要在组件内部修改属性对象。属性是只读的。如果您需要修改后的版本,请创建一个新变量。
// Bad
function Badge({ user }) {
user.name = user.name.toUpperCase(); // mutates prop!
return <p>{user.name}</p>;
}
// Good
function Badge({ user }) {
const displayName = user.name.toUpperCase();
return <p>{displayName}</p>;
}常见的不纯操作:在渲染中使用随机值或日期
直接在渲染中调用 `Math.random()` 或 `Date.now()` 会在每次调用时产生不同的值,从而破坏纯度。请将它们移入状态初始化器或 useEffect。
// Bad
function Token() {
const id = Math.random(); // different every render!
return <p>{id}</p>;
}
// Good
function Token() {
const [id] = useState(() => Math.random());
return <p>{id}</p>;
}API 调用应放在 useEffect 中
直接在组件函数主体中获取数据(而不是在 useEffect 中获取)是一种不纯操作,因为它会在每次渲染时触发。请始终将获取数据的调用移入 useEffect,并设置适当的依赖项。
// Bad
function Profile({ id }) {
fetch('/api/user/' + id); // runs on every render!
return <div />;
}
// Good
useEffect(() => {
fetch('/api/user/' + id).then(/*...*/);
}, [id]);局部修改没有问题
创建并修改在同一次渲染调用中创建的对象或数组是完全没有问题的,因为其他代码无法观察到它们。这称为局部修改。
function List({ items }) {
const sorted = [...items]; // new array
sorted.sort(); // mutating a local copy: OK
return sorted.map(i => <li key={i}>{i}</li>);
}使用严格模式查找不纯操作
React StrictMode 会在开发环境中调用您的组件两次。如果两次调用之间的界面不一致,或您看到副作用重复执行,就说明渲染不纯。请修复这些不纯操作,直到重复调用不再产生问题。
纯组件与 React.memo
当组件是纯组件时(相同的属性 → 相同的输出),使用 `React.memo` 包裹它可以告诉 React:如果属性没有变化,就可以跳过重新渲染,从而提高性能。
const Pure = React.memo(function Pure({ value }) {
return <p>{value}</p>;
});快速检查
以下哪一项是在 React 组件的渲染函数内部直接执行时可以接受的副作用?
回顾
对于相同的输入,纯组件始终返回相同的 JSX。避免在渲染中修改属性或外部变量,使用 useEffect 处理副作用,并依靠 StrictMode 发现违规操作。
接下来
下一课:**键与引用的最佳实践**——您将正确使用稳定的键,避免使用数组索引作为键的陷阱,并使用回调引用。
常见问题解答
「纯组件与避免渲染副作用」课时是免费的吗?
是的 — 「纯组件与避免渲染副作用」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。
「纯组件与避免渲染副作用」这节课中我会学到什么?
编写不包含修改操作和外部读取的渲染函数。 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 React Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「纯组件与避免渲染副作用」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 React Academy 课中编写并运行代码吗?
能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- StrictMode 的作用
- 纯组件与避免渲染副作用
- Key 与 Ref 最佳实践
- 文件夹结构与命名约定