์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- slice/splice/split
- ์๋ฐ์คํฌ๋ฆฝํธ#JS#var#let#const#undefined#null
- ์๋ฐ์คํฌ๋ฆฝํธ
- Beesbeesbees
- UX
- cmarket
- removeCookie
- CSS
- User Flow
- children vs childrenNodes
- @redux-toolkit
- JS#3์ผ์ฐจ๋ฌ๋ฆฌ์#์ด๋ฐ์ธ๋ฐ#์๊ฐ๊ธ๋ฐฉ~
- UI
- ๋ ธ๋๊ต๊ณผ์
- react
- dom
- redux์ํ์ ์ง
- toString#String
- ํท๊ฐ๋ฆฐ๋ค~
- for~in/for~of
- ์๋ฐ์คํฌ๋ฆฝํธ#์กฐ๊ฑด๋ฌธ#๋ฌธ์์ด
- variable#function
- ๋ด์ฅ๊ณ ์ฐจํจ์
- js
- ์๋ฐ์คํฌ๋ฆฝํธ#JS#slice#splice
- https://developer-talk.tistory.com/299
- https://dasima.xyz/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%A0%9C%EA%B3%B1-math-pow-%EA%B3%84%EC%82%B0/
- ใทใ
- https://lo-victoria.com/introduction-to-redux-toolkit-for-beginners
- https://www.daleseo.com/js-array-slice-splice/
- Today
- Total
Daily Front_Minhhk
Hooks & useMemo, useCallback ๋ณธ๋ฌธ
๐ Hook
ํจ์ํ ์ปดํฌ๋ํธ์์ state ๊ฐ ๋ฐ ๋ค๋ฅธ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ํธํ๊ฒ ํด์ฃผ๋ ๋ฉ์๋๋ก, function์ผ๋ก๋ง React๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๊ธฐ ๋๋ฌธ์ Class Component์์๋ ๋์ํ์ง ์๋๋ค.
โ Hook ์ฌ์ฉ ๊ท์น
1. React ํจ์์ ์ต์์์์๋ง ํธ์ถํด์ผ ํ๋ค.
๋ฐ๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ, ์ค์ฒฉ๋ ํจ์ ๋ด์์ ์คํ ์, ๋์ํ์ง ์๋๋ค.
2. React ํจ์ ๋ด์์๋ง ์ฌ์ฉ๋์ด์ผ ํ๋ค.
๋ฆฌ์กํธ ํจ์ํ ์ปดํฌ๋ํธ๋ ์ปค์คํ Hook์ด ์๋ ๋ค๋ฅธ ์ผ๋ฐ JavaScript ํจ์ ์์์ ํธ์ถํด์๋ ์ ๋๋ค๋ ์๋ฏธ์ด๋ค.
useMemo๋?
useMemo๋ ํน์ ๊ฐ(value)๋ฅผ ์ฌ์ฌ์ฉํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ Hook์ ๋๋ค.
import { useMemo } from "react";
function Calculator({value}){
const result = useMemo(() => calculate(value), [value]);
return
<>
<div>
{result}
</div>
</>;
}
์ฌ๊ธฐ value ๋ฅผ ์ธ์๋ก ๋ฐ๋ Calculator ์ปดํฌ๋ํธ๊ฐ ์์ต๋๋ค. value ๋ ์ผ์ข ์ ๊ฐ์ผ๋ก์, ์ด ๊ฐ์ด ๊ณ์ ๋ฐ๋๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์ด์ฉ ์ ์๊ฒ ์ง๋ง, ๋ ๋๋ง์ ํ ๋๋ง๋ค ์ด value๊ฐ์ด ๊ณ์ ๋ฐ๋๋ ๊ฒ ์๋๋ผ๊ณ ์๊ฐํด ๋ด ์๋ค. ๊ทธ๋ผ ์ด ๊ฐ์ ์ด๋๊ฐ์ ์ ์ฅ์ ํด๋๋ค๊ฐ ๋ค์ ๊บผ๋ด์ ์ธ ์๋ง ์๋ค๋ฉด ๊ตณ์ด calculate ํจ์๋ฅผ ํธ์ถํ ํ์๋ ์์ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์ useMemo Hook์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ฐ ์์ผ๋ก useMemo๋ฅผ ํธ์ถํ์ฌ calculate๋ฅผ ๊ฐ์ธ์ฃผ๋ฉด, ์ด์ ์ ๊ตฌ์ถ๋ ๋ ๋๋ง๊ณผ ์๋ก์ด ๊ตฌ์ถ๋๋ ๋ ๋๋ง์ ๋น๊ตํด value๊ฐ์ด ๋์ผํ ๊ฒฝ์ฐ์๋ ์ด์ ๋ ๋๋ง์ value๊ฐ์ ๊ทธ๋๋ก ์ฌํ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ด๋ ๋ฉ๋ชจ์ด์ ์ด์ (Memoization) ๊ฐ๋ ๊ณผ ๊ธด๋ฐํ ๊ด๊ณ๊ฐ ์์ต๋๋ค.
โญ ๋ฉ๋ชจ์ด์ ์ด์
(Memoization)?
๊ธฐ์กด์ ์ํํ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด๋๊ณ , ๋์ผํ ์
๋ ฅ์ด ๋ค์ด์ค๋ฉด ์ฌํ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ด๋ค.
useMemo๋ ๋ฐ๋ก ์ด ๊ฐ๋ ์ ์ด์ฉํ์ฌ ๋ณต์กํ ์ฐ์ฐ์ ์ค๋ณต์ ํผํ๊ณ React ์ฑ์ ์ฑ๋ฅ์ ์ต์ ํ์ํจ๋ค.
์ค์ต
useMemo()
→
useMemo๋ ๊ฐ์ ์ฌ์ฌ์ฉ์ ์ํด ์ฌ์ฉํ๋ Hook
import React, { useMemo, useState } from "react";
import "./styles.css";
import { add } from "./add";
export default function App() {
const [name, setName] = useState("");
const [val1, setVal1] = useState(0);
const [val2, setVal2] = useState(0);
// const answer = add(val1, val2);
const answer = useMemo(()=> {add(val1, val2)}, [val1, val2])
return (
<div>
<input
className="name-input"
placeholder="์ด๋ฆ์ ์
๋ ฅํด์ฃผ์ธ์"
value={name}
type="text"
onChange={(e) => setName(e.target.value)}
/>
<input
className="value-input"
placeholder="์ซ์๋ฅผ ์
๋ ฅํด์ฃผ์ธ์"
value={val1}
type="number"
onChange={(e) => setVal1(Number(e.target.value))}
/>
<input
className="value-input"
placeholder="์ซ์๋ฅผ ์
๋ ฅํด์ฃผ์ธ์"
value={val2}
type="number"
onChange={(e) => setVal2(Number(e.target.value))}
/>
<div>{answer}</div>
</div>
);
}
→
์ด๋ฆ (์ฒซ๋ฒ์งธ)์ธํ์ ์ ๋ ฅ์ ๋๋๋ง ๋์ง ์๊ณ ,
์ซ์ ๊ฐ (๋๋ฒ์งธ, ์ธ๋ฒ์งธ) ์ฐ๋ ์ธํ์ ์ ๋ ฅ์ ์ฌ๋๋๋ง!
useCallback์ด๋?
useCallback ๋ํ useMemo์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฉ๋ชจ์ด์ ์ด์ ๊ธฐ๋ฒ์ ์ด์ฉํ Hook์ด๋ค.
useCallback์ ํจ์์ ์ฌ์ฌ์ฉ์ ์ํด ์ฌ์ฉํ๋ Hook์ด๋ค.
import React, { useCallback } from "react";
function Calculator({x, y}){
const add = useCallback(() => x + y, [x, y]);
return <>
<div>
{add()}
</div>
</>;
}
useMemo์ ๋ง์ฐฌ๊ฐ์ง๋ก, ํด๋น ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋๋ผ๋ ๊ทธ ํจ์๊ฐ ์์กดํ๊ณ ์๋ ๊ฐ์ธ x์ y๊ฐ ๋ฐ๋์ง ์๋๋ค๊ณ ์๊ฐํด ๋ด ์๋ค.
๊ทธ๋ ๋ค๋ฉด ํจ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ์ด๋๊ฐ์ ์ ์ฅํด ๋๋ค๊ฐ ๋ค์ ๊บผ๋ด์ ์ธ ์ ์์ ๊ฒ์ ๋๋ค.
์ด๋ useCallback Hook์ ์ฌ์ฉํ๋ฉด ๊ทธ ํจ์๊ฐ ์์กดํ๋ ๊ฐ๋ค์ด ๋ฐ๋์ง ์๋ ํ ๊ธฐ์กด ํจ์๋ฅผ ๊ณ์ํด์ ๋ฐํํฉ๋๋ค.
์ฆ x์ y๊ฐ์ด ๋์ผํ๋ค๋ฉด ๋ค์ ๋ ๋๋ง ๋ ์ด ํจ์๋ฅผ ๋ค์ ์ฌ์ฉํฉ๋๋ค.
useCallback์ ํจ์๋ฅผ ํธ์ถ์ ํ์ง ์๋ Hook์ด ์๋๋ผ, ๊ทธ์ ๋ฉ๋ชจ๋ฆฌ ์ด๋๊ฐ์ ํจ์๋ฅผ ๊บผ๋ด์ ํธ์ถํ๋ Hook์ด๊ธฐ ๋๋ฌธ์
๋จ์ํ ์ปดํฌ๋ํธ ๋ด์์ ํจ์๋ฅผ ๋ฐ๋ณตํด์ ์์ฑํ์ง ์๊ธฐ ์ํด์
useCallback์ ์ฌ์ฉํ๋ ๊ฒ์ ํฐ ์๋ฏธ๊ฐ ์๊ฑฐ๋ ์คํ๋ ค ์ํด์ธ ๊ฒฝ์ฐ๋ ์๋ค.
์์ ์ปดํฌ๋ํธ์ props๋ก ํจ์๋ฅผ ์ ๋ฌํด์ค ๋ ์ด useCallback์ ์ฌ์ฉํ๊ธฐ๊ฐ ์ข์ต๋๋ค.
useCallback๊ณผ ์ฐธ์กฐ ๋๋ฑ์ฑ
useCallback์ ์ฐธ์กฐ ๋๋ฑ์ฑ์ ์์กดํฉ๋๋ค. React๋ JavaScript ์ธ์ด๋ก ๋ง๋ค์ด์ง ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก JavaScript์ ๋ฌธ๋ฒ์ ๋ฐ๋ผ๊ฐ๋๋ค.
JavaScript์์ ํจ์๋ ๊ฐ์ฒด์ ๋๋ค.
๊ฐ์ฒด๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ ๋ ๊ฐ์ ์ ์ฅํ๋ ๊ฒ ์๋๋ผ ๊ฐ์ ์ฃผ์๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์, ๋ฐํํ๋ ๊ฐ์ด ๊ฐ์ ์ง๋ผ๋ ์ผ์น์ฐ์ฐ์๋ก ๋น๊ตํ์ ๋ false๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
->
React ๋ํ ๊ฐ์ต๋๋ค. React๋ ๋ฆฌ๋ ๋๋ง ์ ํจ์๋ฅผ ์๋ก์ด ๋ง๋ค์ด์ ํธ์ถ์ ํฉ๋๋ค.
์๋ก์ด ๋ง๋ค์ด ํธ์ถ๋ ํจ์๋ ๊ธฐ์กด์ ํจ์์ ๊ฐ์ ํจ์๊ฐ ์๋๋๋ค.
๊ทธ๋ฌ๋ useCallback์ ์ด์ฉํด ํจ์ ์์ฒด๋ฅผ ์ ์ฅํด์ ๋ค์ ์ฌ์ฉํ๋ฉด ํจ์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ฐ์ ์ ์ฅํ๋ค๊ฐ ๋ค์ ์ฌ์ฉํ๋ค๋ ๊ฒ๊ณผ ๊ฐ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ React ์ปดํฌ๋ํธ ํจ์ ๋ด์์ ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ๋๊ธฐ๊ฑฐ๋ ์์ ์ปดํฌ๋ํธ์ prop์ผ๋ก ๋๊ธธ ๋ ์์์น ๋ชปํ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๋ง์ ์ ์์ต๋๋ค.
๐ค์ค์ต
useCallback()
→
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"
};
const getItems = useCallback(() => {
return [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>
</>
);
}
'Code๊ฐ๋ฐ์ผ์ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React.lazy()์ Suspense (0) | 2023.01.26 |
---|---|
Custom Hooks (0) | 2023.01.25 |
๋ฒ๋ค๋ง๊ณผ ์นํฉ (0) | 2023.01.18 |
๋ฐ์ํ ์น (0) | 2023.01.16 |
๋ธ๋ผ์ฐ์ (0) | 2023.01.16 |