๐ฌ ReactJS๋ก ์ํ ์น ์๋น์ค ๋ง๋ค๊ธฐ (07) - Props, Memo
์ด๋ฒ์๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ(App())๊ฐ state(์ํ)๋ฅผ ๋ณ๊ฒฝํ ๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ค์๊ฒ๋ ์ด๋ค ์ผ์ด ์ผ์ด๋ ์ง ์์๋ณด์ !
props์ function
props์๋ text๋ boolean๊ฐ๋ง ๋ณด๋ผ ์ ์๋๊ฒ ์๋๋ผ ํจ์๋ ๋ณด๋ผ ์ ์๋ค!
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
function Btn({ text, onClick }) {
return (
<button
onClick={onClick}
style={{
backgroundColor: "tomato",
color: "white",
padding: "10px 20px",
borderRadius: 10,
border: 0,
}}
>
{text}
</button>
);
}
function App() {
const [value, setValue] = React.useState("Save Changes");
const changeValue = () => setValue("Revert Changes");
return (
<div>
<Btn text={value} onClick={changeValue} />
<Btn text="Continue" />
</div>
);
}
const root = document.getElementById("root");
ReactDOM.render(<App />, root);
<Btn text={value} onClick={changeValue} /> ์ฌ๊ธฐ์ onClick์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ์๋๋ค
์ด onClick์ ๊ทธ๋ฅ ๋ด๊ฐ ์ง์ ์ด๋ฆ์ด๊ณ ! button html ํ๊ทธ ์์ ๋ค์ด๊ฐ๋ ๊ฒ์ด ์๋
์ด ์ ๊ฒ์๋ฌผ์์์ banana์ฒ๋ผ function Btn({ text, onClick }) ์ด๋ ๊ฒ props์ ๋ด๊ฐ ์ง์ ๋ฃ์ด์ onClick์ด๋ผ๋ prop์ ๊ฐ๊ฒ ํ๋ ๊ฒ์ด๋ค
๊ทธ๋ฆฌ๊ณ button์ onClick์ด๋ผ๋ onClick ๋ฆฌ์ค๋๋ฅผ ๊ฐ๊ฒ ๋๋ ๊ฒ!
React.memo()
๋ถ๋ชจ ์ปดํฌ๋ํธ์ state๋ฅผ ๋ณ๊ฒฝํ๋ฉด ๋น์ฐํ ๊ทธ ์์ ์ปดํฌ๋ํธ๋ค๋ Re-render๊ฐ ์ผ์ด๋๊ฒ ๋๋ค
๋ถํ์ํ ๋ ๋๋ง์ด ๋ฐ์ํ ์๋ ์๋๋ฐ, ์ด ๊ฒฝ์ฐ์๋ React.memo()๋ก prop์ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ๋ถ๋ถ๋ง ๋ ๋๋ง ์ํฌ ์ ์๋ค
๋ง์ ์์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ธ ๊ฒฝ์ฐ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค!
Btn ํจ์์์ ์ฝ์๋ก๊ทธ๋ฅผ ์ฐ์ด๋ณด๋ฉด ๋ฒํผ ๋๊ฐ ๋ชจ๋ ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋ ๊ฒ์ ์ ์ ์๋ค.
๊ทธ์น๋ง ์ฐ๋ฆฐ ๋๋ฒ์งธ ๋ฒํผ์ ๋ค์ ๊ทธ๋ฆด ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ Memo๋ผ๋ ๊ฒ์ ์ฌ์ฉํด ํ์ํ ๊ฒ๋ง ๋ ๋๋ง์ด ์ผ์ด๋๋๋ก ํ ์ ์๋ค๐คฉ
1
2
3
4
5
6
7
8
9
10
11
const MemorizedBtn = React.memo(Btn);
function App() {
const [value, setValue] = React.useState("Save Changes");
const changeValue = () => setValue("Revert Changes");
return (
<div>
<MemorizedBtn text={value} onClick={changeValue} />
<MemorizedBtn text="Continue" />
</div>
);
}
MemorizedBtn๋ผ๋ ๊ฒ์ ๋ง๋ค์ด ์ ์ฉ์์ผ์ฃผ๋ฉด
์ฒซ๋ฒ์งธ ๋ฒํผ๋ง ๋ค์ ๊ทธ๋ ค์ง ๊ฒ์ ์ ์ ์๋ค !!
Coooool