자바스크립트와 다른 react의 input
바닐라 자바스크립트로 <input> 요소의 value를 받아오고자 할 때 아래와 같은 순서를 거친다.
- HTML input 태그로 <input> 요소를 생성한다.
- 자바스크립트로 해당 <input> 요소 DOM을 받아온다. (querySelector, getElementById 등 사용)
- 받아온 DOM의 value 값을 가져온다.
하지만 리액트를 사용해 위와 같이 접근하려고 하면 문제가 생긴다.
JSX로 <input> 요소를 생성해도 자바스크립트와 달리 한 글자만 입력되는 난감한 상황이 펼쳐지기 때문이다.
이는 리액트 특유의 렌더링 방식 때문에 생기는 현상이다.
<input> 요소에 value 속성을 설정하고 onChange 핸들러를 제공하지 않으면
입력값이 리액트 상태에 반영되지 않는다. 리액트는 이때 사용자 입력을 감지하고 컴포넌트를 재렌더링하는데,
이때 사용자가 초기 <input> 요소의 value 값을 빈 문자열("")로 지정해 두었다면,
재렌더링하면서 <input> 요소의 내부 value 값을 다시 빈 문자열("")로 설정한다.
<input> 요소에 한 글자만 출력되는 이유
그럼 왜 빈칸이 아닌 한 글자만 출력되는 것일까?
브라우저는 사용자가 입력할 때 입력한 값을 일시적으로 <input> 요소에 표시한다.
하지만 리액트가 value 속성을 통해 이 요소를 제어하고 있기 때문에, 리액트는 다시 빈 문자열을 렌더링 한다.
이 과정에서 리액트가 상태를 업데이트하기 전까지 브라우저는 사용자가 입력한 첫 글자를 표시한다.
따라서 사용자가 입력할 때마다 첫 글자가 일시적으로 보이지만, 곧바로 리액트에 의해 덮어씌워지는 것이다.
리액트에서 <input> 사용방법
따라서 리액트에서 input을 올바르게 사용하려면 onChange 핸들러를 제공하고,
useState를 이용해 리액트가 상태 값을 올바르게 관리하도록 해야 한다.
import React, { useState } from 'react';
const MyForm = () => {
const [inputValue, setInputValue] = useState(''); //input값을 관리할 state 생성
const handleChange = (e) => {
setInputValue(e.target.value); //value값 업데이트
};
return (
<input
type="text"
value={inputValue}
onChange={handleChange}
/>
);
};
export default MyForm;
'REACT' 카테고리의 다른 글
(React) useState 배열, 객체 업데이트 패턴 정리 (0) | 2024.06.17 |
---|---|
(React) useState 기본 사용법 정리, 주의할 점 (0) | 2024.06.16 |
(React) vite를 이용한 리액트 세팅 방법 (0) | 2024.06.08 |