비제어 컴포넌트 vs 제어 컴포넌트

2023. 7. 3.·🎨 프론트엔드 공부/React & Next

📍비교

✅비제어 컴포넌트 (uncontrolled)

- 로컬 변수만을 갖는 컴포넌트

- 부모 컴포넌트가 영향을 줄 수 없음

 

✅제어 컴포넌트 (controlled)
- 컴포넌트의 중요한 정보가 props에 의해 구동됨
- 부모 컴포넌트가 props를 통해 이 컴포넌트를 완전히 제어

컴포넌트 대신 element에도 적용할 수 있다

 

📍비제어 input element 예시

- 전통적인 HTML의 form 입력과 비슷

- Form 컴포넌트는 input에서 값을 "pull" 해와야 함 (예 - form 제출 전에)

예) input element의 실시간으로 바뀌는 값을 ref 를 통해서 구할 수 있음

const FormComponent = () => {
  const inputEl = useRef(null);

  return (
    <>
      <input type="text" ref={inputEl} />
      <button onClick={() => console.log(inputEl.current.value)}>클릭!</button>
    </>
  );
};

 

📍제어 input element 예시

- 현재 값, 값을 제어할 수 있는 콜백 함수를 props로 전달받음 (부모로부터)

- 비제어 컴포넌트보다 더 "React"스러운 방식 (항상 사용해야하는 것은 아님)

- Form 컴포넌트에 값을 "push" 하는 방식 (Form 컴포넌트가 항상 최신 값을 가짐)

- 이는 상태와 UI(input)가 항상 일치하는 것을 의미

=> validation이나 input이 비었을 때 button element를 비활성화할 수 있음

const FormComponent = () => {
  const [inputValue, setInputValue] = useState("");
  
  return (
    <>
      <input type="text" value={inputValue} onChange={(e) => setInputValue(e.target.value)} />
      <button onClick={() => console.log(inputValue)}>클릭!</button>
    </>
  );
};

 

📍결론: element를 controlled 하게 만드는 것

✅props를 통해 값을 설정하면 제어 컴포넌트(엘리먼트)라고 할 수 있다

- input element의 다른 예시

 

- 장점과 단점

 

📍참고

https://react.dev/learn/sharing-state-between-components#controlled-and-uncontrolled-components

 

Sharing State Between Components – React

The library for web and native user interfaces

react.dev

 

https://goshacmd.com/controlled-vs-uncontrolled-inputs-react/

 

https://goshacmd.com/controlled-vs-uncontrolled-inputs-react/

 

goshacmd.com

 

'🎨 프론트엔드 공부/React & Next' 카테고리의 다른 글
  • [React] drag로 element 옮기기 직접 구현
  • [React] 불필요한 리렌더링 제거하기
  • React lazy
  • React forwardRef
지식물원
지식물원
지식이 자라는 식물원!
  • 지식물원
    지식물원
    지식물원
  • 전체
    오늘
    어제
    • 분류 전체보기 (516) N
      • 🎨 프론트엔드 공부 (253) N
        • JS & TS (92) N
        • HTML & CSS (22)
        • React & Next (49)
        • Vue & Nuxt (22)
        • 기타 (68)
      • 🤓 기술 학습 & 공부 기록 (116)
        • Node.js (0)
        • Python (37)
        • 백엔드 (0)
        • 딥러닝 (1)
        • 컴퓨터 일반 (72)
        • 개발 인프라 (6)
      • 👨‍💻 프로젝트 경험 (6)
        • Work (0)
        • Toy (6)
      • ⚙️ 개발 팁 & 노하우 (21)
        • 프론트엔드 (6)
        • 기타 (15)
      • ☕️ 커리어 & 인터뷰 준비 (88)
        • 코딩 테스트 (88)
      • 📰 기술 트렌드 & 생각 정리 (4)
      • 📚 기타 (25)
        • 마케팅 (15)
        • 비개발서적 (10)
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

    • 모바일 접속 시 코드 하이라이팅 깨질 때
  • 인기 글

  • hELLO· Designed By정상우.v4.10.3
지식물원
비제어 컴포넌트 vs 제어 컴포넌트
상단으로

티스토리툴바