</>
⌕
Senior #concurrent#useTransition#useDeferredValue#react-18

Concurrent rendering: useTransition và useDeferredValue khác nhau thế nào?

⚡ Trả lời nhanh

Concurrent rendering cho phép React ngắt render ưu tiên thấp để xử lý tương tác khẩn cấp. useTransition đánh dấu một lần cập nhật state là non-urgent (có isPending); useDeferredValue tạo bản sao trễ của một giá trị khi bạn không kiểm soát được nơi set state.

function Search() {
  const [q, setQ] = useState("");
  const [list, setList] = useState(all);
  const [isPending, startTransition] = useTransition();

  const onChange = e => {
    setQ(e.target.value);                          // khẩn cấp: input mượt
    startTransition(() => setList(filter(all, e.target.value))); // có thể bị ngắt
  };
  return <>
    <input value={q} onChange={onChange} />
    {isPending && <Spinner />}
    <Results items={list} />
  </>;
}
useTransitionuseDeferredValue
BọcHàm set stateMột giá trị
Khi dùngBạn nắm code gọi setStateGiá trị đến từ props/hook ngoài
Trạng thái chờisPendingSo value !== deferred

Cả hai đều không debounce theo thời gian: React render bản cũ trước, bắt đầu render mới ở nền và bỏ nếu có update mới hơn. Hiệu quả nhất khi phần render nặng (list lớn); không giảm tổng khối lượng tính toán.

🃏 Ôn bằng flashcard