React Hooksμλ μ¬λ¬ λΌμ΄λΈλ¬λ¦¬κ° μ‘΄μ¬ν©λλ€.
useReducer
useMemo
useCallback
useRef
μμ κ°μ΄ μ΄μ€μμ λνμ μΌλ‘ μ¬μ©λλ μΆκ°μ μΈ Hooksμ λν΄ μμ보λ μκ°μ κ°μ Έλλ‘ νκ² μ΅λλ€. κ°λ¨ν κ°λ κ³Ό μ½λλ₯Ό μ΄μ©νμ¬ μ€λͺ νκΈ° λλ¬Έμ μΆκ°μ μΈ λ΄μ©μ 리μ‘νΈ κ³΅μλ¬Έμλ₯Ό μ°Έμ‘°ν΄μ£ΌμκΈ° λ°λΌκ² μ΅λλ€.
μ²μμΌλ‘ μ΄ν΄λ³Ό κ²μ useReducer
λΌλ ν
μ
λλ€. μ΄λ state κ°μ λ³κ²½νλ useStateμ νμ₯νμ΄λΌκ³ 보μλ©΄ λ©λλ€.
reducer
λ νμ¬ μνμ, μ
λ°μ΄νΈλ₯Ό μν΄ νμν μ 보λ₯Ό λ΄μ μ‘μ
(action) κ°μ μ λ¬ λ°μ μλ‘μ΄ μνλ₯Ό λ°ννλ ν¨μμ
λλ€. reducer
ν¨μμμ μλ‘μ΄ μνλ₯Ό λ§λ€ λλ κΌ λΆλ³μ±μ μ§μΌμ£Όμ΄μΌ ν©λλ€.
Redux
λ₯Ό μλ€λ©΄ μ½κ² μ¬μ© κ°λ₯μ½λλ₯Ό λ¨Όμ 보기 μ μ, κ°λ
μ μ 리νκ³ κ°λλ‘ νκ² μ΅λλ€. useReducer
λΌλ ν
μ μ¬μ©νκ² λλ©΄ reducer
μ dispatch
λ₯Ό νμ©νκ² λ©λλ€. μ΄μ λν κ°λ¨ν κ°λ
λ§ μ 리ν΄λ³ΌκΉμ?
state
λ₯Ό λ³κ²½νλ λ‘μ§μ΄ λ΄κ²¨μλ ν¨μ
// ν΄λΉ ν¨μμμ 첫λ²μ§Έ μΈμμΈ stateλ prevState(μ΄μ state)λ₯Ό μλ―Έ
// actionμ κ°μ²΄λ‘μ¨ stateμ μ‘°μμ κ°λ―Ένλ €νλ κ°μ²΄
const reducer = (state, action) => {
...
return newState;
}
action
κ°μ²΄λ₯Ό λ£μ΄μ μ€ν
κ°μ²΄λ‘μ¨ νμ νλ‘νΌν°λ‘ type
μ κ°μ§λ€.
const click = () => {
dispatch({ type: "PLUS" });
};
const reducer = (state, action) => {
if (action.type === "PLUS") {
return {
count: state.count + 1,
};
}
return state;
}
import React, { useReducer } from "react";
const reducer = (state, action) => {
if (action.type === "PLUS") {
return {
count: state.count + 1,
};
}
return state;
};
const Example6 = () => {
const [state, dispatch] = useReducer(reducer, { count: 0 });
const click = () => {
dispatch({ type: "PLUS" });
};
return (
<div>
<p>You clicked {state.count} times</p>
<button onClick={click}>Click me!</button>
</div>
);
};
export default Example6;
useMemo
λ₯Ό μ¬μ©νλ©΄ ν¨μν μ»΄ν¬λνΈ λ΄λΆμμ λ°μνλ μ°μ°μ μ΅μ ν ν μ μμ΅λλ€. λ¨Όμ λ°°μ΄μ μ«μλ€μ μΆκ°νλ©΄ ν΄λΉ μ«μλ€μ ν©κ³λ₯Ό λνλ΄λ ν¨μν μ»΄ν¬λνΈλ₯Ό μμ±ν΄λ΄
μλ€.
import React, { useMemo, useState } from "react";
const sum = (persons) => {
console.log("sum...");
return persons.map((person) => person.age).reduce((a, b) => a + b, 0);
};
const Example7 = () => {
const [value, setValue] = useState("");
const [persons] = useState([
{ name: "Mark", age: 39 },
{ name: "Hanna", age: 28 },
]);
const change = (e) => {
setValue(e.target.value);
};
// useMemoλ₯Ό νμ©ν©μλ€!
const count = sum(persons);
return (
<div>
<input value={value} onChange={change} />
<p>{count}</p>
</div>
);
};
export default Example7;
μμ²λΌ persons
λΌλ state κ°μ μλ ageλΌλ κ°μ λν΄μ λ λλ§νλ μ»΄ν¬λνΈλ₯Ό λ§λ€μμ΅λλ€. μ μ½λμ λ¬Έμ μ μ 무μμΌκΉμ?
inputμ λ΄μ©μ΄ λ°λ λλ§λ€ sum
μ΄λΌλ ν¨μκ° μμ κ°μ΄ κ³μ μ€νλλ κ²μ νμΈν μ μμ΅λλ€. personsμ κ°μ΄ λ°λμ§λ μμλλ° ν΄λΉ sum
ν¨μκ° κ³μν΄μ μ€νλλ κ²μ λλΉμΌ κ²μ
λλ€.
useMemo Hookμ μ¬μ©νλ©΄ μ΄λ¬ν μμ μ μ΅μ ν ν μ μμ΅λλ€. λ λλ§ νλ κ³Όμ μμ νΉμ κ°μ΄ λ°λμμ λλ§ μ°μ°μ μ€ννκ³ λ§μ½μ μνλ κ°μ΄ λ°λ κ²μ΄ μλλΌλ©΄ μ΄μ μ μ°μ°νλ κ²°κ³Όλ₯Ό λ€μ μ¬μ©νλ λ°©μμ λλ€.
μ½λλ₯Ό λ€μκ³Ό κ°μ΄ μμ ν΄λ΄ μλ€.
const Example7 = () => {
const [value, setValue] = useState("");
const [persons] = useState([
{ name: "Mark", age: 39 },
{ name: "Hanna", age: 28 },
]);
const change = (e) => {
setValue(e.target.value);
};
// const count = sum(persons);
const count = useMemo(() => {
return sum(persons);
}, [persons]);
return (
<div>
<input value={value} onChange={change} />
<p>{count}</p>
</div>
);
};
export default Example7;
μμ κ°μ΄ useMemo
λ₯Ό νμ©νλ©΄, dependency listμ κ°μ λ£μ΄μ£Όλ κ²μ²λΌ λλ²μ§Έ μΈμλ‘ λ³νλ κ²μ κ°μ§ν κ°μ λ£μ΄μ£Όλ©΄ λ©λλ€. μ΄λ κ² λλ©΄ μμ κ°μ΄ inputμ λ΄μ©μ΄ λ°λμ΄λ sumμ΄λΌλ ν¨μκ° νΈμΆλμ§ μλ κ²μ μ μ μμ΅λλ€.
μ΄λ²μλ useReducer
, useMemo
μ λν΄ κ°λ¨ν μμ보μμ΅λλ€. λ€μμλ μ¬κΈ°μ λν΄ useCallback
κ³Ό useRef
μ λν΄ μ΄ν΄λ³΄λλ‘ νκ² μ΅λλ€.π