State
가 제어 컴포넌트고 Ref
가 비제어 컴포넌트로 이분적으로 구분 되는 개념은 아닙니다.온라인 모각코 스터디 하던 중, 취업한 한 스터디 팀원이 갑자기 들어와서는 '제어 컴포넌트와 비제어 컴포넌트 아시나요?' 라는 질문을 남겼습니다.
검색해보니 useState
와 useRef
의 개념에서 나온 단어구나라고 생각하려는 순간, 팀원분이 그런 개념이 아니라고 바로 정정 해주셨습니다. 공식 React 페이지에서도 useState
와 useRef
의 예시로 다루는데 다른 개념으로 설명해주셔서 한번 기록으로 남기고 싶은 생각이 들었습니다.
React에서는 변경할 수 있는 state가 일반적으로 컴포넌트의 state 속성에 유지되며 setState()에 의해 업데이트됩니다. (...) 이러한 방식으로 React에 의해 값이 제어되는 입력 폼 엘리먼트를 “제어 컴포넌트 (controlled component)“라고 합니다.
https://ko.reactjs.org/docs/forms.html#controlled-components
setState
를 통해 값을 제어하는 방식을 제어 컴포넌트라고 명칭하고 있습니다.모든 state 업데이트에 대한 이벤트 핸들러를 작성하는 대신 비제어 컴포넌트를 만들려면 ref를 사용하여 DOM에서 폼 값을 가져올 수 있습니다. (...)
비제어 컴포넌트는 DOM에 신뢰 가능한 출처를 유지하므로 비제어 컴포넌트를 사용할 때 React와 non-React 코드를 통합하는 것이 쉬울 수 있습니다.
https://ko.reactjs.org/docs/uncontrolled-components.html
ref
를 이용하여 DOM에서 폼값을 가져옵니다.const [state, setState] = useState<String>();
return(
<div>
<input value={state} onChange={(e) => setState(e.target.value)}/>
</div>
)
const [state, setState] = useState<string>();
return(
<UncontrolledComponent onChange={(e)=>setState(e)}/>
)
const UncontrolledComponent = ({defaultValue, onChange}) => {
const[innerState,setInnerState] = useState(defaultValue);
return <input value={innerState} onChange={(e)=>setInnerState(e.target.value)}/>
}
ref
뿐 아니라 이런식으로 외부 state가 내부 state에 영향을 미치지 못하게 하는 것도 비제어 컴포넌트라는 설명을 들었습니다.https://ko.reactjs.org/docs/forms.html#controlled-components