지연 값

Deferred value

빠르게 바뀌는 값은 즉시 표시하고, 이를 쓰는 무거운 UI에는 이전 값을 잠시 유지합니다.

···
html
<div class="scene"><div class="search">search: <b id="query">R</b></div><div class="arrow">↓ deferred</div><div class="result"><div class="label">RESULTS FOR</div><strong id="deferred">R</strong><div class="cards"><i></i><i></i><i></i></div></div></div>
css
.scene{width:min(94vw,800px);height:min(86vh,320px);position:relative;overflow:hidden;display:flex;flex-direction:column;justify-content:space-between;border:1px solid var(--line);border-radius:14px;background:var(--surface);padding:clamp(9px,2.4vmin,20px);font:500 clamp(15px,4vmin,18px)/1.3 var(--font-sans,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif)}.scene b,.scene strong{font-weight:700}.label{color:var(--muted)}.code{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.pill{border:1px solid var(--line);border-radius:8px;padding:.4em .65em;background:var(--bg)}.active{border-color:var(--accent)!important;color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 10%,var(--surface))!important}.search{border:1px solid var(--accent);border-radius:8px;padding:.6em;font-family:ui-monospace,monospace}.search b{color:var(--accent)}.arrow{text-align:center;color:var(--muted);margin:8px}.result{border:1px solid var(--line);border-radius:9px;padding:.6em;background:var(--bg)}.result strong{font:700 clamp(17px,5vmin,28px) ui-monospace,monospace}.cards{display:flex;gap:5px;margin-top:7px}.cards i{height:clamp(18px,5vmin,30px);flex:1;background:color-mix(in srgb,var(--accent) 25%,var(--surface));border-radius:5px}
js
const words=["R","Re","Rea","Reac","React"];let n=0;function tick(){const i=n%5;document.getElementById("query").textContent=words[i];document.getElementById("deferred").textContent=words[Math.max(0,i-2)];n++}tick();setInterval(tick,650)

useDeferredValue는 전달한 값의 지연된 버전을 돌려줍니다. 새 값이 들어오면 React는 먼저 급한 화면을 그리고, 여유가 생기면 지연된 결과를 갱신합니다.

데모의 상단 검색어는 즉시 늘어나지만 하단 결과 쿼리는 한 박자 늦게 따라옵니다. 데이터 요청 취소나 캐시 정책은 별도로 설계해야 합니다.

언제 쓰나

입력은 즉시 보여주면서 느린 결과 영역이 UI를 막지 않게 할 때 사용합니다.

페이지로 열기 ↗