
React Hooksμλ μ¬λ¬ λΌμ΄λΈλ¬λ¦¬κ° μ‘΄μ¬ν©λλ€.
useReduceruseMemouseCallbackuseRefμμ κ°μ΄ μ΄μ€μμ λνμ μΌλ‘ μ¬μ©λλ μΆκ°μ μΈ 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μ λν΄ μ΄ν΄λ³΄λλ‘ νκ² μ΅λλ€.π