React Memo로 불필요한 재렌더링에 작별 인사하기: 단계별 튜토리얼

Patricia Arquette
풀어 주다: 2024-11-12 13:54:02
원래의
408명이 탐색했습니다.

Say Goodbye to Unnecessary Re-Renders with React Memo: Step-by-Step Tutorial

React 메모: 간단한 메모로 React 성능 향상

소개

React 애플리케이션은 불필요한 재렌더링이 성능에 큰 영향을 미칠 수 있는 대규모 데이터 세트와 복잡한 구성 요소를 다루는 경우가 많습니다. 이 문제를 해결하기 위해 React는 구성 요소를 최적화하고 렌더링 시간을 줄이는 간단하면서도 강력한 도구인 React.memo를 제공합니다. 이 가이드에서는 React Memo의 작동 방식, 유용한 이유, 구현 방법을 단계별로 살펴보겠습니다.


리액트 메모란 무엇인가요?

React.memo는 기능적 구성 요소를 메모하는 데 도움이 되는 React의 고차 구성 요소(HOC)입니다. 메모화는 입력을 기반으로 함수의 출력을 캐싱하는 프로세스이므로 함수는 동일한 입력에 대한 결과를 다시 계산할 필요가 없습니다. React Memo는 비슷하게 작동합니다. 즉, 구성 요소의 마지막 렌더링된 출력을 "기억"하고 props가 변경될 때만 다시 렌더링합니다.

왜 리액트 메모인가?

React에서는 상위 구성 요소가 다시 렌더링될 때마다 구성 요소가 다시 렌더링됩니다. 구성 요소의 출력이 상위 항목의 변경 사항에 의존하지 않는 경우 이로 인해 비효율성이 발생할 수 있습니다. 예를 들어 구성요소가 많은 복잡한 UI에서는 과도한 재렌더링으로 인해 지연이 발생할 수 있습니다. React Memo를 사용하면 필요한 경우에만 구성 요소를 업데이트하여 이를 최적화할 수 있습니다.


문제는 반응 메모로 해결됩니다.

1. 불필요한 재렌더링

상위 구성 요소가 다시 렌더링되면 해당 하위 구성 요소도 다시 렌더링됩니다. 이로 인해 특히 구성 요소가 정적 데이터를 표시하거나 변경되지 않는 소품에 의존하는 경우 성능 병목 현상이 발생할 수 있습니다.

2. 복잡한 UI에서 성능이 느리거나 느려집니다.

구성 요소가 깊게 중첩된 애플리케이션은 누적된 다시 렌더링으로 인해 성능이 저하될 수 있습니다. React Memo를 사용한 메모 기능은 업데이트가 필요하지 않은 구성 요소가 다시 렌더링되는 것을 방지하여 앱의 응답성을 향상시킵니다.


React 메모 작동 방식: 단계별 예

React Memo의 기본 구현을 살펴보겠습니다. 메모이제이션을 사용하지 않는 간단한 구성요소부터 시작하여 React Memo를 추가하면 어떤 차이가 있는지 살펴보겠습니다.

1단계: React 메모 없이 간단한 카운터 구성요소 설정

import React, { useState } from 'react';

function Counter({ count }) {
  console.log('Counter component re-rendered');
  return <h1>Count: {count}</h1>;
}

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

  return (
    <div>
      <Counter count={count} />
      <button onClick={() => setCount(count + 1)}>Increment Count</button>
      <input type="text" value={text} onChange={(e) => setText(e.target.value)} placeholder="Type something..." />
    </div>
  );
}

export default App;
로그인 후 복사
로그인 후 복사

설명

이 예에서는 입력 필드에 입력할 때마다 개수 값이 동일하게 유지되더라도 Counter 구성 요소가 다시 렌더링됩니다. 이는 React Memo를 통해 방지할 수 있는 불필요한 재렌더링입니다.

2단계: React Memo로 최적화하기

이제 Counter 컴포넌트를 React.memo로 래핑하여 최적화해 보겠습니다.

import React, { useState } from 'react';

function Counter({ count }) {
  console.log('Counter component re-rendered');
  return <h1>Count: {count}</h1>;
}

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

  return (
    <div>
      <Counter count={count} />
      <button onClick={() => setCount(count + 1)}>Increment Count</button>
      <input type="text" value={text} onChange={(e) => setText(e.target.value)} placeholder="Type something..." />
    </div>
  );
}

export default App;
로그인 후 복사
로그인 후 복사

설명

React.memo를 사용하면 Counter 구성 요소는 count prop이 변경된 경우에만 다시 렌더링됩니다. 이제 입력 필드에 입력해도 더 이상 카운터가 다시 렌더링되지 않아 성능이 크게 최적화됩니다.


