hooks란 functional component에서도 state와 기타 다른 사이드 이펙트를 다루기 위해 탄생하였다.
functional component는 hook 탄생 이전에 state를 기질 수 없기에 주로 dumb component로만 활용되었다. hook의 등장으로 주목받기 시작하였다.
첫째, 컴포넌트간 상태 관련 로직 재사용하기 어렵다는 점이었다.
둘째, 컴포넌트가 커질수록 복잡해지는 로직때문이다. componentDidmout에서 너무 많은 일을 하게 된다.
셋째, class의 this 키워드에서 오는 좋지 못한 경험이다.
먼저, 모든 hook을 사용할때 최상단에서 호출 하여야만 한다.
class 컴포넌트의 동작은,
component 생성시 instance를 생성하고
component 최초 랜더시 Class 내부 render method 호출을하고
component 업데이트시 class 내부 render method 호출을 한다.
functional 컴포넌트의 동작은,
component 생성시 function을 호출하고,
component 최초 랜더시 function을 호출하고,
component 업데이트시 function을 호출한다.
즉, 랜더링 = 함수호출
다음으로는, React 함수에서만 hook을 사용해야한다.
export const ComponentA = (props) => {
const {width, height} = useWindowDimensions();
{...etx code}
}
export const ComponentA = (props) => {
useBackHandler(()=>{
return true
});
{...etc code}
}
export const ComponentA = (props) => {
const currentAppState = useAppState(); // active, background, inactive(only ios)
{...etc code}
}
export const ComponentA = (props) => {
const navigation = useNavigation();
const routes = useRoute();
{...etc code}
}
export const ComponentA = (props) => {
const isFocused = useIsFocused();
useFocusEffect(useCallback(()=>{
// focus가 되었을때의 처리
},[userId]));
{...etc code}
}
export const ComponentA = (props) => {
const scrollViewRef = useRef();
useScrollToTop(scrollViewRef);
{...etc code}
}
export const ComponentA = (props) => {
useMount(() => {
// on mount 처리
});
}
export const ComponentA = (props) => {
const [count, setCount] = useState(0);
const prevCount = usePrevios(count);
{...etc code}
}