ํฐ์คํ ๋ฆฌ ๋ทฐ
ํจ์ ๋ฉ๋ชจ๋ฆฌ์ด์ ์ด์
useCallback()์ ํจ์๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ด์ (memorization)ํ๊ธฐ ์ํด์ ์ฌ์ฉ๋๋ hook ํจ์์ด๋ค.
์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋์ด์จ ํจ์๋ฅผ, ๋๋ฒ์งธ ์ธ์๋ก ๋์ด์จ ๋ฐฐ์ด ๋ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๊น์ง ์ ์ฅํด๋๊ณ ์ฌ์ฌ์ฉํ ์ ์๋ค.
const memoizedCallback = useCallback(callbackFunc, []);
useCallback์ ์ฌ์ฉํ์ง ์๊ณ , ์ด๋ค React ์ปดํฌ๋ํธ ํจ์ ์์ ํจ์๊ฐ ์ ์ธ์ด ๋์ด ์๋ค๋ฉด ์ด ํจ์๋ ํด๋น ์ปดํฌ๋ํธ๊ฐ ๋๋๋ง๋ ๋๋ง๋ค
์๋ฐ์คํฌ๋ฆฝํธ์ ํน์ฑ ์ ์๋ก์ด ํจ์๋ฅผ ์์ฑํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ ์ฐธ์กฐ๊ฐ ๋น๊ต_ํจ์ ๋๋ฑ์ฑ
func1 = () => x + y;
func2 = () => x + y;
console.log(func1 === func2) //false
๊ฐ์ฒด๋ ์์๊ฐ๊ณผ๋ ๋ค๋ฅด๊ฒ ์ฐธ์กฐ๊ฐ(๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋ ์ฃผ์๊ฐ)์ ๋ฐ๋ฅธ ๋น๊ต๋ฅผ ํ๋ค.
์ค์ํ ๊ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์์ ํจ์๋ ์ผ๊ธ ๊ฐ์ฒด๋ก์ ์ทจ๊ธ๋๋ค.
์ผ๊ธ ๊ฐ์ฒด๋ ๋ค์๊ณผ ๊ฐ์ ํน์ฑ์ ์ง๋๊ณ ์๋ค.
๋ฌด๋ช ์ ๋ฆฌํฐ๋ด๋ก ์์ฑ ๊ฐ๋ฅ(๋ฐํ์์ ์์ฑ ๊ฐ๋ฅ)
๋ณ์๋ ์๋ฃ๊ตฌ์กฐ(๊ฐ์ฒด, ๋ฐฐ์ด ๋ฑ)์ ์ ์ฅ ๊ฐ๋ฅ
ํจ์์ ๋งค๊ฐ๋ณ์์ ์ ๋ฌ ๊ฐ๋ฅ
ํจ์์ ๋ฐํ๊ฐ์ ์ฌ์ฉ ๊ฐ๋ฅ
์ด๋ฌํ ์๋ฐ์คํฌ๋ฆฝํธ ํน์ฑ์ React ์ปดํฌ๋ํธ ํจ์ ๋ด์์ ์ด๋ค ํจ์๋ฅผ ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ๋๊ธฐ๊ฑฐ๋ ์์ ์ปดํฌ๋ํธ์ props์ผ๋ก ๋๊ธธ ๋
์์์น ๋ชปํ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์๋ค.
์์กด ๋ฐฐ์ด๋ก ํจ์๋ฅผ ๋๊ธธ ๊ฒฝ์ฐ
useEffect(() => {
quillInstance.current = new Quill(quillElement.current, {
(....)
const quill = quillInstance.current;
quill.on('text-change', (delta, oldDelta, source) => {
if(source === 'user') {
onChangeField({key: 'body', value: quill.root.innerHTML})
}
})
}, [onChangeField]);
const onChangeField = useCallback(payload => dispatch(changeField(payload)), [dispatch]);
๋ค์๊ณผ ๊ฐ์ด ์ปดํฌ๋ํธ์์ ๋ฆฌ๋์ค์ ์ก์ ์์ฑ ํจ์๋ฅผ dispatch() ํ๋ ํจ์๋ฅผ ํธ์ถํ๊ณ ์ ํ ๊ฒฝ์ฐ, onChangeField ํจ์๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง
ํธ์ถ์ด ๋๋ค.
์ฌ๊ธฐ์ onChangeField ํจ์๋ฅผ useCallback์ผ๋ก ๊ฐ์ธ์ง ์์ ์ฑ, ๊ทธ๋๋ก ์์ ์ปดํฌ๋ํธ์ props๋ก ๋๊ฒจ์ฃผ๊ณ ์์กด์ฑ ๋ฐฐ์ด์ ํ ๋นํ๊ฒ ๋๋๋ค๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ๋ ํจ์์ ๋๋ฑ์ฑ์ ํ๋จํ๋ ๋ฐฉ์์ด ์ฐธ์กฐ๊ฐ์ ์ํ ๋น๊ต์ด๊ธฐ ๋๋ฌธ์ ์์์น ๋ชปํ ๋ฌดํ ๋ฃจํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
onChangeField๋ ํจ์์ด๊ธฐ ๋๋ฌธ์, ์ปดํฌ๋ํธ๊ฐ ๋๋๋ง๋ ๋๋ง๋ค ์๋ก์ด ์ฐธ์กฐ๊ฐ์ผ๋ก ๋ณ๊ฒฝ์ด ๋๋ค.
๊ทธ๋ฌ๋ฉด useEffect() ํจ์๊ฐ ํธ์ถ๋์ด ์ก์ ์์ฑ ํจ์๋ฅผ dispatch ํ๊ฒ ๋๊ณ ๋ฆฌ๋์ค ๋ด์ state์ ๊ฐ์ด ๋ณ๊ฒฝ๋จ์ ๋ฐ๋ผ ๋ค์ ๋๋๋ง์ด ์ผ์ด๋๊ณ ๊ทธ๋ผ ๋ ๋ค์ useEffect ํจ์๊ฐ ํธ์ถ๋๋ ์ ์ํ์ด ๋ฐ๋ณต๋๋ค.
์ด๋ฌํ ๋ฌดํ ๋ฃจํ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์ ์์ ์ปดํฌ๋ํธ์ ํจ์๋ฅผ props๋ก ๋๊ธธ ๊ฒฝ์ฐ์๋ ๋ฐ๋์ useCallback์ผ๋ก ํด๋น ํจ์๋ฅผ ๊ฐ์ธ์ค์ผ ํ๋ค.