在构建 React 应用时,你是否遇到过这样的场景:用户在搜索框快速输入时,界面卡顿、响应迟缓?这通常是由于状态更新触发的繁重渲染任务阻塞了主线程,导致用户交互(如输入)无法及时响应。React 18 引入的 useTransition
Hook 正是解决这类问题的利器!
useTransition
的核心作用: 它允许你将某些状态更新标记为 “可中断的过渡(transition)”,让 React 区分高优先级更新(如用户输入)和低优先级更新(如搜索结果渲染),从而显著提升交互流畅度。
关键优势:
- 保持 UI 响应: 即使用户触发了需要复杂计算或数据获取的状态更新(如搜索过滤),他们的即时交互(如继续输入、点击按钮)仍能优先处理,不会卡顿。
- 内置状态标记: 它返回一个
isPending
标志,方便你在过渡期间显示加载指示器(如旋转图标、骨架屏),提升用户体验。
如何使用?
import {
useState, useTransition } from 'react';
function SearchBox() {
const [query, setQuery] = useState('');
const [results, setResults] = useState([]);
const [isPending, startTransition] = useTransition(); // 获取状态和函数
const handleChange = (e) => {
const newQuery = e.target.value;
setQuery(newQuery); // 高优:立即更新输入框
// 将耗时的结果更新包裹在 startTransition 中
startTransition(() => {
// 模拟耗时操作(如复杂计算、API 请求)
const filteredResults = massiveList.filter(item =>
item.name.includes(newQuery)
);
setResults(filteredResults); // 低优:可中断的更新
});
};
return (
<div>
<input type="text" value={
query} onChange={
handleChange} />
{
isPending && <span>加载中...</span>}
<ul>
{
results.map(item => <li key={
item.id}>{
item.name}</li>)}
</ul>
</div>
);
}
最佳实践:
- 将导致明显 UI 变化的非关键更新(如数据获取后渲染列表、页面导航)放入
startTransition
。 - 利用
isPending
提供视觉反馈。 - 避免将用户即时反馈所需的更新(如输入框、按钮点击)放入过渡。
useTransition
是 React 并发特性的重要组成部分,它让开发者能够更精细地控制更新优先级,轻松打造更流畅、响应更快的用户体验。立即在 React 18+ 项目中尝试它,告别卡顿!