반응형

컴포넌트 실행 전반에 걸쳐 함수를 저장할수 있게 하는 훅.

리액트에게 우리는 이 함수를 저장할 것이고 매번 실행때마다 이 함수를 재생성 할 필요가 없다는 걸 알릴 수 있다. → 동일한 함수 객체가 메모리의 동일한 위치에 저장되므로 이를 통해 비교작업이 가능함

//App.js

export default function App() {
  const [input, setInput] = useState(1);
  const [light, setLight] = useState(true);

  const theme = {
    backgroundColor: light ? "White" : "grey",
    color: light ? "grey" : "white"
  };

  const getItems = () => {
    return [input + 10, input + 100];
  };
  // const getItems = useCallback(() => {
  //   return [input, input + 10, input + 100]
  // },[input]);

  const handleChange = (event) => {
    if (Number(event.target.value)) {
      setInput(Number(event.target.value));
    }
  };

  return (
    <>
      <div style={theme} className="wall-paper">
        <input
          type="number"
          className="input"
          value={input}
          onChange={handleChange}
        />
        <button
          className={(light ? "light" : "dark") + " button"}
          onClick={() => setLight((prevLight) => !prevLight)}
        >
          {light ? "dark mode" : "light mode"}
        </button>
        <List getItems={getItems} />
      </div>
    </>
  );
}
//List.js
import { useState, useEffect } from "react";

function List({ getItems }) {
  /* Initial state of the items */
  const [items, setItems] = useState([]);

  /* This hook sets the value of items if 
     getItems object changes */
  useEffect(() => {
    console.log("아이템을 가져옵니다.");
    setItems(getItems());
  }, [getItems]);

  /* Maps the items to a list */
  return (
    <div>
      {items.map((item) => (
        <div key={item}>{item}</div>
      ))}
    </div>
  );
}

export default List;

사용법

저장하려는 함수를 래핑

useCallback 훅 사용, 함수를 첫번째 인자로 전달하면 useCallback은 이 저장된 함수를 반환해주고,

App 함수가 다시 실행되면 useCallback 이 리액트가 저장한 함수를 찾아서 그 같은 함수 객체를 재사용한다.

따라서, 어떤 함수가 절대 변경되어서는 안된다면 useCallback 을 사용하여 함수를 저장하면 된다.

useEffect 와 마찬가지로 두번째 인자가 필요하며 그것은 의존성 배열이다.

useEffect 와 같은 것을 의미한다.

'Tilog' 카테고리의 다른 글

json-server 라이브러리 이용하기  (0) 2022.07.28
useMemo_리액트 심화  (0) 2022.07.28
빌드와 번들링  (0) 2022.07.28
#엘리스 AI 트랙 면접후기  (0) 2021.12.27
#엘리스 AI 트랙 '역량 테스트' 후기  (0) 2021.12.21

+ Recent posts