React는 2013년에 처음 세상에 나왔고 2018년까지 전세계적으로 꾸준히 많이 사용되고 있었습니다.
당시까지 React에서 상태를 가지는 컴포넌트를 만들 수 있는 방법은 class를 사용하는 방법 뿐이었어요.
여러 컴포넌트에서 공통으로 사용하는 로직이 있어 재사용하고 싶은 경우 있죠?
😢 하지만 class에서는 재사용하기 힘들었어요.
복잡해질수록 점점 컴포넌트가 뚱뚱해집니다.
다양한 라이프사이클에 다양한 관심사의 로직이 흩어지는 일
이 자주 발생하였습니다.
같은 로직이 여러 라이프사이클 메서드에 중복
되는 일도 많았어요.
결국 React 16.8부터 Hooks API를 제공합니다.
class 없이도 React에서 제공하는 기능들을 사용할 수 있는 방법을 제공하기로 한 것이죠.
React가 기본적으로 제공해주는 몇 가지 hooks가 있어요.
필요하다면 자신만의 커스텀 hook을 만들어 사용할 수도 있습니다.
첫번째 문제인 컴포넌트 간의 로직 재사용
을 해결할 수 있게 되었습니다. (아주 나이스!)useEffect(
() => {
// render 이후 업데이트
return () => {
// cleanup - unmount
}
},
[dependencies]
);
두번째 문제인 라이프 사이클의 중복과 관심사 로직 흩어짐
을 해결할 수 있어요. (아주 나이스!)React Class를 사용해야만 하는 경우가 있긴 있어요
1. The component needs to maintain state.
2. The component is re-rendering too much and you need to control that via "shouldComponentUpdate"
3. You need a container component.
function useState(initialValue) {
var _val = initialValue;
function state() {
return _val;
}
function setState(newVal) {
_val = newVal;
}
return [state, setState];
}
useState훅을 통해 상태를 만들면 클로저를 활용하여 해당 지역 변수를 참조하거나 수정할 수 있네요.
useState를 함수 내에서 사용하면 클로저를 활용하게 되어 실질적으로는 외부에서 상태를 만들어 사용한다고 봐도 될까요..?
최상위에서만 Hook을 호출해야 합니다.
반복문, 조건문, 중첩된 함수내에서 호출하면 안됩니다.
ealry return 이 실행되기 전에 호출되어야 합니다.
📖 결론적으로 항상 동일한 순서로 Hook이 호출되는 것이 보장하여
useState나 useEffect가 여러 번 호출되어도 Hook의 상태를 올바르게 유지할 수 있도록 해줘야합니다.