그렇다면 왜 최적화가 필요한 것일까??
reminder : 다음과 같은 경우에 컴포넌트가 re rendering 된다.
mport { useState } from 'react';
import './App.css';
import ShowSum from './components/ShowSum';
function App() {
const [label, setLabel] = useState('Result');
return (
<div>
<ShowSum
label={label}
n={10000}
/>
<button
onClick={() => setLabel(label + ':')}
>Change label</button>
</div>
);
}
export default App;
import React from 'react';
function sum(n) {
console.log('Started!!');
let result = 0;
for (let i = 1; i <= n; i++) {
result += i;
}
console.log('Finished!!');
return result;
}
export default function ShowSum({ label, n }) {
const result = sum(n);
return (
<span>
{label} : {result}
</span>
);
}
import React, { useMemo } from 'react';
function sum(n) {
console.log('Started!!');
let result = 0;
for (let i = 1; i <= n; i++) {
result += i;
}
console.log('Finished!!');
return result;
}
export default function ShowSum({ label, n }) {
const result = useMemo(() => {
return sum(n);
}, [n]);
return (
<span>
{label} : {result}
</span>
);
}
- 컴포넌트의 state가 변경되는 경우
- 컴포넌트의 props가 변경되는 경우
- 부모 컴포넌트의 state가 변경되는 경우
import { useState } from 'react';
import './App.css';
import Box from './components/Box';
function App() {
const [count, setCount] = useState(0);
return (
<div>
{/* 부모 컴포넌트의 state가 변할 때, re render가 되는지 확인해보자*/}
<span>{count}</span>
<button onClick={() => setCount(prev => prev + 1)}>+</button>
<Box />
</div>
);
}
export default App;
import React from 'react';
export default function Box() {
console.log('Rendered!');
const style = {
width: 100,
height: 100,
backgroundColor: 'red',
}
return (
<div style={style}>
</div>
);
}
Rendered!
가 찍히게 된다.import React from 'react';
const Box = React.memo(() => {
console.log('Rendered!');
const style = {
width: 100,
height: 100,
backgroundColor: 'red',
}
return (
<div style={style}>
</div>
);
});
export default Box;