两者都把非紧急更新降级,区别在作用对象:useTransition 包装「触发更新的动作」,返回 [isPending, startTransition];useDeferredValue 包装「值」,返回一份滞后渲染的副本,适合你无法控制 setState 的场景,比如值来自父组件 props 或第三方库。

典型场景是搜索框:输入是紧急更新,用 startTransition 包裹过滤大列表的 setState;若过滤逻辑在子组件内部、父组件只传 keyword,则子组件用 useDeferredValue(keyword)。易错点:transition 里应放同步的 setState(React 19 起支持 async Action);deferred value 在延迟期间渲染用的是旧值,可比较新旧值来显示加载态。追问:并发渲染如何中断与复用中间结果。

const deferredQuery = useDeferredValue(query)
const list = useMemo(() => filter(data, deferredQuery), [deferredQuery])