-
[React] useMemo() μ¬μ©λ² _(리μ‘νΈ Hooks)JavaScript/React 2023. 6. 24. 23:59728x90λ°μν
π§ React Hooksμ useMemoλ₯Ό μμ보μ
μλ νμΈμ©. μ€λμ 리μ‘νΈ hooks μ€μμλ μμ£Ό μ¬μ©λλ νΈμΈ useMemoμ λν΄μ μμλ³΄λ €κ³ ν©λλ€.
useMemo() ν μ Reactμμ μ 곡νλ νλμ μ΅μ ν κΈ°μ λ‘, κ³μ° λΉμ©μ΄ λ§μ΄ λλ ν¨μ νΈμΆμ λ©λͺ¨μ΄μ μ΄μ νλ λ° μ¬μ©λ©λλ€. μ΄λ₯Ό ν΅ν΄ μ»΄ν¬λνΈμ 리λ λλ§μ μ€μ΄κ³ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€. λ³Έ ν¬μ€ν μ react 곡μ λ¬Έμλ₯Ό μ°Έκ³ νμ¬ μμ±λμμ΅λλ€.
μ€λμ useMemo Hookμ λν΄ μμλ³΄κ³ μ¬μ©ν΄ λ³Όκ²μ© π§
π useMemoλ λκ³ , μ΄λμ μ¬μ©λ κΉ?
useMemo()λ React Hook μ€ νλλ‘, ν¨μν μ»΄ν¬λνΈμμ κ³μ°λμ΄ λ§μ μ°μ°μ μ΅μ ννλ μ©λλ‘ μ¬μ©λ©λλ€. useMemo()λ λ©λͺ¨λ¦¬μ κ°μ μ μ₯ν΄λκ³ , ν΄λΉ κ°μ΄ νμν κ²½μ° μ΄μ μ κ³μ°ν κ°μ κ°μ Έμ μ¬μ©νκΈ° λλ¬Έμ λΆνμν κ³μ°μ μ€μ¬μ€λλ€.
π useMemoκ° μ¬μ©λλ κ²½μ°
useMemo()λ λ€μν μν©μμ μ μ©νκ² μ¬μ©λ μ μλλ°, μ£Όλ‘ λ€μκ³Ό κ°μ μν©μ μ¬μ©λ©λλ€.
- κ³μ°μ΄ 볡μ‘ν ν¨μλ₯Ό νΈμΆνλ κ²½μ°
- λΆνμν κ³μ°μ νΌνκ³ μ±λ₯μ ν₯μμν€λ κ²½μ°
- Propsλ μνκ° λ³κ²½λμμ λλ§ μ°μ°μ μννλ κ²½μ°
π useMemo μ¬μ©λ²
useMemo()λ₯Ό μ¬μ©νλ €λ©΄ λ€μκ³Ό κ°μ΄ Reactμμ μ 곡νλ ν μ import ν΄μΌ ν©λλ€.
import { useMemo } from 'react';
useMemo()λ 첫 λ²μ§Έ μΈμλ‘ μ½λ°± ν¨μλ₯Ό λ°κ³ , λ λ²μ§Έ μΈμλ‘ μμ‘΄μ± λ°°μ΄(dependency array)μ λ°μ΅λλ€.
const cachedValue = useMemo(calculateValue, dependencies)
π 첫 λ²μ§Έ μΈμ: calculateValue (μ½λ°± ν¨μ)
- Reactμμλ μΊμνκ³ μ νλ κ°μ κ³μ°νλ ν¨μμ λλ€.
- μ΄ ν¨μλ μΈμλ₯Ό λ°μ§ μκ³ μ΄λ€ νμ μ κ°μ΄λΌλ λ°νν©λλ€.
- μ΄κΈ° λ λλ§ μ Reactλ μ΄ ν¨μλ₯Ό νΈμΆν©λλ€.
- κ·Έ νμλ μμ‘΄μ±μ΄ μ΄μ λ λλ§ μ΄νλ‘ λ³κ²½λμ§ μμλ€λ©΄ Reactλ λμΌν κ°μ λ€μ λ°νν©λλ€.
π λ λ²μ§Έ μΈμ: dependencies (μμ‘΄μ± λ°°μ΄)
- μμ‘΄μ± λ°°μ΄μλ μ½λ°± ν¨μκ° μμ‘΄νλ κ°λ€μ λ£μ΄μ€λλ€.
- μμ‘΄μ± λ°°μ΄μ κ°μ΄ λ³κ²½λλ©΄, μ½λ°± ν¨μκ° νΈμΆλκ³ κ·Έ κ²°κ³Όκ°μ λ°νν©λλ€. κ·Έλ μ§ μμΌλ©΄ μ΄μ μ κ³μ°ν κ°μ μ¬μ¬μ©ν©λλ€.
π μ΄μ useMemoλ₯Ό μ§μ μ¬μ©ν΄λ³΄μ
κΈ°λ³Έμ μΌλ‘ 리μ‘νΈλ μ»΄ν¬λνΈκ° 리λ λλ§λ λλ§λ€ κ·Έ μ»΄ν¬λνΈ μ 체λ₯Ό μ¬μ€νν©λλ€.
μλ₯Ό λ€μ΄ μλ μ½λμμ todoListμ μνκ° λ³νκ±°λ λΆλͺ¨λ‘λΆν° propλ₯Ό μλ‘ λ°μμ¬ λλ§λ€ μλ filterTodos ν¨μλ μ¬μ€νλ©λλ€.
function TodoList({ todos, tab, theme }) { const visibleTodos = filterTodos(todos, tab); // ... }
π ν¬λ리μ€νΈ λ€ν¬/λΌμ΄νΈ λͺ¨λ
μλλ λ€ν¬λͺ¨λ, λΌμ΄νΈλͺ¨λ μ νμ΄ κ°λ₯ν ν¬λ리μ€νΈλ₯Ό ꡬνν μ½λμ λλ€. filterTodos ν¨μλ μΈμμ μΌλ‘ λλ¦¬κ² μλλλλ‘ μ§μ¬μ Έ μμ΅λλ€. νμ§λ§ useMemoλ₯Ό μ¬μ©νμ¬ λλ¦° λμ μ리μμλ μ½λλ λΉ λ₯΄κ² μνλ©λλ€.
π TodoList.js
import { useMemo } from 'react'; import { filterTodos } from './utils.js' export default function TodoList({ todos, theme, tab }) { const visibleTodos = useMemo( // useMemo() μ¬μ© () => filterTodos(todos, tab), [todos, tab] ); return ( <div className={theme}> <p><b>Note: <code>filterTodos</code> is artificially slowed down!</b></p> <ul> {visibleTodos.map(todo => ( <li key={todo.id}> {todo.completed ? <s>{todo.text}</s> : todo.text } </li> ))} </ul> </div> ); }
π App.js
import { useState } from 'react'; import { createTodos } from './utils.js'; import TodoList from './TodoList.js'; const todos = createTodos(); export default function App() { const [tab, setTab] = useState('all'); const [isDark, setIsDark] = useState(false); return ( <> <button onClick={() => setTab('all')}> All </button> <button onClick={() => setTab('active')}> Active </button> <button onClick={() => setTab('completed')}> Completed </button> <br /> <label> <input type="checkbox" checked={isDark} onChange={e => setIsDark(e.target.checked)} /> Dark mode </label> <hr /> <TodoList todos={todos} tab={tab} theme={isDark ? 'dark' : 'light'} /> </> ); }
π utils.js
export function createTodos() { const todos = []; for (let i = 0; i < 50; i++) { todos.push({ id: i, text: "Todo " + (i + 1), completed: Math.random() > 0.5 }); } return todos; } export function filterTodos(todos, tab) { console.log('[ARTIFICIALLY SLOW] Filtering ' + todos.length + ' todos for "' + tab + '" tab.'); let startTime = performance.now(); while (performance.now() - startTime < 500) { // Do nothing for 500 ms to emulate extremely slow code } return todos.filter(todo => { if (tab === 'all') { return true; } else if (tab === 'active') { return !todo.completed; } else if (tab === 'completed') { return todo.completed; } }); }
ππ» μ κΉ, μ£Όμ μ¬ν
- useMemoλ Hookμ΄λ―λ‘ μ»΄ν¬λνΈμ μ΅μμ λ 벨μ΄λ μ§μ μμ±ν Hook λ΄μμλ§ νΈμΆν μ μμ΅λλ€.
- λ°λ³΅λ¬Έμ΄λ 쑰건문 λ΄μμ νΈμΆν μλ μμ΅λλ€.
- μ격 λͺ¨λ(Strict Mode)μμλ μλμΉ μμ λΆμλ¬Ό(impurity)μ μ°Ύμμ£ΌκΈ° μν΄ κ³μ° ν¨μλ₯Ό λ λ² νΈμΆν©λλ€.
π μμ½
μ΄λ² ν¬μ€ν μμλ Reactμ useMemo() ν μ λν΄ λ€λ£¨μμ΅λλ€. useMemo()λ κ³μ° λΉμ©μ΄ λ§μ΄ λλ ν¨μ νΈμΆμ λ©λͺ¨μ΄μ μ΄μ νμ¬ μ±λ₯μ ν₯μμν€λ μν μ ν©λλ€. μ΄λ₯Ό ν΅ν΄ λΆνμν 리λ λλ§μ λ°©μ§νκ³ μ ν리μΌμ΄μ μ μ±λ₯μ μ΅μ νν μ μμ΅λλ€. κ·ΈλΌμλ useMemo()λ₯Ό λ¨μ©νλ©΄ μ½λλ₯Ό 볡μ‘νκ² λ§λ€ μ μμΌλ―λ‘, νμ μ±λ₯ λ¬Έμ κ° μ€μ λ‘ λ°μνλ κ²½μ°μλ§ μ¬μ©νλ κ²μ΄ μ’μμ!
λ€μμλ λ λ€λ₯Έ 리μ‘νΈ hookμ μ£Όμ λ‘ κ³΅λΆν΄ λ³΄κ² μ΅λλΉ π
μ°Έκ³ λ¬Έμ
https://react.dev/reference/react/useMemo
LIST'JavaScript > React' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