ํ ์ ํฌ๊ธฐ๋ก ์๋ผ ๋จน๋ ๋ฆฌ์กํธ ์น์ 8- ๋ผ์ดํ์ฌ์ดํด
๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ๋ผ์ดํ ์ฌ์ดํด์ด๋?
Mount -> Update -> UnMount
๋ก ๊ตฌ๋ถ๋๋ค.
์ปดํฌ๋ํธ๊ฐ ํ์ํ๋ ์๊ฐ
ํ๋ฉด์ ์ฒ์ ๋ ๋๋ง ๋๋ ์๊ฐ
์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง ๋๋ ์๊ฐ
๋ฆฌ๋ ๋๋ง ๋ ๋๋ฅผ ์๋ฏธ
์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์์ ์ฌ๋ผ์ง๋ ์๊ฐ
๋ ๋๋ง์์ ์ ์ธ ๋๋ ์๊ฐ์ ์๋ฏธ
์ปดํฌ๋ํธ ๋ผ์ดํ์ฌ์ดํด ๋ง๋ค ์ปดํฌ๋ํธ๊ฐ ๊ฐ๊ฐ ๋ค๋ฅธ ์์ ์ ์ํํ๋๋ก ๋ง๋๋ ๊ฒ
์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ์์
์ด๋ค ๊ฐ์ด ๋ณ๊ฒฝ๋์๋์ง ์ฝ์์ ์ถ๋ ฅ
์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ์ ๋ฆฌ
useEffect๋? ๋ฆฌ์กํธ์ปดํฌ๋ํธ์ ์ฌ์ด๋ ์ดํํธ(ํ์๋๋ ํจ๊ณผ)๋ฅผ ์ ์ดํ๋ ์๋ก์ด React Hook์ด๋ค.
import "./App.css";
import Viewer from "./components/Viewer";
import Controller from "./components/Controller";
import { useState, useEffect } from "react";
function App() {
const [count, setCount] = useState(0);
useEffect(() => {
//count์คํ
์ดํธ ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค ์ฒซ๋ฒ์งธ ์ธ์์ธ ์ฝ๋ฐฑํจ์๋ฅผ ์คํ
console.log(`count: ${count}`);
}, [count]);
const onClickButton = (value) => {
setCount(count + value);
};
return (
<div className="App">
<h1>Simple Counter</h1>
<section>
<Viewer count={count} />
</section>
<section>
<Controller onClickButton={onClickButton} />
</section>
</div>
);
}
export default App;

//1. ๋ง์ดํธ : ํ์
useEffect(() => {
console.log("mount");
}, []);

import "./App.css";
import Viewer from "./components/Viewer";
import Controller from "./components/Controller";
import { useState, useEffect, useRef } from "react";
function App() {
const [count, setCount] = useState(0);
const isMount = useRef(false);
//1. ๋ง์ดํธ : ํ์
useEffect(() => {
console.log("mount");
}, []);
//2. ์
๋ฐ์ดํธ : ๋ณํ, ๋ฆฌ๋ ๋๋ง
useEffect(() => {
if (!isMount.current) {
isMount.current = true;
return;
}
console.log("update");
});
//3. ์ธ๋ง์ด : ์ฃฝ์
useEffect(() => {
console.log("update");
});
const onClickButton = (value) => {
setCount(count + value); //Controller์ ๋ช
๋ น์ ๋ฐ์์ ํ์ฌ ๊ฐ๊ณผ ์ ํ๋ ๊ฐ์ ๊ณ์ฐํ๋ ์ฝ๋!
};
return (
<div className="App">
<h1>Simple Counter</h1>
<section>
<Viewer count={count} />
</section>
<section>
<Controller onClickButton={onClickButton} />
</section>
</div>
);
}
export default App;
์ง์ง ์ปดํฌ๋ํธ์ ์ ๋ฐ์ดํธ ๋จ๊ณ์์๋ง ์ฝ๋๋ฅผ ์คํ์ํค๊ณ ์ถ๋ค๋ฉด, useRef๋ฅผ ์ฌ์ฉํ๋ค.

Even.jsx
import { useEffect } from "react";
const Even = () => {
useEffect(() => {
//ํด๋ฆฐ์
, ์ ๋ฆฌํจ์
return () => {
console.log("unmount");
};
}, []);
return <div>์ง์</div>;
};
export default Even;
App.jsx
import "./App.css";
import Viewer from "./components/Viewer";
import Controller from "./components/Controller";
import Even from "./components/Even";
import { useState, useEffect, useRef } from "react";
function App() {
const [count, setCount] = useState(0);
const isMount = useRef(false);
//1. ๋ง์ดํธ : ํ์
useEffect(() => {
console.log("mount");
}, []);
//2. ์
๋ฐ์ดํธ : ๋ณํ, ๋ฆฌ๋ ๋๋ง
useEffect(() => {
if (!isMount.current) {
isMount.current = true;
return;
}
console.log("update");
});
//3. ์ธ๋ง์ด : ์ฃฝ์
useEffect(() => {
console.log("update");
});
const onClickButton = (value) => {
setCount(count + value); //Controller์ ๋ช
๋ น์ ๋ฐ์์ ํ์ฌ ๊ฐ๊ณผ ์ ํ๋ ๊ฐ์ ๊ณ์ฐํ๋ ์ฝ๋!
};
return (
<div className="App">
<h1>Simple Counter</h1>
<section>
<Viewer count={count} />
{count % 2 == 0 ? <Even /> : null}
</section>
<section>
<Controller onClickButton={onClickButton} />
</section>
</div>
);
}
export default App;

https://chromewebstore.google.com/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=ko&pli=1
์ค์น ํ,

ํ์ฅํ๋ก๊ทธ๋จ ๊ด๋ฆฌ๋ก ๋ค์ด๊ฐ๋ค.

์ธ๋ถ์ ๋ณด๋ก ๋ค์ด๊ฐ์ ๋ชจ๋ ์ฌ์ดํธ์์ ๋ก ์ค์ ํด์ค ํ, ํ์ผ URL์ ๋ํ ์์ธ์ค ํ์ฉ์ ์ผ์ค๋ค.

๊ณ ์ ๊น์ง ํด์ฃผ๋ฉด ์์ฑ!

๋นจ๊ฐ์์ผ๋ก ๋ฐ๋ react tool์ ๋ณผ ์ ์๋ค.

๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ด์ด์ components์ ๋ค์ด๊ฐ๊ฒ ๋๋ฉด ์ฐ๋ฆฌ๊ฐ ์ ๋ ฌํ components๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.

์ปดํฌ๋ํธ๋ฅผ ํด๋ฆญํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ฐ๋ props์ hooks๋ฅผ ๋ณผ ์ ์๋ค.

ํฑ๋๋ฐํด๋ฅผ ํด๋ฆญํ์ฌ Highlight updates when components render๋ฅผ ์ฒดํฌํด์ฃผ๋ฉด ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ์์ ๋, ํ์ด๋ผ์ดํธ๋ก ์๋ ค์ค๋ค.