요소의 크기와 viewport에 대한 요소의 위치에 대한 정보를 제공하는 DOMRect개체를 반환한다.
getRect = element.getBoundingClientRect();
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
메모이제이션된 값을 반환한다.
첫 번째 인자로는 함수, 두 번째는 의존성 값의 배열을 전달한다.
의존성이 변경되었을 때만 첫 번째 인자에 전달한 함수가 실행된다.
즉, 의존성이 변경되지 않았다면 이전에 실행해서 가지고 있던 값을 재활용하는 것이다.
const memoizedCallback = useCallback(
() => {
doSomething(a, b);
},
[a, b],
);
메모제이션된 콜백을 반환한다.
useMemo
와 비슷하지만 함수 메모이제이션에 특화된 훅!!
만약에 어떠한 함수가 렌더링이 되고 한 번만 생성하면 되는데 컴포넌트가 렌더링 될 때마다 함수를 재생성하게 된다면 비효율적이므로 그 함수를 useCallback
을 사용하여 특정한 값이 변경되었을 때만 생성되도록 하는 것이 바람직하다.
그리고 만약 그러한 함수가 useEffect
부수효과 함수안에서 사용이 된다면 의존성 배열에 해당하는 함수를 넣어줘야한다.
useState
의 대체 함수로
const [state, dispatch] = useReducer(reducer, initialState);
와 같이 사용합니다.
여러 개의 상태값을 관리할 때는 useReducer
hook을 사용하는게 좋다.
state : 상태값
dispatch : 상태값을 변경할 수 있는 함수
reducer : 매개변수로 여러 개의 상태값을 변경할 때 type
으로 무엇을 변경할 것인지를 결정짓는 함수
initialState : 초기값
<input type="text" value={state.name} onChange={e =>
dispatch({type: 'setName', name: e.currentTarget.value})
...
function reducer (state, action) {
switch (action.type) {
case 'setName':
return { ...state, name: action.name };
case 'setAddress':
return { ...state, address: action.address };
}
}
useReducer
로 상태값을 관리하고,contextAPI
로 상태값이나dispatch
함수를 내려주면 조금 더 효율적인 상태 관리를 할 수 있다.
클래스형 컴포넌트의 부모 컴포넌트는 ref 객체를 통해서 자식 컴포넌트의 메서드를 호출할 수 있다.
useImperativeHandle
hook을 사용하면 함수형 컴포넌트에서도 자식 컴포넌트에서 재공한 메서드를 호출해서 사용할 수 있다. 하지만 그 전에 자식 컴포넌트에 forwardRef(function name)
와 같이 사용해야한다.
useEffect
와 비슷하게 동작하지만 useLayoutEffect
는 모든 DOM이 변경된 후에 동기적으로 발생한다. 공식 문서에서는 "DOM에서 레이아웃을 읽고 동기적으로 리렌더링하는 경우에 사용하세요" 라고 한다. 즉 렌더링 결과가 DOM에 반영된 직후 바로 호출된다.
useLayoutEffect훅의 부수효과 함수에서 연산을 많이하게 될 경우 브라우저가 먹통이 될 수도 있으니 조심해야한다.
useLayoutEffect는 언제 사용??
useLayoutEffect 실행되는 시점
일반적인 경우 : 리액트 렌더링 -> DOM에 반영 -> 브라우저 화면에 그림
useLayoutEffect : 리액트 렌더링 -> DOM에 반영 -> useLayoutEffect 실행 -> 브라우저 화면에 그림
jsx란 HTML 문법을 JavaScript 코드 내부에 쓴 것,
자바스크립트 안에서 HTML을 사용해 view를 구성할 수 있게 도와주는 자바스크립트 문법으로 결국엔 babel에 의해 자바스크립트로 변환된다.