오늘은 useEffect
를 공부하며 배웠던 리액트 라이프사이클에 대해 정리한다.
리액트 클래스 컴포넌트는 라이프 사이클 메서드를 사용하고, 함수형 컴포넌트는 Hook을 사용한다.
여기서 '컴포넌트'는 생성(mounting) -> 업데이트(updating) -> 제거(unmounting)의 생명주기를 갖는다.
this.props
,this.state
에 접근하여 리액트 요소를 반환한다.props
로부터 받아온 것을 state
에 넣을 때 사용한다.props
나 state
가 바뀌었을 때 호출되는 메서드이다.React.memo
와 유사하며, boolean
으로 반환이 결정된다.useEffect
의 의존성 매개변수가 변할때만 실행되는 것과 같다. 바뀐 값이 있어야만 실행되는 메서드setTimeout
이 있다면 clearTimeout
을 통해 제거된다.※ React-Hook 이란? - 공식문서는 여기!
Hook은 React 16.8에 새로 추가된 기능입니다. Hook은 class를 작성하지 않고도 state와 다른 React의 기능들을 사용할 수 있게 해줍니다.
즉, Hook 은 함수형 컴포넌트가 클래스 컴포넌트의 기능을 사용할 수 있도록 해주는 기능이다.
※ 도입된 계기에 대한 - 공식문서는 여기!
최상위(at the top level)에서만 Hook을 호출해야 합니다. 반복문, 조건문, 중첩된 함수 내에서 Hook을 실행하지 마세요.
React 함수 컴포넌트 내에서만 Hook을 호출해야 합니다. 일반 JavaScript 함수에서는 Hook을 호출해서는 안 됩니다.
추가로, Eslint 를 사용하면 위 2가지 규칙을 강제시킬 수 있다.
const [ state, setState ] = useState(초기값);
state
는 변수, setState
는 state
를 변경시켜주는 함수이다.useState
는 state
,setState
를 return
하면서 초기값을 설정해주는 hook 이다.useEffect(() => {});
// 렌더링 결과가 실제 돔에 반영된 후마다 호출, 모든 경우에 호출되며 실행된다.
useEffect(() => {}, []);
// 컴포넌트가 처음으로 마운트 되었을 때 실행된다. 그 이후에는 실행되지 않는다.
useEffect(() => {}, [의존성1, dependency2, ..]);
// 조건부 effect 발생, 의존성 중 하나가 변경된다면 effect는 항상 재생성된다.
// 만약 dependency 에 들어있던 값이 3번 번경된다면 useEffect 함수는 3번 실행된다.
useEffect
함수가 포함된 컴포넌트가 처음 마운트되거나 컴포넌트가 리렌더링 될 때,
선언된 변수의 값이 변경되거나 redux, recoil 등 상태의 값이 변경될 때 실행할 구문들을 정의해놓은 함수이다.
+) useEffect
에는 컴포넌트가 언마운트될 때 실행되는 cleanup
함수라는 기능이 있다!
useEffect(() => {
... // 실행할 내용
return () => {
... // cleanup
}
});
useLayoutEffect
를 활용하면 된다.// - App.js
import React, { createContext } from "react";
import Children from "./Children";
// Context 객체를 생성한다.
export const AppContext = createContext();
const App = () => {
const user = {
name: "홍길동",
age: 25,
};
return (
<>
// AppContext 로 Children 컴포넌트를 감싸면 AppContext 하위의 컴포넌트에서
// value 를 사용할 수 있게 된다.
<AppContext.Provider value={user}>
<div>
<Children />
</div>
</AppContext.Provider>
</>
);
};
export default App;
// - Children.js
import React from "react";
import { AppContext } from "./App";
const Children = () => {
return (
<AppContext.Consumer>
{(user) => (
<>
<h3>user의 이름은 {user.name}입니다.</h3>
<h3>user의 나이는 {user.age}입니다.</h3>
</>
)}
</AppContext.Consumer>
);
};
export default Children;
createContext
: Context 객체를 만든다.Provider
: 생성된 Context 의 props 를 하위 컴포넌트에 전달하는 역활을 한다.Consumer
: Context 의 변화를 감시하는 역활을 한다.const [state, dispatch] = useReducer(reducer, initialArg, init);
useState
의 대체 함수로 컴포넌트 상태 업데이트 로직을 컴포넌트에서 분리시킬 수 있다.(state, action) => newState
의 형태로 reducer
를 받고 dispatch
메서드와 짝의 형태로 현재 state
를 반환합니다.reducer
란 현재 상태와 액션 객체를 파라미터로 받아와서 새로운 상태를 반환해주는 함수이다.const memoizedCallback = useCallback(
() => {
doSomething(a, b);
},
[a, b],
);
useCallback(fn, deps)
은 useMemo(() => fn, deps)
와 같다.const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
useEffect
와 마찬가지로 deps배열을 넣어주면 되는데useMemo
의 첫번째 인자는 결과값을 생성해주는 팩토리 함수이고, 두번째 인자는 기존 결과값 재활용 여부의 기준이되는 입력값 배열입니다.const refContainer = useRef(initialValue);
useRef
는 .current
프로퍼티로 전달된 인자(initialValue
)로 초기화된 변경 가능한 ref 객체를 반환한다. 반환된 객체는 컴포넌트의 전 생애주기를 통해 유지된다.useRef
란 어떠한 특정 DOM을 선택할 수 있게 해준다.querySelector
와 비슷하게 사용된다.function TextInputWithFocusButton() {
const inputEl = useRef(null);
const onButtonClick = () => {
// `current` points to the mounted text input element
inputEl.current.focus();
};
return (
<>
<input ref={inputEl} type="text" />
<button onClick={onButtonClick}>Focus the input</button>
</>
);
}