React 메모 실행: 목록을 사용한 실제 시나리오

React Memo의 실제 이점을 알아보기 위해 좀 더 복잡한 예를 살펴보겠습니다. 각 항목 옆에 '좋아요' 버튼이 있는 항목 목록이 있다고 가정해 보겠습니다. 개별 항목에 좋아요를 표시할 때 React Memo가 과도한 재렌더링을 어떻게 방지할 수 있는지 보여드리겠습니다.

1단계: 메모 없이 목록 구성 요소 만들기

import React, { useState } from 'react';

const Counter = React.memo(function Counter({ count }) {
  console.log('Counter component re-rendered');
  return <h1>Count: {count}</h1>;
});

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

  return (
    <div>
      <Counter count={count} />
      <button onClick={() => setCount(count + 1)}>Increment Count</button>
      <input type="text" value={text} onChange={(e) => setText(e.target.value)} placeholder="Type something..." />
    </div>
  );
}

export default App;
로그인 후 복사

문제

위 코드에서는 한 항목에 좋아요를 표시하면 한 항목의 좋아요만 변경되더라도 모든 항목이 다시 렌더링됩니다.

2단계: React Memo로 항목 구성 요소 최적화

import React, { useState } from 'react';

function Item({ item, onLike }) {
  console.log(`Rendering ${item.name}`);
  return (
    <div>
      <h2>{item.name}</h2>
      <button onClick={() => onLike(item.id)}>Like</button>
    </div>
  );
}

function ItemList() {
  const [items, setItems] = useState([
    { id: 1, name: 'Item 1', likes: 0 },
    { id: 2, name: 'Item 2', likes: 0 },
    { id: 3, name: 'Item 3', likes: 0 },
  ]);

  const handleLike = (id) => {
    setItems((prevItems) =>
      prevItems.map((item) =>
        item.id === id ? { ...item, likes: item.likes + 1 } : item
      )
    );
  };

  return (
    <div>
      {items.map((item) => (
        <Item key={item.id} item={item} onLike={handleLike} />
      ))}
    </div>
  );
}

export default ItemList;
로그인 후 복사

결과

이제 클릭한 좋아요 항목만 다시 렌더링되므로 UI가 훨씬 빠르고 효율적이 됩니다.


리액트 메모는 언제 사용하나요?

React Memo는 특정 시나리오에서 유용하지만, 어디에서나 사용하면 실질적인 이점을 추가하지 못한 채 코드가 복잡해질 수 있습니다. 특히 효과적일 수 있는 몇 가지 주요 상황은 다음과 같습니다.

  1. 정적 구성요소: 머리글이나 바닥글과 같이 자주 변경되지 않는 구성요소
  2. 순수 기능 컴포넌트: 렌더링을 위해 props에만 의존하는 컴포넌트
  3. 대규모 구성 요소 목록: 불필요한 재렌더링을 피해야 하는 많은 항목이 포함된 목록입니다.

잠재적인 함정과 모범 사례

  1. 얕은 비교: React Memo는 얕은 비교를 수행합니다. 즉, 깊이 중첩된 객체나 배열의 변경 사항을 감지하지 못합니다. 복잡한 props를 전달하는 경우 useMemo 또는 useCallback 사용을 고려해보세요.

  2. 성능 모니터링: React DevTools를 사용하여 메모이제이션으로 실제로 이점을 얻는 구성 요소를 식별합니다. React Memo를 과도하게 사용하면 코드가 복잡해지고 성능 향상은 미미할 수 있습니다.


자주 묻는 질문(FAQ)

Q1: React Memo는 useMemo 및 useCallback과 어떻게 다릅니까?

  • React Memo는 props를 기반으로 컴포넌트 리렌더링을 최적화합니다.
  • useMemo는 구성 요소 내에서 계산된 값을 캐시합니다.
  • useCallback은 함수를 캐시하여 렌더링할 때마다 함수가 다시 생성되는 것을 방지합니다.

Q2: 클래스 컴포넌트와 함께 React Memo를 사용할 수 있나요?

아니요, React Memo는 기능적 구성요소에만 사용됩니다. 그러나 클래스 구성 요소의 경우 PureComponent를 사용하면 유사한 동작을 달성할 수 있습니다.


결론

React Memo는 불필요한 재렌더링을 줄이고 React 애플리케이션 성능을 향상시키는 귀중한 도구입니다. 순수 기능 구성 요소나 정적 UI 요소에 선택적으로 사용하면 구조를 복잡하게 하지 않고도 React 앱을 최적화할 수 있습니다. 다음 단계에 따라 예제를 시도하고 계속 실험하여 프로젝트에 가장 적합한 메모 전략을 찾으세요!

위 내용은 React Memo로 불필요한 재렌더링에 작별 인사하기: 단계별 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