ν¨μνμΌλ‘ react component
λ₯Ό μ€κ³ν λ μ¬λ¬κ°μ§ hooks
λ₯Ό μ¬μ©ν μ μλ€. λ³΄ν΅ useEffect
, useState
λ‘ μ¬λ§ν props
, state
λ‘μ§μ ꡬνν μ μκΈ° λλ¬Έμ λΆκ°μ μΈ κΈ°λ₯μ λμμ£Όλ(μ νν λ§νμλ©΄ λ λλ§ μ±λ₯μ μ΅μ νν΄μ£Όλ) useMemo
λ useCallback
μ νμλ‘ μ¬μ©νμ§ μμλ λλ€. νμ§λ§ μ΄ λκ°μ§ hook
μ μ μ¬μ©νκΈ°λ§ νλ€λ©΄ ν¨μ¬ λμ νΌν¬λ¨Όμ€λ₯Ό κΈ°λν μ μλ€.
κ·Έμ μ λͺκ°μ§ μ§κ³ λμ΄κ°μΌν κ²λ€μ΄ μλ€. κΈ°λ³Έμ μΌλ‘ 리μ‘νΈλ shallow copy
λ₯Ό μ€ννλ€. μ°Έμ‘°κ°λ§ λΉκ΅λ₯Ό νλ€λ κ²μ΄λ€. (μ¦, object !== object
μΈμ
) κ·Έλ¦¬κ³ component
κ° λ λλ§ λλ€λ κ²μ ν¨μλ‘ μμ±λ κ²μ call
νμ¬ μ€νλλκ²μ λ§νλ€. κ·Έλ κ² λλ¬Έμ ν¨μκ° μ€νλ λλ§λ€ κ·Έ λ΄λΆμ μ μΈλμ΄ μλ μ½λλ€(λ³μ, λλ€λ₯Έ ν¨μλ€) λν λ§€λ² λ€μ μ μΈλμ΄μ μ¬μ©λλ€. μ΄λ₯Ό μ μ λ
νλ©΄μ useMemo
, useCallback
μ μκ°ν΄λ³΄λλ‘ νμ.
useMemo()
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
리μ‘νΈ κ³΅μλ¬Έμμλ useMemo
λ₯Ό λ©λͺ¨μ΄μ μ΄μ
(Memoization)λ κ°μ λ°νν©λλ€ λΌκ³ μ€λͺ
νλ€. μμ μμ λ₯Ό μ€λͺ
ν΄λ³΄μλ©΄, deps
λ‘ λ£μ΄μ€ a
λλ b
κ° λ³κ²½μ΄ λ λμλ§ ν΄λΉ κ°μ μ¬κ³μ° νλ κ²μ΄λ€. ν component
λ΄μ μ¬λ¬κ° state
λ₯Ό κ°μ§κ³ μμλμ νΉμ ν κ°μ useMemo
λ₯Ό μ¬μ©νκ² λλ©΄ μ΅μ νλ₯Ό ν μ μλ€.
μ¬μ©μμ
//const count = countMember(members);
const count = useMemo(() => countMember(members), [members]);
// membersκ° λ°λλμλ§ κ³μ°μ ν΄μ£Όλ©΄ λλ€. κ·ΈμΈμ memberName, age λ±μ κ΄μ¬λ°μ΄λ€.
return (
<>
<Member
memberName={memberName}
age={age}
onChange={onChange}
onCreate={onCreate}
/>
<MemberList members={members} onRemove={onRemove} onToggle={onToggle} />
<div>λ©€λ²μ(λͺ
) : {count}</div>
</>
);
μλ μ½λλ useMemo
κ° λ΄λΆμ μΌλ‘ λμνλ μ½λμ΄λ€ (μΆμ²:Facebook github)
areHookInputsEqual
μ΄λΌλ ν¨μλ₯Ό ν΅ν΄, λ°μμ¬ deps
λ³κ²½μ΄ μμ κ²½μ° μ΄μ μ prevState
λ₯Ό λ°ννλ€.
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*/
function useMemo<T>(nextCreate: () => T, deps: Array<mixed> | void | null): T {
currentlyRenderingComponent = resolveCurrentlyRenderingComponent();
workInProgressHook = createWorkInProgressHook();
const nextDeps = deps === undefined ? null : deps;
if (workInProgressHook !== null) {
const prevState = workInProgressHook.memoizedState;
if (prevState !== null) {
if (nextDeps !== null) {
const prevDeps = prevState[1];
if (areHookInputsEqual(nextDeps, prevDeps)) {
return prevState[0];
}
}
}
}
// ... μ€κ°μλ΅
}
useCallback()
const memoizedCallback = useCallback(
() => {
doSomething(a, b);
},
[a, b],
);
리μ‘νΈ κ³΅μλ¬Έμμλ useCallback
λ₯Ό λ©λͺ¨μ΄μ μ΄μ
(Memoization)λ μ½λ°±(ν¨μ)μ λ°νν©λλ€ λΌκ³ μ€λͺ
νλ€. μμ μμ λ₯Ό μ€λͺ
ν΄λ³΄μλ©΄, deps
λ‘ λ£μ΄μ€ a
λλ b
κ° λ³κ²½μ΄ λ λμλ§ ν΄λΉ ν¨μλ₯Ό λ€μ μμ±νλ κ²μ΄λ€.
component
κ° λ λλ§ λ λλ§λ€ λ΄λΆμ μΌλ‘ μ¬μ©ν ν¨μκ° μλ‘κ² μμ±λλ κ²½μ°, μμ component
μ props
μΌλ‘ μλ‘ μμ±λ ν¨μκ° λ겨μ§κ² λλ©΄ λΆνμν λ λλ§μ΄ λ°μν κ²μ΄λ€.
μ¬μ©μμ
const [name, setName] = useState('');
const [age, setAge] = useState(0);
const onSaveMemberInfo = useCallback(() => saveMemberInfo(name, age), [name, age]);
// μ€μ λ λλ§μ μν₯μ λΌμΉλ name, ageκ° λ³κ²½λ λμ ν¨μλ₯Ό μμ±νμ¬ κ·ΈμΈμ μν©μμ <Member />κ° λ λλ§λλκ²μ λ§λλ€
return(
<>
<div>λ©€λ² μ΄λ¦: {name}</div>
<div>λμ΄ : {age}</div>
<Member
onSave={onSaveMemberInfo}
setName={setName}
setAge={setAge}
/>
</>
)
μλλ useCallback
μ΄ λ΄λΆμ μΌλ‘ λμνλ μ½λμ΄λ€ (μΆμ²:Facebook github)
useMemo
λ₯Ό κΈ°λ°μΌλ‘ ν¨μλ₯Ό λ°μμ€λ ννλ₯Ό μ·¨νλ€.
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*/
export function useCallback<T>(
callback: T,
deps: Array<mixed> | void | null,
): T {
return useMemo(() => callback, deps);
}
κ·Έλ¦¬κ³ useMemo
, useCallback
μ μ¬μ©ν λμ μ§μΌμΌν λͺκ°μ§ μ£Όμμ¬νμ΄ μλ€.
leaf component
μλ μ¬μ©νμ§ λ§μμΌνλ€ (λΉμ°)- ν΄λΉ
hook
μμμ μ¬μ©νλstate
, νΉμprops
κ° μλ€λ©΄ κΌdeps
λ°°μ΄μμ ν¬ν¨μμΌμΌνλ€. λ§μ½ κ·Έλ μ§ μμΌλ©΄ ν΄λΉ κ°μ λν΄ μ΅μ κ°μ μ°Έμ‘°ν κ²μ΄λΌκ³ 보μ₯ν μ μλ€. - μμ‘΄μ± λ°°μ΄μ μλ‘μ΄ κ°μ²΄μ λ°°μ΄μ μ λ¬ν΄μλ μλλ€. μ΄λ μμ‘΄μ±μ΄ λ¬λΌμ§ μ μλ€λ κ²μ μλ―Ένκ³ λ©λͺ¨μ΄μ μ΄μ μ νλ μλ―Έκ° μλ€.
const [first, ...rest] = array;
const dontDoLikeThis = useCallback(() => { someFunction(); }, [rest]);
- [μ€μ] 무쑰건
useMemo
μuseCallback
μ μ¬μ©νλ€κ³ ν΄μ μ±λ₯μ΄ λ μ’μμ§μ§λ μλλ€.
React devtool
μ profiler
λ₯Ό μ¬μ©νλ©΄ μ»΄ν¬λνΈ μλλ₯Ό μΈ‘μ ν μ μλ€. μ΄λ₯Ό μ΄μ©ν΄ νμν κ²½μ° useMemo
, useCallback
μ μ¬μ©νμ¬ μνλ³κ²½μ μ’ λ ν¨μ¨μ μΌλ‘ λ§λ€ μ μλ€.
- https://ko.reactjs.org
- https://github.com/facebook/react
- https://kentcdodds.com/blog/usememo-and-usecallback