UseMemo

useMemo

  • 값을 λ©”λͺ¨μ΄μ œμ΄μ…˜ν•¨
  • νŠΉνžˆλ‚˜ 였래 κ±Έλ¦¬λŠ”, μžμ›μ„ 많이 μ†Œλͺ¨ν•˜λŠ” 연산일 경우, μ»΄ν¬λ„ŒνŠΈ λ Œλ”λ§ μ‹œλ§ˆλ‹€ ν•΄λ‹Ή 연산을 ν•˜λŠ” 것은 λ°”λžŒμ§ν•˜μ§€ μ•ŠμŒ.
  • λ”°λΌμ„œ useMemoμ—μ„œλŠ” μ˜μ‘΄μ„± 배열에 νŠΉμ • 값을 λ„£μ–΄μ„œ, νŠΉμ • 값이 λ°”λ€ŒλŠ” κ²½μš°μ—λ§Œ ν•΄λ‹Ή 연산이 이뀄지도둝 ν•  수 μžˆλ‹€.

useMemoκ°€ μ—†λŠ” μ½”λ“œ

const FilterComponent = () => {
  const [query, setQuery] = useState("");
  const [count, setCount] = useState(0);

  const filtered = ITEMS.filter((item) => {
    console.log("ν•„ν„° μž¬κ³„μ‚°");
    return item.name.toLowerCase().includes(query.toLowerCase());
  });

  return (
    <>
      <input value={query} onChange={(e) => setQuery(e.target.value)} />

      {filtered.map((item) => (
        <div key={item.id}>{item.name}</div>
      ))}

      <button onClick={() => setCount((c) => c + 1)}>+count</button>
      <div>{count}</div>
    </>
  );
};

useMemoλ₯Ό ν™œμš©ν•œ μ½”λ“œ

const FilterComponent = () => {
  const [query, setQuery] = useState("");
  const [count, setCount] = useState(0);

  const filtered = useMemo(() => {
    console.log("ν•„ν„° μž¬κ³„μ‚°");
    return ITEMS.filter((item) =>
      item.name.toLowerCase().includes(query.toLowerCase())
    );
  }, [query]);

  return (
    <>
      <input value={query} onChange={(e) => setQuery(e.target.value)} />

      {filtered.map((item) => (
        <div key={item.id}>{item.name}</div>
      ))}

      <button onClick={() => setCount((c) => c + 1)}>+count</button>
      <div>{count}</div>
    </>
  );
};
  • queryκ°€ λ°”λ€” λ•Œμ—λ§Œ ν•„ν„° μž¬μ‹€ν–‰
    • countλ₯Ό 클릭해도 λ¦¬λ Œλ”λ§μ΄ λ˜μ§€λ§Œ, filtered에 λŒ€ν•œ 계산은 μŠ€ν‚΅ν•œλ‹€.
    • 즉, μ˜μ‘΄μ„± λ°°μ—΄λ‘œ 넣은 query의 값이 λ°”λ€Œμ§€ μ•ŠμœΌλ©΄ 이전에 κ²Œμ‚°λœ μΊμ‹œλ₯Ό κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•˜λŠ” 것이닀.