Hooks - useState
2021. 9. 29. 15:41ㆍReact/문법
반응형
리액트 16.8 이전 버전에서는 함수형 컴포넌트에서는 상태를 관리할 수 없었는데요, 리액트 16.8 에서 Hooks 라는 기능이 도입되면서 함수형 컴포넌트에서도 상태를 관리할 수 있게 되었습니다. 이번에는 useState 라는 함수를 사용해보게 되는데, 이게 바로 리액트의 Hooks 중 하나입니다.
function Counter() {
const [number, setNumber] = useState(0);
const onIncrease = () => {
setNumber(number + 1);
}
const onDecrease = () => {
setNumber(number - 1);
}
return (
<div>
<h1>{number}</h1>
<button onClick={onIncrease}>+1</button>
<button onClick={onDecrease}>-1</button>
</div>
);
}
// 함수를 만들고, button 의 onClick 으로 각 함수를 연결해주었습니다.
// 리액트에서 엘리먼트에 이벤트를 설정해줄때에는 on이벤트이름={실행하고싶은함수} 형태로 설정
// 여기서 주의하셔야 하는 점은, 함수형태를 넣어주어야 하지, 함수를 다음과 같이 실행하시면 안됩니다.
// onClick={onIncrease()}
- input 엘리먼트 다루기
변경되는 값은 useState로 관리
이벤트에 등록하는 함수에서는 이벤트 객체 e 를 파라미터로 받아와서 사용 할 수 있음
e.target 은 이벤트가 발생한 DOM 인 input DOM을 가리킴
e.target.value 를 조회하면 현재 input 에 입력한 값을 알 수 있음
input 의 상태를 관리할 때에는 input 태그의 value 값도 설정
- 여러개의 input 엘리먼트 다루기
function InputSample() {
const [inputs, setInputs] = useState({
name: '',
nickname: ''
});
const { name, nickname } = inputs; // 비구조화 할당을 통해 값 추출
const onChange = (e) => {
const { value, name } = e.target; // 우선 e.target 에서 name 과 value 를 추출
setInputs({
...inputs, // 기존의 input 객체를 복사한 뒤
[name]: value // name 키를 가진 값을 value 로 설정
});
};
// 여기서 사용한 ... 문법은 spread 문법입니다. 객체의 내용을 모두 "펼쳐서" 기존 객체를 복사
// 이러한 작업을, "불변성을 지킨다" 라고 부릅니다.
// 불변성을 지켜주어야만 리액트 컴포넌트에서 상태가 업데이트가 됐음을 감지 할 수 있고
// 이에 따라 필요한 리렌더링이 진행됩니다.
// 만약에 inputs[name] = value 이런식으로 기존 상태를 직접 수정하게 되면,
// 값을 바꿔도 리렌더링이 되지 않습니다.
// 즉, 지금은 이것만 기억하세요. 리액트에서 객체를 업데이트하게 될 때에는 기존 객체를 직접 수정하면 안되고,
// 새로운 객체를 만들어서, 새 객체에 변화를 주어야 됩니다.
const onReset = () => {
setInputs({
name: '',
nickname: '',
})
};
return (
<div>
<input name="name" placeholder="이름" onChange={onChange} value={name} />
<input name="nickname" placeholder="닉네임" onChange={onChange} value={nickname}/>
<button onClick={onReset}>초기화</button>
<div>
<b>값: </b>
{name} ({nickname})
</div>
</div>
);
}
반응형
'React > 문법' 카테고리의 다른 글
배열 렌더링 (0) | 2021.09.29 |
---|---|
Hooks - useRef (0) | 2021.09.29 |
JSX 기본 문법 (0) | 2021.09.29 |
TypeScript (0) | 2021.09.27 |
Styled Component (0) | 2021.09.27 |