// React Hooks
// ----------------------------------------------------------------------
// based on the code in https://github.com/facebook/react/pull/13968
// Unlike the class component setState, the updates are not allowed to be partial
type SetStateAction<S> = S | ((prevState: S) => S);
import React, { useState } from "react"
function App() {
const [num, setNum] = useState(1)
async function plus() {
setNum(num => num + 1)
setNum(num => num + 1)
setNum(num => num + 1)
}
async function minus() {
setNum(num - 1)
}
return (
<div className="App">
<h1>{num}</h1>
<button onClick={plus}>PLUS</button>
<button onClick={minus}>MINUS</button>
</div>
);
}
export default App;
// 첫번째 h1
>> 1
// 두번째 h1
>> 4
// 두번째 h1
>> 7
import { useState } from "react";
export default function StateTestT() {
const [memberId, setMemberId] = useState(1);
const updateMemberId = () => {
// (1)
setMemberId(memberId => memberId + 1);
setMemberId(memberId => memberId + 1);
setMemberId(memberId => memberId + 1);
// (2)
validateMemberId();
};
const validateMemberId = () => {
setMemberId(memberId => memberId + 1);
setMemberId(memberId => memberId + 1);
if (memberId > 3) {
console.log("5 이상");
return 0;
}
};
return (
<>
<div onClick={updateMemberId}>test</div>
</>
);
}
모든 함수를 하나로 합친다.
만약 모든 함수가 하나로 합쳐진다면, 그 안에서 하나의 임시변수를 통해 새로운 값을 저장하고 사용하면 된다. 하지만, 이 방법은 함수의 크기를 과하게 크게 만드는 부작용이 있다.
명시적으로 값을 다음 함수에 넘긴다.
위의 경우에서는 updateMemberId 함수 내부에서 validateMemberId를 호출할 때 value를 인자로 넘겨주자는 의미이다. 하지만, 이러한 방식은 코드를 이해하기 더욱 어렵게 만든다. 만약 로직이 조금 더 복잡해진다면 계속해서 인자값이 넘어가야하는 상황이 발생하고, 이는 유지보수의 비용을 증가시킨다.
reducer를 사용하는 방법
useState() 대신 useReducer()를 사용하는 것이다. useReducer()는 동기적으로 동작하기 때문에 useState()가 비동기적으로 동작함으로 인해 발생됐던 문제들을 해결할 수 있다. 하지만, 하나의 컴포넌트에서만 사용될 상태값들을 이렇게 전역으로 관리하는 것 자체가 너무 별로이다.