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