기본 : input태그의 value프로퍼티로 input태그의 값을 가져올 수 있다.
다음과 같이 input태그들의 값을 담을 state를 만든다.
const [values, setValues] = useState({
title: '',
writer: '',
content: '',
});
tite, writer, content는 각 input태그들이 갇는 name프로퍼티다. 편의를 위해 통일시킨 것임.
그리고 다음과 같이 handleChange함수를 만든다.
const handleChange = (e) => {
setValues(prevValues => {
const { name, value } = e.target;
return {
...prevValues,
[name]: value
};
};
};
각 input 태그들에 다음과 같이 onChange프로퍼티로 멕여준다.
<form>
<input type="text" name="title" value={values.title} onChange={handleChange} />
<input type="text" name="writer" value={values.writer} onChange={handleChange} />
<input type="text" name="content" value={values.content} onChange={handleChange} />
<button type="submit">제출</button>
</form>
리액트에서의 onChange에서는 순수JS에서의 oninput이벤트와 같다. 즉 뭔가 입력할 때마다 발생! 이로 인해 input태그의 값들과 values state는 항상 같은 값을 지니게 된다.
그리고 제출 버튼을 누르면 동작할 form태그의 submit이벤트에 대해선 고냥 values state의 값들 이용하면 된다. 이 방법을 배우기 전까지는 제출 버튼이 눌리면 그 때 input태그의 값들을 읽어오는 방식을 써야 된다고 생각했는데, 버튼이 눌리기 전에 위에서 한 것처럼 state에 input태그 값들을 onChange를 통해서 일치시키고 제출이 눌리면 바로 state를 활용하는 방법을 쓸 수도 있다는 걸 배웠다.
참고로 form태그는 submit이벤트에 대해 기본적으로 GET메소드로 input태그들의 값을 보내니까 이를 방지할 것. 방지하는 방법은 e.preventDefault()를 쓰면 됨.
또한 위 코드에서 input태그들에 value 프로퍼티를 딱히 줄 필욘 없음. 저게 없어도 input태그 값 가져오는 건 가능하니까. 다만 저렇게 하면 항상 state값 == input태그값이 됨 즉 input태그의 값이 제어되는 효과를 준다.
예를 들어, input태그에서 소문자로 입력을 해도 setState에서는 state에 upper를 해서 저장해둔다면 input태그의 값들도 대문자로 알아서 바뀌는 효과를 줄 수 있음. 즉 input태그의 값이 제어되는 것! 이런 컴포넌트를 controlled component라 하고, 쓰나 안 쓰나라면 controlled component로 하는 게 좋다고 한다.
※ 참조
https://ko.reactjs.org/docs/forms.html
'WEB > REACT & NEXT' 카테고리의 다른 글
[React.js] React Router - useNavigate()와 useLocation()으로 데이터 주고받기 (0) | 2022.07.27 |
---|---|
[React.js] Ref는 뭐고 왜 쓰는 걸까 (0) | 2022.07.27 |
[짧][React.js] 렌더링이 2번 되는 현상 (0) | 2022.07.25 |
[React.js] useEffect 정리 (0) | 2022.07.13 |
[React.js] 좀 더 간편하게 의존성 주입 쓰는 법 (0) | 2022.07.08 |