You're correct — useDeferredValue
and startTransition
behave differently.
useDeferredValue
useDeferredValue2
(with startTransition
)function useDeferredValue2(val) {
const [deferred, setDeferred] = useState(val);
useEffect(() => {
React.startTransition(() => {
setDeferred(val);
});
}, [val]);
return deferred;
}
startTransition
.useDeferredValue3
(plain setState
)function useDeferredValue3(val) {
const [deferred, setDeferred] = useState(val);
useEffect(() => {
setDeferred(val);
}, [val]);
return deferred;
}
Hook | Priority | Time-Sliced Rendering | Uses Transition |
---|---|---|---|
useDeferredValue |
Normal | ❌ No | ✅ Internal deferral only |
useDeferredValue2 |
Normal | ✅ Yes | ✅ Yes |
useDeferredValue3 |
Immediate | ❌ No | ❌ No |
If your goal is to break up long renders and improve responsiveness, use startTransition
. useDeferredValue
is helpful for deferring values, but it won't split up rendering work.
Happy coding!!