[React] React Hooks - useCallback

Hannahhhยท2022๋…„ 9์›” 28์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
25/30

๐Ÿ” useCallback


useMemo์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฉ”๋ชจ์ œ์ด์…˜ ๊ธฐ๋ฒ•์„ ์ด์šฉํ•œ Hook์œผ๋กœ, ํ•จ์ˆ˜์˜ ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” Hook์ด๋‹ค.


const memoizedCallback = useCallback(
  () => {
    doSomething(a, b);
  },
  [a, b],
);

์œ„์˜ ์˜ˆ์‹œ๋Š” useCallback ์‚ฌ์šฉ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋กœ, ๋‘ ๋ฒˆ์งธ ์ธ์ž์ธ ์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ๋งŒ ๋‹ค์‹œ ๋ฉ”๋ชจ์ œ์ด์…˜๋œ ๋ฒ„์ „์ด ๋ณ€๊ฒฝ๋œ๋‹ค.


import React, { useCallback } from "react";

function Calculator({x, y}){

	const add = useCallback(() => x + y, [x, y]);

	return 
  <>
      <div>
      	{add()}
      </div>
  </>;
}

์œ„์˜ ์˜ˆ์‹œ๋Š” props๋กœ ๋ฐ›์€ x, y๊ฐ’์„ add ํ•จ์ˆ˜์— ์ธ์ž๋กœ ๋„˜๊ฒจ์„œ ๊ฐ’์„ ๋”ํ•˜์—ฌ<div> ํƒœ๊ทธ์— ๋”ํ•œ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ณ  ์žˆ๋Š” ์ฝ”๋“œ์ด๋‹ค.

๋งŒ์•ฝ x, y๊ฐ’์ด ์ง€์†์ ์œผ๋กœ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, useCallback Hook์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ธฐ์กด ํ•จ์ˆ˜๋ฅผ ๊ณ„์†ํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๋‹ค์Œ ๋ Œ๋”๋ง ๋•Œ ๊ธฐ์กด ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•œ๋‹ค.



๐Ÿ‘€ ์ฐธ์กฐ ๋™๋“ฑ์„ฑ์— ์˜์กดํ•˜๋Š” useCallback


React๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ JavaScript์˜ ๋ฌธ๋ฒ•์„ ๋”ฐ๋ผ๊ฐ€๋ฉฐ, JavaScript์—์„œ ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

๊ฐ์ฒด๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•  ๋•Œ, ๊ฐ’์ด ์•„๋‹Œ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜ํ™˜ ๊ฐ’์ด ๊ฐ™๋”๋ผ๋„ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ฐ’์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์—†๋‹ค.
๋”ฐ๋ผ์„œ, ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜๋Š” ๊ธฐ์กด์˜ ํ•จ์ˆ˜์™€ ๊ฐ™์€ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ useCallback ์„ ์ด์šฉํ•ด ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ์ €์žฅํ•ด์„œ ์žฌ์‚ฌ์šฉ ์‹œ, ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ฐ’์„ ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชฉ์ ์œผ๋กœ ์œ ์šฉํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ˆœํžˆ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ,

  • React ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ํ•จ์ˆ˜๋ฅผ ๋„˜๊ธธ๋•Œ

  • ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ prop์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์ค„๋•Œ

์žฌ์‹คํ–‰์ด ์ผ์–ด๋‚˜๋Š” ํšŸ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.




๐Ÿ”ฅ ์‹ค์Šต ์˜ˆ์‹œ


// App.js

import { useState, useCallback } from "react";
import "./styles.css";
import List from "./List";

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

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

  // useCallback ์‚ฌ์šฉ
  const getItems = useCallback(() => {
    return [input + 10, input + 100];
  },[input]);

  // ์ตœ์ ํ™” ์ „
  // const getItems = () => {
  //   return [input + 10, input + 100];
  // };

  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;

CSS ์ฝ”๋“œ ์ƒ๋žต





๐Ÿ”ฅ useMemo์™€ useCallback์˜ ์ฐจ์ด


๋ถ„๋ฅ˜useCallbackuseMemo
์‚ฌ์šฉ ๋ชฉ์ ๊ฐ’์˜ ์žฌ์‚ฌ์šฉํ•จ์ˆ˜์˜ ์žฌ์‚ฌ์šฉ
ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์„ ๋ง‰๋Š”๊ฐ€?XO
์ตœ์ ํ™” ์ฒด๊ฐ ์ •๋„์ž‘์Œํผ

// useMemo ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
const memoizedValue = useMemo(
() => computeExpensiveValue(a, b), [a, b]);

// useCallback ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
const memoizedCallback = useCallback(
  () => {
    doSomething(a, b);
  },
  [a, b],
);

useCallback(fn, deps) ์€ useMemo(() => fn, deps)์™€ ๊ฐ™๋‹ค.




Reference:

์ฝ”๋“œ์Šคํ…Œ์ด์ธ 

https://ko.reactjs.org/docs/hooks-reference.html#usecallback

0๊ฐœ์˜ ๋Œ“๊ธ€