728x90

useLayoutEffect()는 React Hooks의 하나로서, 컴포넌트의 렌더링이 완료된 직후에 실행되는 함수입니다. 이 함수는 일반적으로 DOM 노드의 크기나 위치와 같은 레이아웃 변경을 수행하기 위해 사용됩니다. useEffect()와 비슷하지만, useLayoutEffect()는 렌더링 직후에 실행되므로 화면에 렌더링된 이후에 바로 업데이트된 레이아웃 값을 가져올 수 있습니다.

useLayoutEffect()는 다음과 같이 사용할 수 있습니다.

import React, { useLayoutEffect, useRef } from 'react';

function MyComponent() {
  const ref = useRef(null);

  useLayoutEffect(() => {
    // ref.current의 값을 사용한 레이아웃 업데이트를 수행합니다.
    // 이 코드는 컴포넌트가 렌더링된 직후에 실행됩니다.
  }, [ref.current]);

  return <div ref={ref}>Hello, world!</div>;
}

이 코드에서는 useRef()를 사용하여 div 엘리먼트의 참조를 생성합니다. 그리고 useLayoutEffect()를 사용하여 ref.current 값의 변경을 감지하고, 해당 값이 변경될 때마다 레이아웃 업데이트를 수행합니다. 이렇게 함으로써, div 엘리먼트의 위치나 크기와 같은 레이아웃 정보를 가져올 수 있습니다.

useLayoutEffect()를 사용할 때 주의할 점은, 이 함수가 렌더링 직후에 실행되므로, 함수의 실행 시간이 길어지면 브라우저의 성능에 영향을 미칠 수 있다는 것입니다. 따라서, 이 함수에서는 가능한한 빠른 코드를 작성하는 것이 좋습니다.

React 18부터는 useEffect()useLayoutEffect() 대신에 useEffectLayout() 함수가 추가될 예정입니다. 이 함수는 useEffect()useLayoutEffect()의 기능을 모두 포함하며, useEffect()처럼 렌더링 후에 비동기로 실행되는 기능도 지원합니다. 이 함수는 다음과 같이 사용할 수 있습니다.

import React, { useEffectLayout, useRef } from 'react';

function MyComponent() {
  const ref = useRef(null);

  useEffectLayout(() => {
    // ref.current의 값을 사용한 레이아웃 업데이트를 수행합니다.
    // 이 코드는 렌더링된 이후 비동기로 실행됩니다.
  }, [ref.current]);

  return <div ref={ref}>Hello, world!</div>;
}

아래는 useLayoutEffect()를 사용한 예시 코드입니다. useLayoutEffect()를 사용하여 div엘리먼트의 크기와 위치를 업데이트합니다.

import React, { useLayoutEffect, useRef, useState } from 'react';

function MyComponent() {
  const ref = useRef(null);
  const [width, setWidth] = useState(0);
  const [height, setHeight] = useState(0);

  useLayoutEffect(() => {
    const { current } = ref;
    const { width, height } = current.getBoundingClientRect();
    setWidth(width);
    setHeight(height);
  }, [ref.current]);

  return (
    <div ref={ref}>
      <p>Width: {width}px</p>
      <p>Height: {height}px</p>
    </div>
  );
}

이 코드에서는 useRef()를 사용하여 div 엘리먼트의 참조를 생성합니다. 그리고 useLayoutEffect()를 사용하여 ref.current 값의 변경을 감지하고, 해당 값이 변경될 때마다 div 엘리먼트의 크기와 위치 정보를 가져와서 setWidth()setHeight()를 호출하여 업데이트합니다. 이렇게 함으로써, div 엘리먼트의 크기와 위치 정보를 가져와서 화면에 출력합니다.

useLayoutEffect()는 컴포넌트가 렌더링된 이후에 실행되므로, DOM 업데이트와 관련된 작업에서 유용합니다. 예를 들어, 모달 다이얼로그나 툴팁과 같은 컴포넌트를 구현할 때, useLayoutEffect()를 사용하여 해당 컴포넌트의 위치와 크기 정보를 업데이트할 수 있습니다.


