๐ 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);
์ด๋ถ๋ถ์ธ๋ฐ count ๊ฐ์ด ๋ณํ์ง ์์๋ input์ onChange ๋ฉ์๋๋ง ๋ฐ๋๋๋ ๊ณ์ ํธ์ถ๋๋ค.
๊ฐ์ด ๋ณํ์ง ์์๋ ํธ์ถํ์ง ์๊ฒ ๋ฐ๊ฟ์ฃผ๋๊ฒ useMemo ์ด๋ค.
1
const count = useMemo(() => countActiveUsers(users), [users]);
๋ฐ๊ฟ์ฃผ๋ฉด count ๊ฐ์ด ๋ณํ ๋๋ง ํธ์ถํ๊ฒ๋จ count๋ฅผ state๋ก ๋ง๋ค๋ฉด ํด๊ฒฐ๋์ง๋ง ๊ทธ๋ ๊ฒ ํ์ง์๋ ๊ฒฝ์ฐ๋ ์๊ธฐ์
useMemo๊ฐ ์ฌ์ฉ๋จ
useMemo ์ ์ฒซ๋ฒ์งธ ์ธ์์๋ ์ฐ์ฐํ ํจ์ ๋๋ฒ์งธ ์ธ์ deps ๋ฐฐ์ด
์ด ๋ฐฐ์ด ์์ ๋ฃ์ ๋ด์ฉ์ด ๋ฐ๋๋ฉด, ์ฐ๋ฆฌ๊ฐ ๋ฑ๋กํ ํจ์๋ฅผ ํธ์ถํด์ ๊ฐ์ ์ฐ์ฐํด์ฃผ๊ณ , ๋ง์ฝ์ ๋ด์ฉ์ด ๋ฐ๋์ง ์์๋ค๋ฉด ์ด์ ์ ์ฐ์ฐํ ๊ฐ์ ์ฌ์ฌ์ฉ
์์ ์ฃผ์