리액트 16.8 이후에 도입 되어 함수형 컴포넌트에서도 상태 관리가 가능해졌습니다.
Hook은 class 안에서는 동작하지 않습니다. 대신 class 없이 React를 사용할 수 있게 해주는 것입니다.
classical React의 문제점
이를 해결하기 위한 Hook이 등장, 필요한 것만 사용하자는 취지
Tip!! useState 함수로 초기값
초기값 할당 시 연산이 많은 값인 경우 함수를 사용한다. 또한, 초기 상태를 함수로 사용하기 때문에 리렌더링 시에는 다시 실행되지 않는다.
useState 코드
import React, { useState } from 'react';
function Example() {
// 새로운 state 변수를 선언하고, count라 부르겠습니다.
const [count, setCount] = useState(0); //state 변수 선언
return (
<div>
<p>You clicked {count} times</p> //<!-- state 가져오기 -->
<button onClick={() => setCount(count + 1)}> //state 갱신하기
Click me
</button>
</div>
);
------------
//클래스 컴포넌트에서 onClick을 익명함수로 바로 사용가능
class Example extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
render() {
return (
<div>
<p>You clicked {this.state.count} times</p>
<button onClick={() => this.setState({ count: this.state.count + 1 })}>
Click me
</button>
</div>
);
}
}
함수형 업데이트
기존 값을 어떻게 업데이트 할 지에 대한 함수를 등록하는 방식
const [count, setCount]=useState(0);
setCount(prev => prev + 1);
useState를 사용하여 여러 input 관리
여러 input을 사용하여 state를 관리해야 될 때 useState를 여러개 사용하여 관리할 수 있지만 다음과 같이 사용하면 한개의 state로 여러개
import React, { useState } from 'react';
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 로 설정
});
};
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>
);
}
onChange의 setInputs를 보면 spread를 사용하여 불변성을 지켜주었다. 그 이유는 리액트의 규칙 중 하나인 state를 업데이트 할 때 불변성을 지켜주어야되기 때문이다.