Salangdung_i의 기록

제어/비제어 컴포넌트(2) 본문

WEB FRONT END/React

제어/비제어 컴포넌트(2)

Salangdung_i 2024. 9. 19. 11:50
728x90
이전 스터디 

https://salangdung.tistory.com/351

 

제어/비제어 컴포넌트(1) SSOT원칙

요약키오스크 프로젝트의 CS 인입이 발생했다. 현상 : 키보드 컴포넌트에서 이전에 입력한 값이 input에 왕창 찍히는 현상이 발생확인 : 키보드에서 입력받은 text를 setState로 관리하고, 이 state가

salangdung.tistory.com

이전 스터디에서는 SSOT, 제어/비제어 컴포넌트의 정의 및 비제어컴포넌트가 SSOT 원칙에 왜 위배되는 것인지에 대해 포스팅을 했다. 동료들과 스터디 내용을 공유하면서 더 깔끔하게 이해된 부분이 있어서 오늘은 이 부분에 대해 포스팅해보려고 한다. 

 

제어/비제어 컴포넌트 사용 시점

제어 컴포넌트를 사용해야 하는 경우는 크게 4가지이다.

1. 상태 관리를 통한 UI 동기화가 필요한 경우
   사용자가 입력한 데이터가 React 컴포넌트의 상태에 직접 만영되고, 이 상태가 다시 UI에 영향을 미치는 경우 
2. 입력 데이터의 검증 및 처리 
   사용자가 입력한 데이터를 즉시 검증하거나, 입력 내용에 따라 다른 동작을 유발해야 하는 경우 
3. 폼의 초기값 설정 및 변경
   폼의 초기값을 프로그램 적으로 설정하거나, 특정 이벤트에 의해 입력 필드의 값을 변경해야 할 때
4. 외부 상태와 동기화 (Redux, MobX 등 제어컴포넌트) 

실제 예시로는 동적 폼 필드(ex. 로그인), 검색 필터, 실시간 채팅 애플리케이션 등이 있다. 

참고 : 제어/비제어 컴포넌트의 이해(사용시점)

 

제어 컴포넌트의 이해

제어 컴포넌트와 비제어 컴포넌트는 React에서 주로 사용하는 개념으로, 이들 간의 차이점과 각자 언제 사용하는지 이해하는 것이 중요합니다. React에 의해서 값이 제어되는 컴포넌트를 제어 컴

velog.io

 

 

제어/비제어 컴포넌트 구현 방식 비교

 

제어 컴포넌트 input 안에 텍스트를 입력했을 때 개발자 도구상에서도 입력한 데이터가 보이는 것을 확인수 있다. 하지만 비제어 컴포넌트로 데이터를 입력했을 경우에는 데이터의 변경을 확인할 수 없다. 

 

  • 제어 컴포넌트는 React의 상태로 관리되기 때문에 상태 변경이 React 개발자 도구에서 바로 확인 가능하다.
  • 비제어 컴포넌트는 DOM에 의해 직접 관리되므로, 개발자 도구에서는 상태 변화를 추적할 수 없으며, 직접 DOM에서 값을 가져와야 확인할 수 있다.

 

Next... 제어/비제어 컴포넌트를 이용한 라이브러리 비교 

 React 공식문서에서 제어 컴포넌트로 구현시 데이터를 변경하기 위해 이벤트 핸들러를 작성하고 또 State로 모든 입력 상태를 관리하기 때문에 많은 코드가 들어가고 이를 대체하기 위해 비제어 컴포넌트를 알려줬다. 완전한 해결책으로는  formik를 추천했다. 따라서 Formik에 대해 알아보고 Formik 라이브러리를 적용한 코드를 설명하려고 했었다.

스터디 중 React-hook-form 도 많이 쓰이며 같이 공부하고 비교해 보자는 요구사항이 있어서 로그인 폼을 각각 formik과 React hook form으로 구현해 보고 비교해 보기로 했다. 살짝 보았을 땐 제어 컴포넌트 기반  formik,  비제어 컴포넌트 기반 react-hook-form 이였다. 

참고 : [React] react-hook-form, formik, rc-field-form 폼 관리 어떤 걸로 해야 할까

728x90

'WEB FRONT END > React' 카테고리의 다른 글

제어/비제어 컴포넌트(1) SSOT원칙  (1) 2024.09.01
[기술면접] Lifecycle Method  (0) 2022.04.10
[기술면접] : useMemo와 useCallback  (0) 2022.04.10
[기술면접] Virtual DOM?  (0) 2022.03.30
React Hooks  (0) 2022.03.17