안녕하세요:) 개발자 우디입니다! 아래 내용 관련하여 작업 중이신 분들께 도움이되길 바라며 글을 공유하니 참고 부탁드립니다😊
(이번에 벨로그로 이사오면서 예전 글을 옮겨적었습니다. 이 점 양해 부탁드립니다!)
useMemo
function App() {
const [count, setCount] = useState(0)
const expFunc = (count)=> {
waitSync(3000);
return count * 90;
}
const resCount = expFunc(count)
return (
<>
Count: {resCount}
<input type="text" onChange={(e)=> setCount(e.target.value)} placeholder="Set Count" />
</>
)
}
3
을 입력하게 되면 expFunc은 3분동안 실행되고 다시 3을 입력하면 또 3분간 실행됨.useMemo(()=> func, [input_dependency])
function App() {
const [count, setCount] = useState(0)
const expFunc = (count)=> {
waitSync(3000);
return count * 90;
}
const resCount = useMemo(()=> {
return expFunc(count)
}, [count])
return (
<>
Count: {resCount}
<input type="text" onChange={(e)=> setCount(e.target.value)} placeholder="Set Count" />
</>)
}
useCallback
function TestComp(props) {
l('rendering TestComp')
return (
<>
TestComp
<button onClick={props.func}>Set Count in 'TestComp'</button>
</>
)
}
TestComp = React.memo(TestComp)
function App() {
const [count, setCount] = useState(0)
return (
<>
<button onClick={()=> setCount(count + 1)}>Set Count</button>
<TestComp func={()=> setCount(count + 1)} />
</>)
}
...
return (
<>
...
<TestComp func={()=> setCount(count + 1)} />
</>)
...
function App() {
const check = 90
const [count, setCount] = useState(0)
const clickHndlr = useCallback(()=> { setCount(check) }, [check]);
return (
<>
<button onClick={()=> setCount(count + 1)}>Set Count</button>
<TestComp func={clickHndlr} />
</>)
}
react.memo
function My(props) {
return (
<div>
{props.data}
</div>)
}
function App() {
const [state, setState] = useState(0)
return (
<>
<button onClick={()=> setState(0)}>Click</button>
<My data={state} />
</>)
}
function My(props) {
return (
<div>
{props.data}
</div>)
}
const MemoedMy = React.memo(My)
function App() {
const [state, setState] = useState(0)
return (
<>
<button onClick={()=> setState(0)}>Click</button>
<MemeodMy data={state} />
</>)
}
문제상황 1)
const VideoList = ({
...
}) => {
...
export default React.memo(VideoList);
문제상황 2)
<Link
...
>
<S.RecommendVideo onClick={tag.clickCategoryRecommendationCard}>
<VideoList
...
// onClick={() => setVodId(list.vodId)} -> 삭제한 부분
/>
</S.RecommendVideo>
</Link>
문제상황 3)
문제 상황 확인
시도
memoization을 위해 따로 빼서 관리하면 되지 않을까 ⇒ 따로 함수로 만들고, return 값 받는 부분에서 memo 해주기.
const getCommentPreviewInfo = () => {
let commentPreviewDisplayName, commentPreviewBody;
...
return [commentPreviewDisplayName, commentPreviewBody];
};
const [commentPreviewDisplayNameData, commentPreviewBodyData] = useMemo(getCommentPreviewInfo, [
commentList.results[0],
]);
결과
코멘트 미리보기 정보가 동일할 경우 리랜더링 되지 않음.
이전에는 동일한 내용이 반복적으로 출력되었는데, 변경 후에는 불필요한 반복이 줄어든 것을 볼 수 있음.
변경 전
변경 후
const [overlayTimeStatus, setOverlayTimeStatus] = useState('00:00');
...
const getOverlayTimeStatus = () => {
...
setOverlayTimeStatus(h === 0 ? `${m}:${s}` : `${h}:${m}:${s}`);
};
...
<OverlayTime>{overlayTimeStatus}</OverlayTime>
const getOverlayTimeStatus = () => {
...
return (overlayTimeStatus = h === 0 ? `${m}:${s}` : `${h}:${m}:${s}`);
};
...
<OverlayTime>{getOverlayTimeStatus()}</OverlayTime>