μ»΄ν¬λνΈ μ¬μ¬μ©
ν¨μν μ»΄ν¬λνΈμκ² μ
λ°μ΄νΈ 쑰건μ κ±ΈκΈ°
β μ»΄ν¬λνΈ νΈλ¦¬
App
μ»΄ν¬λνΈλ κ°κ° count μ text λ κ°μ state λ₯Ό κ°μ§λλ€.counst
state λCountView
μκ² ,text
state λTextView
μ»΄ν¬λνΈ μκ² prop μΌλ‘ κ°κ° 보λ΄μ£Όκ³ μμ΅λλ€.- μ°μΈ‘μ νμλ μμλλ‘ μ½λλ₯Ό μννλ©΄μ μ΄λ»κ² μ λ°μ΄νΈ λλμ§ λ³΄κ² μ΅λλ€.
β μμ
- setCount(10) μ΄ μ€νμ΄ λλ©΄μ
App
μ»΄ν¬λνΈμcount
state μ κ°μ λ³ν μν¬ μμ μ λλ€. - κ·Έλ¬λ©΄
App
μ»΄ν¬λνΈμcount
state μ κ°μ΄ λ°λκ² λκ³ , state κ° μ λ°μ΄νΈ λμκΈ° λλ¬Έμ - ν΄λΉ state λ₯Ό κ°μ§
App
μ»΄ν¬λνΈλ 리λ λλ§μ΄ λκ² λ©λλ€. - κ·Έλ κ²λλ©΄ prop μΈ
CountView
μ κ°λ λ°λκ² λκ³ ,CountView
μ»΄ν¬λνΈλ§ μ λ°μ΄νΈ λ κ² κ°μ κΈ°λλ₯Ό κΉ¨κ³ - λ κ°μ μμ μ»΄ν¬λνΈ
TextView
κΉμ§ λͺ¨λ 리λ λκ° λ©λλ€.
μ΄μ λ? λΆλͺ¨ μ»΄ν¬λνΈκ° 리λ λκ° λλ©΄ μμ μ»΄ν¬λνΈλ€ λν 리λ λκ° λκΈ° λλ¬Έμ TextView
λν κ°μ λ‘ λ¦¬λ°λκ° λ©λλ€.
- μμ κ°μ μν©μμ μ°μ°μ λλΉκ° λ°μνκ² λ©λλ€.
TextView
μ»΄ν¬λνΈλ λ λλ§ λ μ΄μ κ° μμ΅λλ€.App
μ»΄ν¬λνΈκ° λ°λκΈ΄ νμ§λ§TextView
μ»΄ν¬λνΈκ° κ°μ§κ³ μλ prop μ λ°λλ μν©μ΄ μλκΈ° λλ¬Έμ λλ€.- μ΄λ λ―, μμ κ³Ό κ΄λ ¨ μλ μ λ°μ΄νΈλ‘ μΈν΄μ μμ λ μ λ°μ΄νΈκ° λμ΄μΌ λλ€λ©΄ μ±λ₯ μμ λ¬Έμ κ° λλ μ΄μ μ λλ€.
μμ μν©μ μ΄λ»κ² λ§μ μ μμκΉ β
β μμ μ»΄ν¬λνΈμκ² κ° μ λ°μ΄νΈ 쑰건μ μ€μ
- μμ μ»΄ν¬λνΈμκ² κ°κ° μ λ°μ΄νΈ 쑰건μ κ±Έμ΄λλ λ°©λ² μ λλ€.
CountView
μ»΄ν¬λνΈλ μμ μ΄ prop μΌλ‘ λ°λcount
κ° λ°λ λλ§ μ λ°μ΄νΈ νλλ‘ νκ³TextView
μ»΄ν¬λνΈλ μμ μ΄ prop μΌλ‘ λ°λtext
κ° λ°λ λλ§ μ λ°μ΄νΈ νλλ‘ ν©λλ€.count
state κ° λ³κ²½ λμμ λ,TextView
μ»΄ν¬λνΈλ₯Ό μ λ°μ΄νΈ ν μ‘°κ±΄μ΄ λ§μ‘±λμ§ μμκΈ° λλ¬ΈμTextView
μ»΄ν¬λνΈλ 리λ λ λμ§ μκ³ , μ°μ°μ λλΉλ₯Ό λ§μ μ±λ₯μ 보쑴 ν μ μμ΅λλ€.- μμ κ°μ κ±Έ ν μ μλ κΈ°λ₯μ΄
React.memo
μ λλ€.
β React.memo
const MyComponent = React.memo(function MyComponent(props) {
/* propsλ₯Ό μ¬μ©νμ¬ λ λλ§ */
});
React.memo
λ κ³ μ°¨ μ»΄ν¬λνΈ μ λλ€
κ³ μ°¨ μ»΄ν¬λνΈλ μ»΄ν¬λνΈλ₯Ό κ°μ Έμ μ μ»΄ν¬λνΈλ₯Ό λ°ννλ ν¨μ μ λλ€.
μΆμ² : https://ko.reactjs.org/docs/higher-order-components.html
React.memo
λ ν¨μ μμ 맀κ°λ³μλ‘ μ»΄ν¬λνΈλ₯Ό μ λ¬νκ² λλ©΄ λ κ°νλ μλ‘μ΄ μ»΄ν¬λνΈλ₯Ό λ°ννκ² λ©λλ€.- 리λ λλ§ λμ§ μμμΌλ©΄ νλ μ»΄ν¬λνΈ
function MyComponent(props) {
κ°μΈμ£Όκ² λλ©΄μprops
κ° λ°λμ§ μμΌλ©΄ 리λ λλ§ νμ§ μλ κ°νλ μ»΄ν¬λνΈλ₯Ό λλ €μ€λλ€. - λ¬Όλ‘ μκΈ° μμ μ state κ° λ°λλ©΄ 리λ λλ§μ΄ λ©λλ€. μλνλ©΄
React.memo
λ λΆλͺ¨ μ»΄ν¬λνΈμ μν 리λ λλ₯Ό λ§μμ£ΌκΈ° λλ¬Έ μ λλ€.
μμ 1
β OptimizeTest.js
import { useState, useEffect } from 'react';
const TextView = ({ text }) => {
useEffect(() => {
console.log(`Update :: Text : ${text}`);
});
return <div>{text}</div>;
};
const CountView = ({ count }) => {
useEffect(() => {
console.log(`Update :: Count : ${count}`);
});
return <div>{count}</div>;
};
const OptimizeTest = () => {
const [count, setCount] = useState(1);
const [text, setText] = useState('');
return (
<div style={{ padding: 50 }}>
<div>
<h2>count</h2>
<CountView count={count} />
<button onClick={() => setCount(count + 1)}>+</button>
</div>
<div>
<h2>test</h2>
<TextView text={text} />
<input value={text} onChange={(e) => setText(e.target.value)} />
</div>
</div>
);
};
export default OptimizeTest;
count
λ₯Ό λλ₯΄λ©΄ λΆλͺ¨ μ»΄ν¬λνΈμΈOptimizeTest
μ state κ° λ°λκΈ° λλ¬Έμ μμ μ»΄ν¬λνΈCountView
,TextView
λ λ λ€ λ λλ§μ΄ μΌμ΄λκΈ° λλ¬Έμ λ λ€ console μ μΆλ ₯μ΄ λλ κ±Έ λ³Ό μ μμ΅λλ€.- νμ§λ§ 맨 μμ μ΄λ―Έμ§λ‘ λ³Έ κ² μ²λΌ λλΉκ° λ°μνκ² λ©λλ€.
β React.memo μ μ©
const TextView = React.memo(({ text }) => {
useEffect(() => {
console.log(`Update :: Text : ${text}`);
});
return <div>{text}</div>;
});
TextView
μ»΄ν¬λνΈλ prop μΈtext
κ° λ°λμ§ μμΌλ©΄ μ λλ‘ λ λλ§μ΄ μΌμ΄λμ§ μμ΅λλ€.
μμ 2
β OptimizeTest.js
import React, { useState, useEffect } from 'react';
const CounterA = React.memo(({ count }) => {
useEffect(() => {
console.log(`CountA Update - count : ${count}`);
});
return <div>{count}</div>;
});
const CounterB = React.memo(({ obj }) => {
useEffect(() => {
console.log(`CountB Update - count : ${obj.count}`);
});
return <div>{obj.count}</div>;
});
const OptimizeTest = () => {
const [count, setCount] = useState(1);
const [obj, setObj] = useState({ count: 1 });
return (
<div style={{ padding: 50 }}>
<div>
<h2>Counter A</h2>
<CounterA count={count} />
<button onClick={() => setCount(count)}>A Button</button>
</div>
<div>
<h2>Counter B</h2>
<CounterB obj={obj} />
<button onClick={() => setObj({ count: 1 })}>B Button</button>
</div>
</div>
);
};
export default OptimizeTest;
- μμ μ»΄ν¬λνΈ
CounterA
,CounterB
- state λ₯Ό λ³ννλ setState μ A, B counter λͺ¨λ λκ°μ κΈ°μ‘΄μ stateλ₯Ό λ£μμ΅λλ€.
- A button μ λλ₯΄λ©΄
setCount(count)
λ‘ μνλ³νλ₯Ό μ£Όλ νμ§λ§ μνκ° λ°λ μ΄μ κ° μμ΅λλ€. - 1 -> 1 λ‘ λ°λλ©΄ λ³κ²½ λ¬λ€κ³ 보기 μ΄λ ΅μ΅λλ€.
- κ·Έλμ console μ μ무κ²λ μΆλ ₯μ΄ λμ§ μμ΅λλ€.
- μμ κ°μ΄ μκ°νλ©΄ B button μ λλ μ λ μ무κ²λ μΆλ ₯μ΄ λμ§ μμμΌ ν©λλ€.
- νμ§λ§, μΆλ ₯μ΄ λ©λλ€. μ¦ λ¦¬λ λλ§μ΄ μΌμ΄λ¬λ€λ λ» μ λλ€.
- κ·ΈλΌ
React.memo
κ° λμμ λͺ»νλ κ²μ΄λΌκ³ λ³Ό μ μμ§λ§ κ·Έλ μ§ μμ΅λλ€. - μμ κ°μ μν©μ΄ μΌμ΄λλ μ΄μ λ prop μΈ
obj
κ° κ°μ²΄μ΄κΈ° λλ¬Έμ λλ€. - μλ°μ€ν¬λ¦½νΈμμ κ°μ²΄λ μμ λΉκ΅λ₯Ό νκΈ° λλ¬Έμ λ¬Έμ κ° λ°μ ν©λλ€.
β κ°μ²΄λ₯Ό λΉκ΅νλ λ°©λ²
- μλ°μ€ν¬λ¦½νΈκ° κ°μ²΄λ ν¨μ λλ λ°°μ΄ κ°μ λΉ μμνμ μ μλ£νμ λΉκ΅ν λ
- κ°μ μν λΉκ΅κ° μλ μ£Όμμ μν λΉκ΅μΈ μμ λΉκ΅ λ₯Ό νκΈ° λλ¬Έ μ λλ€.
- κ°μ²΄λ€μ μμ± λμλ§μ κ³ μ ν λ©λͺ¨λ¦¬ μ£Όμλ₯Ό κ°μ§κ² λ©λλ€.
- μμ λΉκ΅ λΌλ κ²μ κ°μ²΄μ κ°μ λΉκ΅νλ κ²μ΄ μλλΌ λ κ°μ²΄κ° μ€λ Ή κ°μ΄ κ°μ μ§λΌλ,
κ°μ μ£Όμμ μλμ§ λΉκ΅ν©λλ€.
β νμ§λ§ μλμ²λΌ λΉκ΅νκ² λλ©΄
- μ΄μ μλ λ³μ b μλ κ°κ° κ°μ²΄λ₯Ό μμ±ν΄μ ν λΉ νμλλ° μ§κΈμ κ·Έλ₯ a μ κ°μ λμ νμ΅λλ€.
- κ·Έλ κ²λλ©΄ λ©λͺ¨λ¦¬ μμμ λ³μ b κ° λ³μ a μ κ°μ κ°μ²΄λ₯Ό κ°λ₯΄ν΅λλ€.
β λ€μ λμμμ λ¬Έμ λ₯Ό ν΄κ²° νλ €λ©΄
function MyComponent(props) {
/* propsλ₯Ό μ¬μ©νμ¬ λ λλ§ */
}
function areEqual(prevProps, nextProps) {
/*
nextPropsκ° prevPropsμ λμΌν κ°μ κ°μ§λ©΄ trueλ₯Ό λ°ννκ³ , κ·Έλ μ§ μλ€λ©΄ falseλ₯Ό λ°ν
*/
}
export default React.memo(MyComponent, areEqual);
React.memo
κ° μ²« λ²μ§Έ μΈμ λ§κ³ λ, λ λ²μ§Έ μΈμλ₯Ό λ°λ κ²μ λ³Ό μ μμ΅λλ€.function areEqual
λprevProps
: μ΄μ μ props μnextProps
: μ΄νμ props λ₯Ό λ°κ³ λμΌν κ°μ κ°μ§λ©΄ true λ₯Ό λ°ννκ³ , κ·Έλ μ§ μλ€λ©΄ false λ₯Ό λ°ν ν©λλ€.- κΈ°μ‘΄μ μμ λΉκ΅λ₯Ό νμ§ μκ² νκ³ ,
areEqual
ν¨μμμ κΉμ λΉκ΅λ₯Ό ꡬν νλ€λ©΄ μ μμ μΌλ‘ λμμ΄ κ°λ₯ν©λλ€.
β OptimizeTest.js
import React, { useState, useEffect } from 'react';
const CounterA = React.memo(({ count }) => {
useEffect(() => {
console.log(`CountA Update - count : ${count}`);
});
return <div>{count}</div>;
});
const CounterB = ({ obj }) => {
useEffect(() => {
console.log(`CountB Update - count : ${obj.count}`);
});
return <div>{obj.count}</div>;
};
const areEqual = (prevProps, nextProps) => {
if(prevProps.obj.count === nextProps.obj.count){
return true // μ΄μ props νμ¬ props κ° κ°λ€. -> 리λ λλ§μ μΌμΌν€μ§ μκ² λ©λλ€.
}
return false;
}
const MemoizedCounterB = React.memo(CounterB, areEqual)
const OptimizeTest = () => {
const [count, setCount] = useState(1);
const [obj, setObj] = useState({ count: 1 });
return (
<div style={{ padding: 50 }}>
<div>
<h2>Counter A</h2>
<CounterA count={count} />
<button onClick={() => setCount(count)}>A Button</button>
</div>
<div>
<h2>Counter B</h2>
<MemoizedCounterB obj={obj} /> // μ΄ λΆλΆ
<button onClick={() => setObj({ count: 1 })}>B Button</button>
</div>
</div>
);
};
export default OptimizeTest;
CounterB
ν¨μμReact.memo
λ₯Ό ν΄μ ν©λλ€.- κ·Έλ¦¬κ³ λΉκ΅ ν¨μλ₯Ό λ§λλλ€. ( areEqual )
const MemoizedCounterB = React.memo(CounterB, areEqual)
μμ±- λ λλ₯Ό ν λ
CoutnerB
ν¨μκ° μλλΌMemoizedCounterB
ν¨μλ‘ λ λ ν©λλ€
β μ°Έκ³
'π Front-End > React.js' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
useReducer (0) | 2022.10.24 |
---|---|
μ΅μ ν - useCallback (0) | 2022.10.24 |
μ΅μ ν - useMemo (0) | 2022.10.24 |
React developer tools (0) | 2022.10.24 |
Reactμμ API νΈμΆ (0) | 2022.10.24 |