컴포넌트의 상태 변수를 생성 및 업데이트할 때 이용된다.
useState(initialState)
const [count,setCount] = useState(0);
count
에 저장되어 있고setCount
함수를 통해 업데이트할 수 있다. 예를 들어, 버튼을 누르면 카운트가 1씩 증가하도록
구현해보자.
const [count,setCount] = useState(0);
const handleAdd = () => setCount(count+1);
return(
<>
<p>{count}</p>
<button onClick={handleAdd}>1씩 증가<button>
</>
);
🧐 만약 setCount(count+1)를 n번 호출하면 count값이 n이 될까❓
➡️ No! 해당 함수가 호출될 때 현재 상태를 📸 찍어두는데 이때 count 변수가 초기값으로 고정되어 있다.
따라서 한번에 여러번 호출해도 이미 저장된 count 변수에서 1을 더하기 때문에 모두 1로 나온다.
setCount(count+1); //setCount(0 + 1)
setCount(count+1); //setCount(0 + 1)
setCount(count+1); //setCount(0 + 1)
만약 n번 호출 시 count가 n을 만들고 싶다면
이전 상태값을 받아온 다음 1씩 증가시켜주면 된다!
setCount(count => count+1); //setCount(0 => 1)
setCount(count => count+1); //setCount(1 => 2)
setCount(count => count+1); //setCount(2 => 3)
초기값 [1,2,3] 배열에서 다른 값들을 추가할 때
spread 문법을 이용한다.
const [arr,setArr] = useState([1,2,3]);
setArr([...arr,4,5,6);
배열에서 특정 아이템을 제거할 때 filter 메서드를 이용한다.
이 메서드를 통해 해당 아이템을 포함하지 않는 새로운 배열을 만들 수 있다.
const [arr,setArr] = useState([1,2,3]);
setArr(arr.filter(num => num !== 2));
const [shapes, setShapes] = useState([
{ id: 0, type: 'circle', x: 50, y: 100 },
{ id: 1, type: 'square', x: 150, y: 100 },
{ id: 2, type: 'circle', x: 250, y: 100 }
]);
const handleChange = () => {
setShapes(shapes.map((shape) => {
if(shape.type === 'square') return {...shape,y:shape.y+10};
return shape;
}))
return (
<>
<button onClick = {handleChange}>
직사각형이면 y값 업데이트
</button>
</>
);