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
커뮤니티에서 관례로 쓰이고 있다()
로 감싸는 것을 습관화 하자!