使用 useTransition 实现非阻塞式界面更新
将耗时的状态更新包裹在 startTransition 中,让界面保持响应。
使用 useTransition 实现非阻塞式界面更新 是 CoddyKit 上的免费 React Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。
欢迎
在本课中,您将使用 useTransition 钩子将开销较大的状态更新标记为非紧急更新,让界面保持响应,同时在后台进行繁重的渲染。
阻塞式更新问题
当您在搜索框中输入内容来筛选大型列表时,React 必须在每次击键时重新渲染整个筛选列表。这会阻塞输入框的即时更新,让界面感觉迟钝。
React 并发模式
React 18 引入了并发渲染:React 可以开始渲染状态更新、暂停渲染,并优先处理更紧急的更新(例如输入)。useTransition 就是用于将更新归类为低优先级过渡的钩子。
useTransition 基础
useTransition 返回 `[isPending, startTransition]`。请将非紧急的状态更新放在 `startTransition()` 中。React 会优先处理其他更新(例如受控输入),而不是过渡更新。
const [isPending, startTransition] = useTransition();
const handleChange = (e) => {
setInputValue(e.target.value); // urgent: update input immediately
startTransition(() => {
setFilteredList(filter(e.target.value)); // non-urgent
});
};使用 isPending 显示加载界面
过渡处理期间,`isPending` 的值为 `true`。您可以使用它显示加载指示器,或调暗过时的结果列表,让用户知道更新正在进行。
return (
<>
<input value={inputValue} onChange={handleChange} />
{isPending && <Spinner />}
<ResultList items={filteredList} />
</>
);startTransition 中应放入什么
只能将状态更新放入 startTransition 中,不要放入异步操作。需要包裹的是会触发开销较大渲染的状态更新。
// Correct
startTransition(() => setTab('heavy'));
// Wrong — async work outside React state
startTransition(async () => { await fetch(...); }); // not supported不使用钩子的 startTransition
如果您不需要 `isPending`,可以直接从 React 导入并调用 `startTransition`,无需使用该钩子。
import { startTransition } from 'react';
startTransition(() => setQuery(newValue));切换标签页示例
一个常见用例是:点击标签页切换繁重的组件。请将标签页切换放入 startTransition 中,这样活动标签页指示器会立即更新,而繁重的组件则在后台渲染。
const [tab, setTab] = useState('posts');
const [isPending, startTransition] = useTransition();
const selectTab = (t) =>
startTransition(() => setTab(t));useTransition 与 useDeferredValue
当您 OWN 状态更新时(也就是调用 setState),请使用 useTransition。当您接收无法直接延迟的属性或值时,请使用 useDeferredValue——它会延迟值本身。
不能替代优化
startTransition 不会让渲染速度更快,只会推迟渲染。如果组件需要 500ms 才能渲染,仍然需要 500ms。对于真正缓慢的列表,请结合使用 React.memo 或虚拟化。
快速检查
useTransition 返回的 isPending 表示什么?
回顾
useTransition 可以将状态更新归类为非紧急过渡。紧急更新(例如输入)会立即渲染;过渡更新会在 React 有处理能力时渲染。请使用 isPending 显示加载反馈。
下一课
下一课:**使用 useDeferredValue 实现输入防抖**——您将延迟界面中缓慢部分的重新渲染,同时保持输入灵敏迅速。
常见问题解答
「使用 useTransition 实现非阻塞式界面更新」课时是免费的吗?
是的 — 「使用 useTransition 实现非阻塞式界面更新」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。
「使用 useTransition 实现非阻塞式界面更新」这节课中我会学到什么?
将耗时的状态更新包裹在 startTransition 中,让界面保持响应。 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 React Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「使用 useTransition 实现非阻塞式界面更新」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 React Academy 课中编写并运行代码吗?
能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 竞态条件与 Effect 清理
- 使用 useTransition 实现非阻塞式界面更新
- 使用 useDeferredValue 实现输入防抖
- 使用 Suspense 划分数据与代码边界