React에서 가장 핵심적인 useState와 useEffect에 대해서 정리해보려고 한다.
우선 React Hooks은 React 버전 16.8에서 새로 추가된 기능으로 Class를 안쓰고, 상태 값들과 여러 기능들을 사용할 수 있게 되었다.
Hook 이란? function component에서 React state와 lifecycle features을 연동(hook into)할 수 있게 해준다.
즉 Class없이 function으로 React 기능들을 사용하는 방법이다.
클래스 기반 구성 요소와 같은 상태를 사용할 수 있고, 상태 관련 로직을 재사용할 수 있다.
코드가 상당히 단순화되고 가독성이 좋다.
componentDidMount()와 componentDidUpdate()와 같은 것을 작성하는 것을 피할 수 있다. - Hook(useEffect) 통해 로직에 기반을 둔 함수로 해결
리액트 훅에서는 규칙이 있고, 규칙을 잘 지켜야 리액트가 각 훅의 상태를 기억하고 사용할 수 있다.
1) 최상위(at the top level)에서만 Hook을 호출해야 하고 반복문이나 조건문, 중첩된 함수 내에서 Hook을 실행하면 안된다.
(렌더링 간에 Hook을 건너뛰기 때문에 Hook 호출 순서는 달라지게 됩니다.)
EX)
import React, { useState } from "react"
function Hooks(props) {
if (!props.isExist) {
const [state, setState] = useState(); // Error!
}
const [state2, setState2] = useState(); // Error!
}
2) 오직 React 함수 내에서 Hook을 호출해야 한다.
일반적인 JavaScript 함수나 Hook을 호출하면 안된다. 대신 React 함수형 컴포넌트 안에서 호출하거나, 직접 만든 커스텀 Hook 안에서만 호출할 수 있다.
import React, { useState } from 'react';
const [count, setCount] = useState(0);
<button onClick={() => setCount(count + 1)}>
componentDidMount 나 componentDidUpdate, componentWillUnmount와 같은 목적으로 제공되지만, 하나의 API로 통합된 것이고, 리액트 컴포넌트가 렌더링 될 때마다 특정 작업을 수행하도록 설정 할 수 있다.
useEffect(() => {
console.log("componentDidUpdate")
})
useEffect(() => {
console.log("componentDidMount")
}, [])
useEffect(() => {
console.log("component did mount with useEffect!");
}, [number]);
useEffect(() => {
console.log("componentDidMount")
return () => console.log("componentWillUnmount")
}, [])
출처)
https://ko.reactjs.org/docs/hooks-intro.html#gatsby-focus-wrapper/ https://velog.io/@velopert/react-hooks