Home useMemo
Post
Cancel

useMemo

๐Ÿ“Œ useMemo

์ฐธ๊ณ  ์ฃผ์†Œ

https://react.vlpt.us/basic/17-useMemo.html

โœ๏ธ ์—ฐ์‚ฐ๊ฐ’ ์žฌ์‚ฌ์šฉ

useMemo๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•˜์—ฌ ์—ฐ์‚ฐ๋œ ๊ฐ’ ์žฌ์‚ฌ์šฉํ•˜๋Š” hook ์ด๋‹ค.

์˜ˆ์‹œ

์œ ์ € ์ด๋ฆ„์„ ํด๋ฆญํ•˜๋ฉด active ๊ฐ’์„ true ๋กœ ๋ฐ”๊ฟ” ๊ธ€์ž์ƒ‰์„ ๋ณ€ํ™”์‹œํ‚ค๋Š” ํŽ‘์…˜์„ ๋งŒ๋“ค์–ด ๋ณธ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import React, { useMemo, useRef, useState } from "react";
import UserList from "./UserList";
import CreateUser from "./CreateUser";

function countActiveUsers(users) {
  console.log("ํ™œ์„ฑ ์‚ฌ์šฉ์ž ์ˆ˜๋ฅผ ์„ธ๋Š”์ค‘...");
  return users.filter((user) => user.active).length;
}

function UseMemo() {
  const [inputs, setInputs] = useState({
    username: "",
    email: "",
  });
  const { username, email } = inputs;
  const onChange = (e) => {
    const { name, value } = e.target;
    setInputs({
      ...inputs,
      [name]: value,
    });
  };
  const [users, setUsers] = useState([
    {
      id: 1,
      username: "velopert",
      email: "public.velopert@gmail.com",
      active: true,
    },
    {
      id: 2,
      username: "tester",
      email: "tester@example.com",
      active: false,
    },
    {
      id: 3,
      username: "liz",
      email: "liz@example.com",
      active: false,
    },
  ]);

  const nextId = useRef(4);
  const onCreate = () => {
    const user = {
      id: nextId.current,
      username,
      email,
    };
    setUsers(users.concat(user));

    setInputs({
      username: "",
      email: "",
    });
    nextId.current += 1;
  };

  const onRemove = (id) => {
    // user.id ๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์›์†Œ๋งŒ ์ถ”์ถœํ•ด์„œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ฌ
    // = user.id ๊ฐ€ id ์ธ ๊ฒƒ์„ ์ œ๊ฑฐํ•จ
    setUsers(users.filter((user) => user.id !== id));
  };
  const onToggle = (id) => {
    setUsers(
      users.map((user) =>
        user.id === id ? { ...user, active: !user.active } : user
      )
    );
  };
  const count = countActiveUsers(users);
  return (
    <>
      <CreateUser
        username={username}
        email={email}
        onChange={onChange}
        onCreate={onCreate}
      />
      <UserList users={users} onRemove={onRemove} onToggle={onToggle} />
      <div>ํ™œ์„ฑ์‚ฌ์šฉ์ž ์ˆ˜ : {count}</div>
    </>
  );
}

export default UseMemo;
1
const count = countActiveUsers(users);

ezgif com-gif-maker (4)

์ด๋ถ€๋ถ„์ธ๋ฐ count ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š์•„๋„ input์— onChange ๋ฉ”์„œ๋“œ๋งŒ ๋ฐœ๋™๋˜๋„ ๊ณ„์† ํ˜ธ์ถœ๋œ๋‹ค.

๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š์„๋•Œ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ฒŒ ๋ฐ”๊ฟ”์ฃผ๋Š”๊ฒŒ useMemo ์ด๋‹ค.

1
const count = useMemo(() => countActiveUsers(users), [users]);

ezgif com-gif-maker (5)

๋ฐ”๊ฟ”์ฃผ๋ฉด count ๊ฐ’์ด ๋ณ€ํ• ๋•Œ๋งŒ ํ˜ธ์ถœํ•˜๊ฒŒ๋จ count๋ฅผ state๋กœ ๋งŒ๋“ค๋ฉด ํ•ด๊ฒฐ๋˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€์•Š๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๊ธฐ์—

useMemo๊ฐ€ ์‚ฌ์šฉ๋จ

useMemo ์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž์—๋Š” ์—ฐ์‚ฐํ•  ํ•จ์ˆ˜ ๋‘๋ฒˆ์งธ ์ธ์ž deps ๋ฐฐ์—ด

์ด ๋ฐฐ์—ด ์•ˆ์— ๋„ฃ์€ ๋‚ด์šฉ์ด ๋ฐ”๋€Œ๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ๋“ฑ๋กํ•œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ฐ’์„ ์—ฐ์‚ฐํ•ด์ฃผ๊ณ , ๋งŒ์•ฝ์— ๋‚ด์šฉ์ด ๋ฐ”๋€Œ์ง€ ์•Š์•˜๋‹ค๋ฉด ์ด์ „์— ์—ฐ์‚ฐํ•œ ๊ฐ’์„ ์žฌ์‚ฌ์šฉ

์˜ˆ์‹œ ์ฃผ์†Œ

https://github.com/moonjh9392/hooks

This post is licensed under CC BY 4.0 by the author.

useCallback

customhook