
const [state,setState] = useState(initalState)
useState hook을 사용할 때, 배열의 첫번째 순서는 상태(state) 이고, 두번째는 상태를 업데이트하는 상태 업데이트함수(setState)이다.useState 내부에는 initalState, 즉 상태의 초기값을 나타낸다.setState를 사용하는 방법은 두가지가 존재한다
1. 값을 기반한 업데이트
setState내부에서 업데이트할 값을 인자로 받는다.
function Counter() {
const [count, setCount] = useState(0);
const handleIncrement = () => {
// 기본적인 setState 사용
setCount(count + 1); // 새로운 값을 설정
};
return (
<div>
<p>Count: {count}</p>
<button onClick={handleIncrement}>Increment</button>
</div>
);
}
2. 콜백함수를 사용한 setState
setState가 이글을 쓰게된 주된 이유인데, 해당 setState는 React 엔진 내부에서 어떤 조건처리로 인하여, 콜백함수를 인자로 전달받을 수 있다. 해당 콜백함수는 이전 상태값(prevState)를 인자로 받아 새로운 값을 반환할 수 있다.setState는 이전 상태 값에 기반한 업데이트라고 부르며, 객체나 배열같은 복잡한 상태를 변경해야할 때 주로 쓰인다.function ComplexStateExample() {
const [user, setUser] = useState({
name: 'Seju',
age: 26,
email: 'seju@gmail.com'
});
const handleUpdateAge = () => {
// 이전 상태 값을 기반으로 새로운 값을 계산하여 업데이트
setUser(prevUser => ({
...prevUser,
age: prevUser.age + 1
}));
};
return (
<div>
<p>Name: {user.name}</p>
<p>Age: {user.age}</p>
<p>Email: {user.email}</p>
<button onClick={handleUpdateAge}>Increase Age</button>
</div>
);
}
user 상태가 객체로 관리되고 있으며, setUser에서 콜백함수를 이용해 이전 상태 값(prevUser)을 기반으로 새로운 객체를 생성하여 업데이트하고 있다.setUser 내부의 콜백함수에 인자로 전달한 prevUser는 useState로 관리되는 user상태의 이전 값을 나타낸다.useState로 호출할때 초기값으로 지정한 값인 user가 초기값이 되고, 이후 setUser를 호출해 user의 상태가 업데이트되면, React에서는 user의 상태를 자동으로 관리하며, 그 이전 값을 prevUser로 제공하는 형태이다.return 키워드를 사용하지 않아도 객체나 값이 반환되는 이유화살표 함수에서 단일 표현식으로 이루어진 경우, 자동으로 그 표현식의 결과가 암시적으로 return되기 때문이다.
따라서 아래 코드는 동일한 코드이다
// return 키워드 사용
const handleUpdateAge = () => {
setUser(prevUser => {
return {
...prevUser,
age: prevUser.age + 1
};
});
};
// 암시적 반환
const handleUpdateAge = () => {
setUser(prevUser => ({
...prevUser,
age: prevUser.age + 1
}));
};
❓ 암시적 반환에서 왜
() =>이후에()로 감싸나요
javascript 문법에서 중괄호 {}는 여러곳에서 사용된다.prevUser 이후에 ({...prevUser, age: prevUser.age + 1 }) 부분은 실제로 객체 리터럴을 생성하고 반환하는 부분인데, 이 부분을 ()로 감싸는 이유는 Javscirpt 문법적으로 인해 발생한다.()로 감싸주는 것이 React 커뮤니티에서 관례로 쓰이고 있다()로 감싸는 것을 습관화 하자!