2024-03-13.md
π‘DIL: λͺ¨λ 리μ‘νΈ λ₯ λ€μ΄λΈ, 2μ£Όμ°¨-3
μ€ν°λ: μκ° CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
μ€λ μ§ν: κ°μΈκ³΅λΆ
DIL-week2-3_2024-03-13
| DIL μ£Όμ°¨ | λ²μ | λ΄μ© | μ€λμ°¨ μ§λ | | -------- | ------ | ------------------------------- | ----------- | | 2μ£Όμ°¨ | 3, 5μ₯ | 리μ‘νΈ ν κ³Ό μνκ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬ | 208~219p |
μ€λ μ½μ λ΄μ©μ markdownμΌλ‘ κ°λ¨ν λ©λͺ¨
μ½μ μκ°: 10μ~11μ κ°κΈ° μ΄μ-2π€
React Hook νν€μΉκΈ°
useMemo
- λνμ μΈ μ΅μ ν ν ~
- μΈμ
- (1) 첫 λ²μ§Έ μΈμ: μ΄λ ν κ°μ λ°ννλ μμ± ν¨μ
- (2) λ λ²μ§Έ μΈμ: μμ‘΄μ± λ°°μ΄
- λμ
- λλλ§ μ (2)μ κ°μ΄ λ³κ²½λμ§ μμμΌλ©΄ => (1)μ μ¬μ€ν νμ§ μκ³ , μ΄μ μ κΈ°μ΅ν΄λ κ° λ°ν
- λλλ§ μ (2)μ κ°μ΄ λ³κ²½λμμΌλ©΄ => (1)μ μ€νν ν κ°μ λ°ννκ³ , κ·Έ κ°μ κΈ°μ΅
- μ»΄ν¬λνΈλ κ°λ₯(μ ν¨)
const MemoizedComponent = useMemo( () => <ExpensiveComponent value={value} />, [value] );
- μ»΄ν¬λνΈλ κ°λ₯(μ ν¨)
useCallback
| hook | memoize | | ----------- | ----------------------------- | | useMemo | λ°ν κ° == λ³μ | | useCallback | μΈμλ‘ λ겨 λ°μ μ½λ°± == ν¨μ |
- useCallbackμ μΈμλ‘ λ겨λ°μ μ½λ°± μ체λ₯Ό κΈ°μ΅
- νΉμ ν¨μλ₯Ό μλ‘ λ§λ€μ§ μκ³ λ€μ μ¬μ¬μ©νλ€
- ν¨μμ μ¬μμ±μ λ§μ λΆνμν 리μμ€, λλ 리λλλ§μ λ°©μ§νλ€
export default function Hooks() {
const [status1, setStatus1] = useState(false);
const [status2, setStatus2] = useState(false);
const toggle1 = () => {
setStatus1(!status1);
}; // μ»΄ν¬λνΈλ₯Ό λλλ§ν λ, ν¨μλ₯Ό μ¬μμ±νλ€
const toggle2 = useCallback(
function togge2() {
setStatus2(!status2);
},
[status2]
); // μ»΄ν¬λνΈλ₯Ό λλλ§ν λ, μμ‘΄μ± λ°°μ΄μ κ°μ΄ λ³νμ§ μμλ€λ©΄ ν¨μλ₯Ό μ¬μμ±νμ§ μλλ€
const toggle3 = useMemo(
// `useMemo`λ₯Ό μ¬μ©νμ¬ κ³μ°λ κ°μ λ©λͺ¨μ΄μ μ΄μ
ν©λλ€.
// μ΄ ν¨μλ `status3` μνμ λ³κ²½μ ν΅ν΄ μμ±λ μλ‘μ΄ ν κΈ ν¨μλ₯Ό λ°νν©λλ€.
// `status3`κ° λ³κ²½λ λλ§ μ΄ ν¨μλ₯Ό μ¬κ³μ°νμ¬, μ±λ₯μ μ΅μ νν©λλ€.
function toggle3() {
// -> μ½λ°± ν¨μ: ν¨μ μ μΈλ¬Έμ λ°ννλ€
return function () {
// -> ν¨μ(κ°μ λ°ννλ€)
return setStatus3(!status3);
};
},
[status3] // μμ‘΄μ± λ°°μ΄: μ΄ λ°°μ΄μ κ°μ΄ λ³κ²½λλ©΄, `toggle3` ν¨μλ₯Ό μ¬κ³μ°ν©λλ€.
);
return (
<section>
<aside>
<label>Hooks</label>
{/* Hooks */}
<ChildComponent
name="non useCallback"
value={status1}
onChange={toggle1}
/>
<ChildComponent name="useCallback" value={status2} onChange={toggle2} />
<ChildComponent
name="useMemoλ‘ κ΅¬νν useCallback"
value={status3}
onChange={toggle3}
/>
</aside>
</section>
);
}
(ν) κΈ°λͺ ν¨μλ₯Ό μ½λ°± ν¨μλ‘ λ겨주면, ν¬λ‘¬ λ©λͺ¨λ¦¬ νμμ λλ²κΉ μ μ©μ΄νκ² ν μ μλ€ (μ΄λ¦μΌλ‘ μΆμ νκΈ°~)
useRef
https://react.dev/reference/react/useRef
- ref.current μμ±μ λ³κ²½ν μ μμ΅λλ€(mutable). <-> μν(state)
- κ·Έλ¬λ, λ λλ§μ μ¬μ©λλ κ°μ²΄(μλ₯Ό λ€μ΄, μνμ μΌλΆ)λ₯Ό λ΄κ³ μλ€λ©΄, ν΄λΉ κ°μ²΄λ₯Ό μ§μ λ³κ²½x
- ref.current μμ±μ λ³κ²½ν΄λ Reactλ μ»΄ν¬λνΈλ₯Ό λ€μ λ λλ§x (refλ λ¨μν JavaScript κ°μ²΄μ΄κΈ° λλ¬Έμ, Reactλ μ¬λ¬λΆμ΄ μ΄λ₯Ό λ³κ²½νμ λλ₯Ό μ μ μμ΅λλ€)
- λ λλ§ λμ ref.currentλ₯Ό μ½κ±°λ μ°μ§ λ§μΈμ. μ΄κΈ°νλ₯Ό μ μΈνκ³ λ μ΄λ₯Ό νΌν΄μΌ ν©λλ€. μ΄λ μ»΄ν¬λνΈμ λμμ μμΈ‘ λΆκ°λ₯νκ² λ§λλλ€.
- μ격 λͺ¨λ(Strict Mode)μμ Reactλ μ°μ°ν λ°μν μ μλ λΆμ ν¨κ³Ό(side effects)λ₯Ό μ°ΎκΈ° μν΄ μ»΄ν¬λνΈ ν¨μλ₯Ό λ λ² νΈμΆν©λλ€. μ΄λ κ°λ°μ© λμμΌλ‘, νλ‘λμ μλ μν₯μ λ―ΈμΉμ§ μμ΅λλ€. κ° ref κ°μ²΄λ λ λ² μμ±λμ§λ§, κ·Έ μ€ νλλ λ²λ €μ§λλ€. μ»΄ν¬λνΈ ν¨μκ° μμνλ€λ©΄(κ·ΈλμΌλ§ ν©λλ€), μ΄λ λμμ μν₯μ μ£Όμ§ μμμΌ ν©λλ€. => μ»΄ν¬λνΈλ μμν΄μΌ νλ€!
- μ μ¨μΌν¨? μΈλΆμμ κ° μ μΈνλ κ±°λ λλΌ λ€λ¦?
- μΈλΆμμ κ°μ μ μΈνμ λ
- μ»΄ν¬λνΈκ° μ€νλμ§ μμλ, κ°μ΄ κΈ°λ³Έμ μΌλ‘ λ©λͺ¨λ¦¬μ μ‘΄μ¬
- μ»΄ν¬λνΈκ° μ¬λ¬λ² μμ±λλ€λ©΄? κ° μ»΄ν¬λνΈμμ κ°λ¦¬ν€λ κ°μ΄ λμΌ
- DOMμ μ κ·Ό
- λλλ§ λκΈ° μ (returndmfh DOMμ΄ λ°νλκΈ° μ ):
undefined
- λλλ§ λκΈ° μ (returndmfh DOMμ΄ λ°νλκΈ° μ ):
- (μμ ) λλλ§ μλλ μ μ νμ©ν΄ usePrevious κ°μ 컀μ€ν
ν
μ λ§λ€ μ μμ
- κ°λ°μκ° μνλ μμ μ κ°μ λλλ§μ μν₯μ λΌμΉμ§ μκ³ λ³΄κ΄
function MyUseRef<T>(initValue: T) {
return useMemo(() => ({ current: initValue }), []);
// λ λ²μ§Έ μμ‘΄μ± λ°°μ΄μ΄ λΉμ΄μμΌλ―λ‘ [], λλλ§λ λλ₯Ό μ μΈνκ³ λ°νκ°μ μ¬κ³μ° νμ§ μμ κ²
// => μ¦, λλλ§ μλ§λ€ κ°μ μ£Όμμ κ°μ κ°λ¦¬ν΄ (λλλ§ λΉμμ λ°νκ°μ΄ λ©λͺ¨λμ΄μμ)
// => κ°μ²΄ λ΄λΆμ κ°μ λ³κ²½ν΄λ κ°μ²΄μ μ£Όμκ° λ°λμ§ μμΌλ―λ‘, currentμ valueλ₯Ό μ°Ύμ μ μλ€
}