내저장소 바로가기 luxury515

'Front-end > React.js' 카테고리의 다른 글

<search> 태크  (0) 2023.05.16
React Hook : useDebugValue()  (0) 2023.04.15
React Hook : useImperativeHandle()  (0) 2023.04.15
React Hook : useRef()  (0) 2023.04.15
React Hook : useMemo()  (0) 2023.04.15
728x90

React에서 useCallback()은 컴포넌트에서 성능을 최적화하기 위해 사용되는 Hook 중 하나입니다. 이 Hook은 메모이제이션된 함수를 반환하며, 이 함수는 컴포넌트가 렌더링될 때마다 새로 생성되지 않고 이전에 생성된 함수를 재사용합니다. 이를 통해 불필요한 함수 생성 및 연산을 방지하여 성능을 향상시킵니다.

useCallback()은 다음과 같은 구문으로 사용할 수 있습니다.

const memoizedCallback = useCallback(
  () => {
    doSomething(a, b);
  },
  [a, b],
);

useCallback()은 두 개의 인자를 받습니다. 첫 번째 인자는 메모이제이션된 함수이며, 두 번째 인자는 의존성 배열(dependency array)입니다. 두 번째 인자를 전달하지 않으면 useCallback()은 컴포넌트가 처음 마운트될 때 메모이제이션된 함수를 생성합니다. 의존성 배열에는 메모이제이션된 함수가 의존하는 값들을 나열합니다. 만약 의존성 배열에 있는 값이 변경되면, useCallback()은 새로운 메모이제이션된 함수를 생성합니다. 이 때, 새로 생성된 함수는 이전에 생성된 함수와 다를 수 있습니다.

다음은 useCallback()을 사용하여 의존성 변경을 추적하는 예제입니다.

import React, { useState, useCallback } from 'react';

function App() {
  const [count, setCount] = useState(0);
  const [text, setText] = useState('');

  const handleChange = useCallback((event) => {
    setText(event.target.value);
  }, []);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
      <input type="text" value={text} onChange={handleChange} />
    </div>
  );
}

export default App;

위 예제에서 handleChange 함수는 input 요소의 값이 변경될 때마다 호출됩니다. handleChange 함수는 setText 함수에 의존합니다. 그러나 setText 함수는 의존성 배열에 포함되어 있지 않습니다. 이 경우, 의존성 배열이 빈 배열([])로 설정되었으므로, useCallback()이 처음에 생성된 함수를 메모이제이션합니다. 그리고 이 함수는 항상 이전에 생성된 함수와 동일합니다.

하지만, setText 함수가 변경될 때마다 새로운 함수를 생성하려면, 의존성 배열에 setText 함수를 추가해야 합니다. 의존성 배열을 [setText]로 설정하면, setText 함수가 변경될 때마다 새로운 함수가 생성됩니다.

이제 의존성 배열을 [setText]로 설정하여 예제를 다시 실행해보면, input 요소의 값이 변경될 때마다 새로운 함수가 생성되는 것을 확인할 수 있습니다. 이전에는 새로운 함수가 생성되지 않았기 때문에, 불필요한 함수 호출이 발생할 수 있었습니다. 하지만 이제 useCallback()을 사용하여, setText 함수가 변경될 때마다 새로운 함수를 생성하므로, 불필요한 함수 호출을 방지하여 성능을 향상시킬 수 있습니다.


내저장소 바로가기 luxury515

'Front-end > React.js' 카테고리의 다른 글

React Hook : useRef()  (0) 2023.04.15
React Hook : useMemo()  (0) 2023.04.15
React Hook : useReducer()  (0) 2023.04.15
React Hook : useContext()  (0) 2023.04.15
React Hook : **`useEffect`** __()__  (0) 2023.04.15

+ Recent posts