25.06.13 - se5ri/React GitHub Wiki
ch 04 리μ‘νΈ ν
ch04 - 05 useMemo
useMemo
- μ§μ ν ν¨μλ₯Ό νΈμΆνμ¬ λ°νλ°μ κ²°κ³Όκ°μ λ΄λΆμ μ μ₯(μΊμ±)νλ ν¨μ
API
const calculateValue = function(){ ... };
const cachedValue = useMemo(calculateValue, dependencies);
λ§€κ°λ³μ
calculateValue
: μΊμ±ν κ°μ κ³μ°νμ¬ λ°ννλ μμ ν¨μdependencies
: μμ‘΄ κ°μ²΄ λ°°μ΄- κ³μ° κ²°κ³Όμ μν₯μ μ£Όλ
calculateValue
ν¨μμ μΈμκ° - μ΄ λ°°μ΄μ κ°μ΄ νλλΌλ λ³κ²½λλ©΄
calculateValue
ν¨μλ₯Ό λ€μ νΈμΆνκ³ , λ³κ²½λμ§ μμΌλ©΄ μΊμλ κ°μ λ°ν - λΉ λ°°μ΄μ μ§μ νλ©΄ μμ‘΄μ±μ΄ μμΌλ―λ‘ λ§€λ² μΊμλ κ°μ λ°ν
- κ³μ° κ²°κ³Όμ μν₯μ μ£Όλ
리ν΄κ°
calculateValue
ν¨μλ₯Ό νΈμΆν κ²°κ³Όκ°- λ€μ λ λλ§ μ€μλ
dependencies
κ° λ³κ²½λμ§ μμΌλ©΄ μΊμλ κ²°κ³Όλ₯Ό, λ³κ²½λμμΌλ©΄calculateValue
ν¨μλ₯Ό λ€μ νΈμΆν κ²°κ³Όκ°
React.memo
- μ»΄ν¬λνΈλ₯Ό memoizeν ν 리λ λλ§ λ λ propsκ° λ³κ²½λμ§ μμΌλ©΄ memoizeλ μ»΄ν¬λνΈλ₯Ό λ°ν
- μ»΄ν¬λνΈκ° 리λ λλ§λ λ propsκ° λ³κ²½λμ§ μμΌλ©΄ μ΅μ’ μ μΌλ‘ λΈλΌμ°μ DOMμ μ°κΈ° μμ μ΄ μ΄λ£¨μ΄μ§μ§ μμ§λ§, κ°μ DOM μμ±κ³Ό λΉκ΅ μμ μλ 리μμ€κ° μ¬μ©λλ―λ‘, memoizeλ μ»΄ν¬λνΈλ μ±λ₯ ν₯μμ λμμ μ€ μ μμ
- 리λ λλ§ λ λ λμλκ² μ§μ°μ΄ λ°μνλ κ²½μ° μ¬μ©
API
const MemoizedComponent = React.memo(SomeComponent, arePropsEqual?)
λ§€κ°λ³μ
SomeComponent
: memoizeν λμ μ»΄ν¬λνΈarePropsEqual
(μ ν): memoizeλ μ»΄ν¬λνΈλ₯Ό λ°νν μ§, μ»΄ν¬λνΈλ₯Ό λ€μ νΈμΆν μ§λ₯Ό κ²°μ νλ ν¨μ- μ»΄ν¬λνΈμ μ΄μ props λ° μλ‘μ΄ propsλ₯Ό μΈμλ‘ λ°λ ν¨μ
true
λ₯Ό λ°ννλ©΄ memoizeλ μ»΄ν¬λνΈλ₯Ό μ¬μ©νκ³ ,false
λ₯Ό λ°ννλ©΄ μ»΄ν¬λνΈλ₯Ό λ€μ νΈμΆν κ²°κ³Όκ°μ μ¬μ©- μλ΅ μ μ΄μ propsμ μλ‘μ΄ propsλ₯Ό μκ² λΉκ΅νμ¬ κ°μΌλ©΄
true
, λ€λ₯΄λ©΄false
λ₯Ό λ°ννλ κΈ°λ³Έ λμ
리ν΄κ°
- memoizeλ
SomeComponent
React.memo μ¬μ© μμ
- μ»΄ν¬λνΈ νΈμΆ μ μκ°μ΄ μ€λ 걸리λ μ°μ° μμ
μ΄ μλ κ²½μ°
- memoizeλ μ»΄ν¬λνΈλ₯Ό μ¬μ¬μ©νλ©΄ μ»΄ν¬λνΈ νΈμΆ νμλ₯Ό μ€μΌ μ μμ
- 리λ λλ§λ λ propsκ° μμ£Ό λ³κ²½λμ§ μλ μ»΄ν¬λνΈ
- propsκ° μμ£Ό λ³κ²½λλ μ»΄ν¬λνΈμλ propsλ₯Ό λΉκ΅νλ λ‘μ§μ΄ λΆνμνκ² λμνλ―λ‘, μ€νλ € μ±λ₯μ μ’μ§ μμ
κ³ μ°¨ ν¨μ (Higher-Order Function)
μ μ
- ν¨μλ₯Ό μΈμλ‘ μ λ¬λ°κ±°λ ν¨μλ₯Ό λ°ννλ ν¨μ.
μμ
Array.prototype.forEach
,Array.prototype.map
,Array.prototype.findIndex
,Array.prototype.filter
λ±.- 리μ‘νΈμμμ νμ©
- μ»΄ν¬λνΈ(ν¨μ)λ₯Ό μΈμλ‘ λ°μ κ³΅ν΅ λ‘μ§μ μΆκ°ν μλ‘μ΄ μ»΄ν¬λνΈλ₯Ό λ°ν.
- μ€λ³΅λλ λ‘μ§μ κ³ μ°¨ ν¨μμ μ μνμ¬ μ»΄ν¬λνΈλ³λ‘ μ¬μ¬μ© κ°λ₯.
React.memo
κ° λνμ μΈ κ³ μ°¨ ν¨μ. π 05 useMemo - ν¨μμ λ°νκ°μ memoize
- π» App.tsx
ch04 - 06 useCallback
useCallback
- μ»΄ν¬λνΈ λ΄λΆμμ μ μν ν¨μλ₯Ό μΊμ
- μ»΄ν¬λνΈκ° λ€μ λ λλ§λλλΌλ ν¨μκ° λ€μ μμ±λμ§ μκ³ μΊμλ ν¨μλ₯Ό μ¬μ©
- λΆλͺ¨κ° μ μν μ΄λ²€νΈ 리μ€λλ₯Ό μμμκ² propsλ‘ μ λ¬ν λ, λΆλͺ¨κ° 리λ λλ§λλ κ²½μ° μμλ 리λ λλ§λμ§λ§, μ΄λ propsκ° λ°λμ§ μμΌλ©΄ μμμ κΈ°μ‘΄ DOMμ μ¬μ¬μ©νλλ‘ λ©λͺ¨μ΄μ μ΄μ
ν μ μμ
- μ΄λ²€νΈ 리μ€λλ₯Ό μ»΄ν¬λνΈ λ΄λΆμμ μ μνλ©΄ λΆλͺ¨κ° 리λ λλ§λ λ 리μ€λ ν¨μλ μλ‘ μμ±λλ―λ‘ μμμ μ λ¬νλ propsκ° λ°λμ΄ λ©λͺ¨μ΄μ μ΄μ μ΄ λμ§ μκ³ μμλ 리λ λλ§μ΄ λ°μ
useCallback()
μ μ¬μ©νλ©΄ λΆλͺ¨ μ»΄ν¬λνΈκ° μ¬νΈμΆλμ΄λ 리μ€λκ° μμ λμ§ μκ³ μ μ§λλ―λ‘ μμλ κΈ°μ‘΄ DOMμ μ¬μ¬μ©νμ¬ μ±λ₯μ΄ ν₯μλ¨
API
const cachedFn = useCallback(fn, dependencies);
λ§€κ°λ³μ
fn
: μΊμ±ν ν¨μdependencies
: μμ‘΄ κ°μ²΄ λ°°μ΄- μΊμ±λ ν¨μμμ μ»΄ν¬λνΈμ λ³μλ₯Ό μ¬μ©ν κ²½μ° ν¨μ μμ± λΉμμ κ°μ μ°Έμ‘°νκ³ μκΈ° λλ¬Έμ μ΄ κ°μ΄ λ°λλ©΄ ν¨μλ λ€μ μμ±ν΄μΌ ν¨. μ΄ κ°μ μμ‘΄μ±μΌλ‘ μ§μ νλ©΄ μμ‘΄μ±μ΄ λ°λ λλ§λ€ μλ‘μ΄ ν¨μλ₯Ό μμ±νμ¬ λ°ν
- λΉ λ°°μ΄μ μ§μ νλ©΄ μμ‘΄μ±μ΄ μμΌλ―λ‘ λ§€λ² μΊμλ ν¨μλ₯Ό λ°ν
리ν΄κ°
- μ΅μ΄μλ
fn
ν¨μλ₯Ό λ°ννκ³ , λ€μ λ λλ§λΆν°λdependencies
κ° λ³νμ§ μμλ€λ©΄ μ΄μ μ λ°νν μΊμλ ν¨μλ₯Ό,dependencies
κ° λ³νλ€λ©΄ μλ‘ μμ±λfn
ν¨μλ₯Ό λ°ν
useMemo vs. React.memo vs. useCallback
useMemo
λ ν¨μλ₯Ό μΈμλ‘ μ λ¬νκ³ , μ λ¬λ ν¨μμ μ€ν κ²°κ³Ό(리ν΄κ°)λ₯Ό memoize ν¨React.memo
λ μ»΄ν¬λνΈλ₯Ό μΈμλ‘ μ λ¬νκ³ , μ λ¬λ μ»΄ν¬λνΈλ₯Ό memoize ν¨useCallback
μ ν¨μλ₯Ό μΈμλ‘ μ λ¬νκ³ , μ λ¬λ ν¨μλ₯Ό memoize ν¨- μ°¨μ΄μ : ν¨μμ λ¦¬ν΄ κ° vs. μ»΄ν¬λνΈ vs. ν¨μ μ체
π 06 useCallback(ν¨μ μ체λ₯Ό memoize), React.memo(μ»΄ν¬λνΈλ₯Ό memoize)
- π» App.tsx
- π» Price.tsx
- π» Product.tsx
- π» Shipping.tsx
ch04 - 07 customHook - useCounter 컀μ€ν ν
Custom Hook
- κ°λ°μκ° μ§μ μμ±νλ 리μ‘νΈ ν
μΌλ‘, 리μ‘νΈμ λ΄μ₯ ν
(
useState
,useEffect
λ±)μ μ΄μ©ν΄ νΉμ λ‘μ§μ μ¬μ¬μ© κ°λ₯νκ² λ§λ ν¨μ - μ¬λ¬ μ»΄ν¬λνΈμμ 곡ν΅μΌλ‘ μ¬μ©ν μ μλ μν κ΄λ¦¬λ μ¬μ΄λ μ΄ννΈ λ‘μ§μ νλμ ν μΌλ‘ λ¬Άμ μ μμ
- 리μ‘νΈμ λ΄μ₯ ν μ μΌλ° ν¨μμμλ μ¬μ©ν μ μμΌλ―λ‘, λ΄μ₯ ν μ νμ©νλ €λ©΄ 컀μ€ν ν μ μμ±ν΄μΌ ν¨
- 컀μ€ν
ν
μ μ΄λ¦μ 리μ‘νΈ ν
μμ λͺ
μμ μΌλ‘ λνλ΄κΈ° μν΄
useXXX
ννλ‘ μμ±νλ κ²μ΄ κΆμ₯λ¨- μ:
useFetch
,useLocalStorage
λ±
- μ:
ν μ¬μ© μ μ£Όμμ¬ν
- ν΄λμ€ κΈ°λ° μ»΄ν¬λνΈμμλ ν
μ μ¬μ©ν μ μμ
- ν μ ν¨μν μ»΄ν¬λνΈ μ μ©μ΄λ©°, μν κ΄λ¦¬ λ° μλͺ μ£ΌκΈ° κ΄λ ¨ κΈ°λ₯μ ν¨μν μ»΄ν¬λνΈ λ΄μμλ§ μ¬μ©ν μ μμ
- ν
μ ν¨μ μ»΄ν¬λνΈμ μ΅μμμμλ§ νΈμΆν΄μΌ ν¨
- ν μ λ°λ³΅λ¬Έ, 쑰건문, μ€μ²© ν¨μ λ΄μμ νΈμΆνλ©΄ μ»΄ν¬λνΈκ° λ λλ§λ λλ§λ€ νΈμΆ μμκ° λ¬λΌμ Έμ λ¬Έμ λ₯Ό μΌμΌν¬ μ μμ
- ν μ νΈμΆ μμκ° λ°λλ©΄ 리μ‘νΈλ ν μ μνλ₯Ό μΆμ ν μ μμ΄μ μλ¬κ° λ°μν μ μμ
- ν
μ νμ λμΌν μμλ‘ νΈμΆλμ΄μΌ ν¨
- κ° λ λλ§λ§λ€ λμΌν μμλ‘ ν μ΄ νΈμΆλμ΄μΌ νλ―λ‘, 쑰건문μ΄λ λ°λ³΅λ¬Έ λ΄μμ ν μ νΈμΆνλ ν¨ν΄μ νΌν΄μΌ ν¨
π 07 customHook - useCounter 컀μ€ν ν μ¬μ©
- π» App.tsx
- π» Price.tsx
- π» Product.tsx
- π» Shipping.tsx