⊗jsrtPmHkAMe 15 of 47 menu

React의 memo API

다음 훅을 살펴보기 전에, 컴포넌트의 props가 변경되지 않을 때 불필요한 리렌더링을 방지하는 데 도움이 되는 유용한 API memo에 대해 언급할 필요가 있습니다.

예제를 통해 살펴보겠습니다. 이름과 성을 입력한다고 가정하고, 두 개의 입력 필드가 있는 App 컴포넌트를 만들어 보겠습니다:

return ( <div> <label> name: <input value={name} onChange={(e) => setName(e.target.value)} /> </label> <br /> <label> surname: <input value={surn} onChange={(e) => setSurn(e.target.value)} /> </label> </div> );

컴포넌트 상단에 각각의 상태를 추가하겠습니다:

const [name, setName] = useState(''); const [surn, setSurn] = useState('');

자식 컴포넌트 Child.js도 만들어 보겠습니다. 입력된 이름을 보여주는 인사말을 출력하도록 하고, 이 컴포넌트가 렌더링될 때마다 콘솔에 문자열 'child render'가 출력되도록 하겠습니다:

function Child({ name }) { console.log('child render'); return <h3>Hello {name}!</h3>; }

주 컴포넌트의 마지막 입력 필드 뒤에 Child를 추가하고, prop으로 이름을 전달하겠습니다:

<Child name={name} />

주 컴포넌트에서 이를 import 하겠습니다:

import Child from './Child';

이제 콘솔을 열고 입력 필드에 이름과 성을 입력해 보겠습니다. 여기서 우리는 성 필드에 문자를 입력할 때도 자식 컴포넌트가 매번 다시 렌더링되는 것을 볼 수 있습니다. 우리 컴포넌트가 작기 때문에 아무런 문제가 없습니다. 하지만 이 컴포넌트가 많은 양의 데이터를 표시하면서도 매번 다시 렌더링된다고 상상해 보세요.

이제 자식 컴포넌트를 memo로 감싸보고, 렌더링이 어떻게 변하는지 살펴보겠습니다. 먼저 여기에 memo를 import 하겠습니다:

import { memo } from 'react';

그런 다음 새로운 변수를 만들고 memo로 감싼 Child를 할당하겠습니다. 다음과 같은 함수 표현식이 됩니다:

const Child = memo( function Child({ name }) { console.log('child render'); return <h3>Hello {name}!</h3>; });

콘솔을 열고 다시 필드에 이름과 성을 입력해 보겠습니다. 이제 성을 입력할 때, 자식 컴포넌트가 다시 렌더링되지 않는 것을 볼 수 있습니다.

props가 변경되지 않았더라도 컴포넌트에서 사용하는 상태나 변경을 사용하는 컨텍스트가 바뀌면 이것은 작동하지 않는다는 점을 기억해야 합니다.

이 강의에서 만든 App 컴포넌트 코드를 가져와서, 첫 번째 입력 필드만 남겨두세요. 문단에 'long text' 텍스트가 들어 있는 React 컴포넌트 Text를 만들고, App의 입력 필드 뒤에 배치하세요.

Text 컴포넌트에 console.log('text render'); 줄을 추가하세요. 입력 필드에 문자를 입력할 때 Text 컴포넌트가 매번 다시 렌더링되는지 확인하세요.

이제 Text 컴포넌트를 memo로 감싸세요. 입력 필드에 문자를 입력할 때 Text 컴포넌트가 다시 렌더링되지 않는지 확인하세요.

한국어
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақКыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
우리는 웹사이트 운영, 분석 및 개인화를 위해 쿠키를 사용합니다. 데이터 처리는 개인정보 처리방침에 따라 이루어집니다.
모두 수락 설정 거부