메모이제이션으로 React 프로젝트 강화
5238 단어 webdevcachereactjavascript
useMemo
및 useCallback
는 메모이제이션을 위한 React 후크입니다. 메모이제이션을 다시 계산할 필요가 없도록 값을 캐싱하는 것으로 생각하십시오. 이렇게 하면 성능이 향상됩니다. useMemo
와 useCallback
의 주요 차이점은 useCallback
는 메모된 함수(실제로는 '캐시된 함수'를 의미함)를 반환하고 useMemo
는 메모된 값을 반환한다는 것입니다. 이 후크를 함께 살펴보겠습니다.시작하자
useMemo
useMemo 사용
사용하는 한 가지 이유
useMemo
는 종속성 중 하나가 업데이트되지 않는 한 비용이 많이 드는 함수가 다시 렌더링되지 않도록 하는 것입니다.문제
이 예제에는 모든 렌더링에서 실행되는 비용이 많이 드는 함수가 있습니다.
개수를 변경하거나 할 일을 추가할 때 실행 지연을 알 수 있습니다.
import { useState } from "react";
import ReactDOM from "react-dom";
const App = () => {
const [count, setCount] = useState(0);
const [todos, setTodos] = useState([]);
const calculation = expensiveCalculation(count);
const increment = () => {
setCount((c) => c + 1);
};
const addTodo = () => {
setTodos((t) => [...t, "New Todo"]);
};
return (
<div>
<div>
<h2>My Todos</h2>
{todos.map((todo, index) => {
return <p key={index}>{todo}</p>;
})}
<button onClick={addTodo}>Add Todo</button>
</div>
<hr />
<div>
Count: {count}
<button onClick={increment}>+</button>
<h2>Expensive Calculation</h2>
{calculation}
</div>
</div>
);
};
const expensiveCalculation = (num) => {
console.log("Calculating...");
for (let i = 0; i < 1000000000; i++) {
num += 1;
}
return num;
};
ReactDOM.render(<App />, document.getElementById('root'));
해결책
이 성능 문제를 해결하려면 비용이 많이 드는 함수의 다시 렌더링을 방지하는 방법을 찾아야 합니다. 이를 위해 비싼 함수를 메모라이즈해야 합니다. 이는 비용이 많이 드는 함수 호출을
useMemo
로 래핑하여 수행됩니다.useMemo
후크는 종속성을 선언하기 위해 두 번째 매개 변수를 허용합니다. 비용이 많이 드는 함수는 종속성이 변경된 경우에만 실행됩니다.다음 예에서 비용이 많이 드는 함수는 할 일이 추가될 때가 아니라 개수가 변경될 때만 실행됩니다.
import { useState, useMemo } from "react";
import ReactDOM from "react-dom";
const App = () => {
const [count, setCount] = useState(0);
const [todos, setTodos] = useState([]);
const calculation = useMemo(() => expensiveCalculation(count), [count]);
const increment = () => {
setCount((c) => c + 1);
};
const addTodo = () => {
setTodos((t) => [...t, "New Todo"]);
};
return (
<div>
<div>
<h2>My Todos</h2>
{todos.map((todo, index) => {
return <p key={index}>{todo}</p>;
})}
<button onClick={addTodo}>Add Todo</button>
</div>
<hr />
<div>
Count: {count}
<button onClick={increment}>+</button>
<h2>Expensive Calculation</h2>
{calculation}
</div>
</div>
);
};
const expensiveCalculation = (num) => {
console.log("Calculating...");
for (let i = 0; i < 1000000000; i++) {
num += 1;
}
return num;
};
ReactDOM.render(<App />, document.getElementById('root'));
useCallback을 살펴봅시다!!!
useCallback 사용
useMemo와 useCallback의 주요 차이점은 useCallback은 메모된 함수(실제로는 '캐시된 함수'를 의미함)를 반환하고 useMemo는 메모된 값을 반환한다는 것입니다.
(
useCallback
에 대한 코드 예제의 경우 useMemo
에 사용된 정확한 예제를 사용하지만 비용이 많이 드는 함수는 ExpensiveCalc.js
라는 다른 구성 요소에 있습니다.)
import { useState } from "react";
import ReactDOM from "react-dom";
const App = () => {
const [count, setCount] = useState(0);
const [todos, setTodos] = useState([]);
const increment = () => {
setCount((c) => c + 1);
};
const expensiveCalculation = useCallback((num) => {
console.log("Calculating...");
for (let i = 0; i < 1000000000; i++) {
num += 1;
}
return num;
}, [count]);
return (
<div>
<div>
<h2>My Todos</h2>
{todos.map((todo, index) => {
return <p key={index}>{todo}</p>;
})}
<button onClick={addTodo}>Add Todo</button>
</div>
<hr />
<div>
<ExpensiveCalc count={count} increment={increment}/>
</div>
</div>
);
};
ReactDOM.render(<App />, document.getElementById('root'));
ExpensiveCalc.js
import { memo } from "react";
const ExpensiveCalc = ({ count, increment }) => {
console.log("child render");
return (
<>
<h2>Count</h2>
Count: {count}
<button onClick={increment}>+</button>
</>
);
};
export default memo(ExpensiveCalc); //memo will cause React to skip rendering a component if its props have not changed.
Reference
이 문제에 관하여(메모이제이션으로 React 프로젝트 강화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/paul_emechebe/supercharging-react-with-memoization-1999텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)