제어 입력은 input의 value를 상태에서 읽고 onChange에서 그 상태를 바꿉니다. 입력값과 검증 메시지를 같은 상태에서 계산할 수 있습니다.
데모는 키 입력이 이벤트에서 상태로, 다시 화면으로 돌아오는 순환을 보여줍니다. 매 타이핑마다 갱신되므로 큰 하위 트리가 같이 렌더된다면 상태를 더 작은 컴포넌트로 옮기세요.
언제 쓰나
입력 중 검증, 조건부 표시, 여러 필드 간 동기화가 필요할 때 사용합니다.
입력값의 정본을 React 상태에 두고, 입력 이벤트마다 상태를 갱신합니다.
<div class="scene"><div class="title">KEYSTROKE LOOP</div><div class="field">search <span id="typed"></span><i></i></div><div class="path"><span id="event" class="pill">onChange</span><span>→</span><span id="state" class="pill">state</span><span>→</span><span id="value" class="pill">value</span></div><div class="caption" id="caption">type → update → paint</div></div>.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}.title{font-weight:700;color:var(--accent)}.field{margin:clamp(10px,5vmin,38px) auto 10px;width:82%;padding:.7em;border:1px solid var(--accent);border-radius:9px;font-family:ui-monospace,monospace}.field i{display:inline-block;width:2px;height:1em;background:var(--accent);animation:blink .7s steps(1) infinite;vertical-align:-.15em}@keyframes blink{50%{opacity:0}}.path{display:flex;align-items:center;justify-content:space-around;gap:4px}.path .pill{min-width:22%;text-align:center}.caption{text-align:center;color:var(--muted);margin-top:10px}const words=["","r","re","rea","react"];let n=0;function tick(){const word=words[n%words.length];document.getElementById("typed").textContent=word;["event","state","value"].forEach((id,i)=>document.getElementById(id).classList.toggle("active",i===n%3));document.getElementById("caption").textContent="state: "+word;n++}tick();setInterval(tick,650)제어 입력은 input의 value를 상태에서 읽고 onChange에서 그 상태를 바꿉니다. 입력값과 검증 메시지를 같은 상태에서 계산할 수 있습니다.
데모는 키 입력이 이벤트에서 상태로, 다시 화면으로 돌아오는 순환을 보여줍니다. 매 타이핑마다 갱신되므로 큰 하위 트리가 같이 렌더된다면 상태를 더 작은 컴포넌트로 옮기세요.
입력 중 검증, 조건부 표시, 여러 필드 간 동기화가 필요할 때 사용합니다.