useTransition
面试速答(30 秒版 TL;DR)
useTransition是 React 18 的并发特性 Hook,用来把一部分更新标记为低优先级过渡更新。- 它返回
[isPending, startTransition]。 - 核心价值是:把“可以稍后完成”的重更新让位给更紧急的交互更新,例如输入框输入优先,列表筛选结果随后更新。
- 它不是异步请求 Hook,也不会自动让代码并行,只是在 React 调度层给更新标优先级。
1. 它解决什么问题
有些更新必须马上反映:
- 输入框字符回显
- 按钮按下反馈
有些更新可以慢一点:
- 大列表筛选
- 复杂图表重算
- 大块内容切换
React 18 希望把这两类更新区分开,不让重更新卡住高优先级交互。
2. 基本用法
const [isPending, startTransition] = useTransition()
function handleChange(value: string) {
setInputValue(value)
startTransition(() => {
setKeyword(value)
})
}
这里的心智模型是:
setInputValue:紧急更新,先保证输入顺滑setKeyword:过渡更新,可以稍后完成
3. 它不是在做什么
3.1 不是发请求 Hook
useTransition 不负责网络请求生命周期,也不会替代:
useEffect- 数据库查询
- loading 状态库
3.2 不是节流/防抖
它不会减少更新次数,而是让 React 更聪明地安排更新优先级。
4. React 18 下的典型场景
4.1 搜索过滤
- 输入框值立刻更新
- 大列表过滤结果过渡更新
4.2 路由切换中的非阻塞更新
如果页面切换后有较重的组件树更新,过渡更新可以让界面更平滑。
5. isPending 有什么用
它表示当前过渡更新是否还没完成。
常见用法:
{isPending && <span>加载中...</span>}
注意它表达的是“过渡中的渲染状态”,不是通用请求状态。
6. 面试高频答法
Q1:useTransition 的核心价值是什么?
把更新分出优先级,让用户输入、点击这类紧急交互不被重渲染拖慢。
Q2:它和防抖有什么区别?
- 防抖:减少触发频率
- transition:不减少次数,但降低某些更新优先级
Q3:它和 useDeferredValue 有什么关系?
都和“把非紧急更新往后放”有关。
useTransition:你主动包一段更新useDeferredValue:你把某个值的消费延后
常见追问
1)所有更新都包 startTransition 会更好吗?
不会。紧急更新也被降级后,用户反而会觉得界面迟钝。
2)为什么输入框值本身通常不要放进 transition?
因为输入回显属于最高优先级交互,应该立即响应。
易错点/坑
- 以为
useTransition等于“异步请求管理”。 - 把所有更新都包进
startTransition。 - 不区分“交互紧急更新”和“可延后的重更新”。
速记要点(可背诵)
useTransition:React 18 并发特性,给更新降优先级。- 典型场景:输入回显优先,重列表/图表更新延后。
- 它是调度优化,不是请求 Hook,也不是防抖。