- 연산 최적화 할 때 사용
- Memoization : 이미 계산 해 본 연산 결과를 기억 해 두었다가 동일한 계산을 시키면, 다시 연산하지 않고 기억(캐싱) 해 두었던 데이터를 반환 시키게 하는 방법
//App=()=>{}안에 들어있으며, useEffect(()=>{},[])사용 중
const getDiaryAnalysis = () => {
const goodCount = data.filter((item)=>item.emotion >= 3).length;
const badCount = data.length - goodCount;
const goodRatio = (goodCount / data.length) * 100;
return {goodCount, badCount, goodRatio}
}
const {goodCount, badCount, goodRatio} = getDiaryAnalysis()
//...결과값 사용 예시 생략
useMemo(()=>{},[])
사용하여 필요 할 때에만 사용 가능//App=()=>{}안에 들어있으며, useEffect(()=>{},[])사용 중
const getDiaryAnalysis = useMemo(() => {
const goodCount = data.filter((item)=>item.emotion >= 3).length;
const badCount = data.length - goodCount;
const goodRatio = (goodCount / data.length) * 100;
return {goodCount, badCount, goodRatio}
}, [data.length])
const {goodCount, badCount, goodRatio} = getDiaryAnalysis
//...결과값 사용 예시 생략
const MyComponent = React.memo(function MyComponent(props) {
/* props를 사용하여 렌더링 */
});
const CounterA = React.memo(({count}) => {
useEffect(()=>{
console.log(`CounterA Update - count: ${count}`)
})
return <div>{count}</div>
})
const CounterB = React.memo(({obj})=>{
useEffect(()=>{
console.log(`CounterB 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: obj.count,
})}>B button</button>
</div>
</div>
const areEqual = (prev, next) => {
if(prev.obj.count === next.obj.count) {
return true
}
return false
}
const MemoizedCounterB = React.memo(CounterB, areEqual)
=> obj.count의 값이 동일하면 true를 반환하기에 재실행되지 않음useCallback(fn, deps)
은 useMemo(() => fn, deps)
와 같다 const onCreate = useCallback((author, content, emotion) => {
const created_date = new Date().getTime();
const newItem = {
author,
content,
emotion,
created_date,
id: dataId.current,
}
dataId.current += 1;
setData((data) => [newItem, ...data])
},[])
공부하며 정리&기록하는 ._. 씅로그