리액트/Hooks

ch04.useMemo

webmaster 2021. 11. 16. 21:56
728x90
  • 함수형 컴포넌트 내부에서 발생하는 연산을 최적화할 수 있다.
  • import React, { useState } from "react";
    
    const getAverage = (numbers) => {
      console.log("평균값 계산 중 ..");
      if (numbers.length === 0) return 0;
      const sum = numbers.reduce((a, b) => a + b);
      return sum / numbers.length;
    };
    const Average = () => {
      const [list, setList] = useState([]);
      const [number, setNumber] = useState("");
    
      const onChange = (e) => {
        setNumber(e.target.value);
      };
      const onInsert = (e) => {
        const nextList = list.concat(parseInt(number));
        setList(nextList);
        setNumber("");
      };
      return (
        <div>
          <input value={number} onChange={onChange} />
          <button onClick={onInsert}>등록</button>
          <ul>
            {list.map((value, index) => (
              <li key={index}>{value}</li>
            ))}
          </ul>
          <div>
            <b>평균값:</b>
            {getAverage(list)}
          </div>
        </div>
      );
    };
    
    export default Average;
  • import React, { useState } from "react";
    import Average from "./Average";
    const App = () => {
      return <Average />;
    };
    
    export default App;
  • 등록 버튼을 누를 때뿐만 아니라 Input 태그의 내용이 수정이 될 때에도 getAverage함수가 호출이 된다.
    • Input내용을 바꿀 때에는 getAverage함수를 호출할 필요가 없다.(자원 낭비)
    • useMemo를 활용한다
    • 특정 값이 바뀌었을 때만 연산을 실행하고 원하는 값이 바뀌지 않았다면 이전에 연산했던 결과를 다시 사용하는 방식
  • import React, { useState, useMemo } from "react";
    const getAverage = (numbers) => {
      console.log("평균값 계산 중 ..");
      if (numbers.length === 0) return 0;
      const sum = numbers.reduce((a, b) => a + b);
      return sum / numbers.length;
    };
    const Average = () => {
      const [list, setList] = useState([]);
      const [number, setNumber] = useState("");
    
      const onChange = (e) => {
        setNumber(e.target.value);
      };
      const onInsert = (e) => {
        const nextList = list.concat(parseInt(number));
        setList(nextList);
        setNumber("");
      };
      const avg = useMemo(() => getAverage(list), [list]);//avg 값이 변경되었을 때에만 계산하도록 수정
      return (
        <div>
          <input value={number} onChange={onChange} />
          <button onClick={onInsert}>등록</button>
          <ul>
            {list.map((value, index) => (
              <li key={index}>{value}</li>
            ))}
          </ul>
          <div>
            <b>평균값:</b>
            {avg}
          </div>
        </div>
      );
    };
    
    export default Average;
728x90

'리액트 > Hooks' 카테고리의 다른 글

ch06.useRef  (0) 2021.11.16
ch05.useCallback  (0) 2021.11.16
ch03.useReducer  (0) 2021.11.15
ch02.useEffect  (0) 2021.11.15
ch01.useState  (0) 2021.11.15