: React 컴포넌트의 상태(state)에 의해 값이 제어되는 폼 요소
e.g. input, textarea, select ...
const ControlledForm = () => {
const [nameInputError, setNameInputError] = useState("");
const [name, setName] = useState("");
useEffect(() => {
if (name.length < 2) {
setNameInputError("Name must be two or more characters");
} else {
setNameInputError("");
}
}, [name]);
return (
<form>
<p>{nameInputError}</p>
<input
name="name"
type="text"
placeholder="Name"
value={name}
onChange={(e) => setName(e.target.value)}
/>
<button>Submit</button>
</form>
);
};
: React 컴포넌트의 상태(state)에 의해 값이 제어되지 않는 폼 요소
const UncontrolledForm = () => {
const nameInput = useRef();
const handleSubmit = (e) => {
console.log(nameInput.current.value);
e.preventDefault();
};
return (
<form onSubmit={handleSubmit}>
<input name="name" type="text" placeholder="Name" ref={nameInput} />
<input type="submit" value="Submit" />
</form>
);
};
제어 컴포넌트 | 비제어 컴포넌트 |
---|---|
React가 값을 관리 | DOM이 값을 저장 |
사용자의 입력이 항상 state로 push | 입력값이 필요할 때, element에서 pull |
React가 값이 항상 일치함을 보장 | 값이 항상 일치함을 보장하지 않음 |
리렌더링이 발생 | 리렌더링이 발생하지 않음 |
App() {
const [shouldShowModal, setShouldShowModal] = useState(false);
return (
<>
<h3>UncontrolledModal</h3>
<UncontrolledModal>This is uncontrolled modal.</UncontrolledModal>
<h3>ControlledModal</h3>
<ControlledModal
shouldShow={shouldShowModal}
onRequestClose={() => setShouldShowModal(false)}
>
This is controlled modal.
</ControlledModal>
<button onClick={() => setShouldShowModal(true)}>Show Modal</button>
</>
);
}
비제어 모달 컴포넌트는 모달의 상태(shouldShow
) 컴포넌트 내부에서 자체적으로 관리한다.
const UncontrolledModal = ({ children }) => {
const [shouldShow, setShouldShow] = useState(false);
return (
<>
<button onClick={() => setShouldShow(true)}>Show Modal</button>
{shouldShow && (
<ModalBackground onClick={() => setShouldShow(false)}>
<ModalBody onClick={(e) => e.stopPropagation()}>
<button onClick={() => setShouldShow(false)}>X</button>
{children}
</ModalBody>
</ModalBackground>
)}
</>
);
};
제어 모달 컴포넌트는 모달의 상태(shouldShow
)를 부모 컴포넌트로부터 props로 받아와 제어한다.
const ControlledModal = ({ shouldShow, onRequestClose, children }) => {
return shouldShow ? (
<ModalBackground onClick={onRequestClose}>
<ModalBody onClick={(e) => e.stopPropagation()}>
<button onClick={onRequestClose}>X</button>
{children}
</ModalBody>
</ModalBackground>
) : null;
};
이 글은 아래 링크를 참고하여 작성한 글입니다.
Controlled vs Uncontrolled Components | React Design Pattern -3