Open j03y14 opened 1 year ago
Suspense가 트리에 대한 콘텐츠를 표시하고 있다가 다시 일시 중단된 경우, 그 원인이 된 업데이트가 startTransition이나 useDeferredValue로 인한 것이 아니라면 fallback이 다시 표시됩니다.
->suspense 내부에서 fetch 하는 경우 transition 이 없으면 suspense 가 동작하지 않는다. 즉, transition이 우선된다.
Suspense는 Effect나 이벤트 핸들러 내부에서 페칭하는 경우를 감지하지 않습니다.
deffered value(지연값)과 트랜지션을 모두 사용하면 인라인 표시기를 위해 Suspense 폴백을 표시하지 않을 수 있습니다. 트랜지션은 전체 업데이트를 긴급하지 않은 것으로 표시하므로, 일반적으로 프레임워크 및 라우터 라이브러리에서 탐색을 위해 사용됩니다. 반면 지연값은 주로 UI의 일부를 긴급하지 않은 것으로 표시함으로써, 다른 UI들보다 “지연”시키고자 할 때 유용합니다.
useDefeeredValue랑 useTransition이랑 갑자기 헷갈리는데..
useDeferredValue: https://github.com/reactwg/react-18/discussions/129 startTrainsition: https://github.com/reactwg/react-18/discussions/41
useDeferredValue 및 startTransition은 대체로 동일한 동작을 갖습니다. 차이점은 주로 API가 적용되는 위치에 있습니다.
useDeferredValue를 두개의 렌더링을 예약하는 것으로 생각하면 된다.
Say initially
combobox.value
is"darth"
, and we've changed it to"obi"
.useCombobox
Hook updates.combobox.value
is"obi"
.useDeferredValue(combobox.value)
will return the already committed value. Similar to how Hooks likeuseDebouncedValue()
do. So it still returns"darth"
even thoughcombobox.value
is"obi"
."obi"
in a later render.<Results query="darth" />
. The container has 0.5 opacity because we set opacity based on whetherdeferredValue === value
, which isfalse
.useDeferredValue(combobox.value)
will return the new value. So it returns"obi"
.<Results query="obi" />
.<Suspense>
boundary in an urgent render would have caused us to commit a fallback. But that would be a poor user experience. (It's annoying when existing content disappears before your eyes.) Luckily, we're in a non-urgent render, which means React has the freedom to simply discard it.useDeferredValue(combobox.value)
will return the new value. So it returns"obi"
.<Results query="obi" />
.