๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ ์ฑ ์ ์คํฐ๋ํ๋ฉฐ ์ ๋ฆฌํ๋ ๊ธ์ ๋๋ค.
// Counter.js ํ์ผ์ ํด๋น ์ฝ๋๋ฅผ ์
๋ ฅํด์ค๋ค.
import React, { useState } from "react";
const Counter = () => {
// ๊ธฐ๋ณธ๊ฐ์ 0์ผ๋ก ์ค์ .
const [value, setValue] = useState(0);
return (
<div>
<p>
ํ์ฌ ์นด์ดํฐ ๊ฐ์ <b>{value}</b>์
๋๋ค.
</p>
// ์ํ๋ฅผ ์ค์ ํ๋ ๊ฐ์ธ setValue๋ฅผ ๋ฃ์ด์ฃผ๊ณ ์ํ๊ฐ์์ ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค.
<button onClick={() => setValue(value + 1)}>+1</button>
<button onClick={() => setValue(value - 1)}>-1</button>
</div>
);
};
export default Counter;
๋จผ์ Counter๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ค ๋ค setValue๋ผ๋ useState ๊ฐ์
์ ์ธํด์ฃผ๊ณ useState์ ํจ์ ํ๋ผ๋ฏธํฐ์๋ ๊ธฐ๋ณธ๊ฐ(0)์ ๋ฃ์ด์ค๋ค.
์ด ํจ์๊ฐ ํธ์ถ๋๋ฉด ๋ฐฐ์ด์ด ๋ฐํ๋๊ณ ๊ทธ ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ์์๋ ์ํ ๊ฐ , ๋๋ฒ์งธ ์์๋
์ํ๋ฅผ ์ค์ ํ๋ ๊ฐ์ด ๋๋๊ฒ์ด๋ค. ์ด ํจ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฃ์ด ํธ์ถํ๋ฉด ์ ๋ฌ๋ฐ์ ํ๋ผ๋ฏธํฐ๋ก
๊ฐ์ด ๋ฐ๋๊ณ ์ปดํฌ๋ํธ๊ฐ ์ ์์ ์ผ๋ก ๋ฆฌ๋ ๋๋ง ๋๋ค๊ณ ํ๋ค.
๊ทธ๋์ value ๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ธ 0๋ถํฐ ์์ํ๊ณ +1์ธ ๋ฒํผ์ ํด๋ฆญํ์ ์ ์ซ์๊ฐ ํ๋์ฉ
๋์ด๋๊ณ -1์ธ ๋ฒํผ์ ํด๋ฆญํ์ ์๋ ์ซ์๊ฐ ํ๋์ฉ ์ค์ด๋๋๊ฒ์ ๋ณผ ์ ์๋ค.
import React, { useState } from "react";
const Info = () => {
const [name, setName] = useState("");
const [nickname, setNickname] = useState("");
const onChangeName = (e) => {
setName(e.target.value);
};
const onChangeNickname = (e) => {
setNickname(e.target.value);
};
return (
<>
<div>
<input value={name} onChange={onChangeName} />
<input value={nickname} onChange={onChangeNickname} />
</div>
<div>
<div>
<b>์ด๋ฆ: </b>
{name}
</div>
<div>
<b>๋๋ค์: </b>
{nickname}
</div>
</div>
</>
);
};
export default Info;
์ด ์์ ๊ฐ์ ๊ฒฝ์ฐ ์ด๋ฆ์ ์ ์ฅํ๋ state ๊ฐ๊ณผ ๋๋ค์์ ์ ์ฅํ๋ state ๊ฐ 2๊ฐ๋ฅผ ๋ง๋ค์๋๋ฐ
๋จผ์ onChangeName์ด๋ผ๋ ํจ์๋ฅผ ์ ์ธํด์ค ๋ค -> ์ํ๋ฅผ ์ค์ ํ๋ ๊ฐ์ธ setName์
์ด onChange ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ฒ ๋ ๋์ ๊ฐ์ ๋ด์์ฃผ๊ณ -> ๊ฐ์ด ๋ค์ด์ค๋ input ํ๊ทธ์
value ๊ฐ์ ์ฒซ๋ฒ์งธ ์์์ธ name ์ฆ, ํ์ฌ ์ํ๊ฐ์ ๋ฃ์ด์ฃผ๊ณ
๋ผ๊ณ ์ ์ธํด์ฃผ๋ฉด input์ ๋ฃ๋ ๊ฐ์ด ์๋ div ํ ์คํธ์ ์ ๋ค์ด๊ฐ ์๋๊ฒ์ ๋ณผ ์ ์๋ค!
useEffect(() => {
console.log("๋ ๋๋ง์ด ์๋ฃ๋์์ต๋๋ค!");
console.log({
name,
nickname,
});
});
useEffect(() => {
console.log("effect");
console.log(name);
return () => {
console.log("cleanup");
console.log(name);
};
// ํ๋จ [name] ๋ถ๋ถ์ด ํ๋ผ๋ฏธํฐ ๋ฐฐ์ด๊ฐ์ด๋ค.
}, [name]);
์ผ๋จ useEffect๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค ํน์ ์์
์ ์ํํ๋๋ก ์ค์ ํ ์ ์๋
Hook์ด๋ค. ์๊น ์คํํ๋ ์์ ์ useEffect๋ฅผ ์ฌ์ฉํ์ฌ ์์๋ณด๋๋ก ํ์.
์ฒซ๋ฒ์งธ useEffect ๊ฐ์ ๊ฒฝ์ฐ๋ ์๊น ์ฒ๋ฆฌํด๋์๋ name๊ณผ nickname์ ์ฝ์์ ์ถ๋ ฅํ๊ฒ ๋๋ฉด ๋ด๊ฐ input์ ๊ฐ์ ์ ์๋๋ง๋ค ์ฝ์์ ์ฐํ๋๊ฑธ ์ ์ ์๋ค.
-> ์
๋ฐ์ดํธ ๋ ๋๋ง๋ค ์คํ์ค.
๋๋ฒ์งธ useEffect ๊ฐ์ ๊ฒฝ์ฐ๋ ๋ง์ดํธ๋ ๋๋ง ์คํํ๊ณ ์ ํ๋๊ฑด๋ฐ ์ปดํฌ๋ํธ๊ฐ ๋งจ ์ฒ์ ๋ ๋๋ง ๋ ๋๋ง ์คํํ๊ณ , ์
๋ฐ์ดํธ ๋ ๋๋ ์คํํ์ง ์๊ณ ์ ํ๋ฉด ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ๋น์ด์๋ ๋ฐฐ์ด์ ๋ฃ์ด์ฃผ๋ฉด ๋๋๊ฒ์ด๋ค!
๊ทธ๋ฌ๋ฉด ์ฒ์ ์๋ก๊ณ ์นจ์ ํ์๋๋ง ์ฝ์์ ์ฐํ๋๊ฑธ ๋ณผ ์ ์๋ค.
-> ๋งจ ์ฒ์ ๋ ๋๋ง ๋ ๋๋ง ์คํ.
์ฆ useEffect๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ๋๋ง์ด ๋ ์งํ๋ง๋ค ์คํ๋๋๋ฐ ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ๋ฌด์์
๋ฃ๋์ง์ ๋ฐ๋ผ ์คํ๋๋ ์กฐ๊ฑด์ด ๋ฌ๋ผ์ง๋๊ฒ์ด๋ค. ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ ๋๊ธฐ ์ ์ด๋ ์
๋ฐ์ดํธ
๋๊ธฐ ์ ์ ์ด๋ ํ ์์
์ ์ํํ๊ณ ์ถ๋ค๋ฉด ๋ท์ ๋ฆฌ(cleanup) ํจ์๋ฅผ ๋ฐํํด์ฃผ๋ฉด ๋๋ค.
const Info = () => {
const [visible, setVisible] = useState(false);
useEffect(() => {
console.log("effect");
return () => {
console.log("cleanup");
};
}, []);
return (
<>
<div>
<button type="button" onClick={() => setVisible(!visible)}>
{visible ? "์จ๊ธฐ๊ธฐ" : "๋ณด์ด๊ธฐ"}
</button>
{visible && <Info />}
</div>
</>
);
};
์ด ์์ ๋ button ํ๊ทธ๋ฅผ ์ด์ฉํด ๋ณด์ด๊ธฐ ๋ฒํผ์ ํด๋ฆญ์ Info ์ปดํฌ๋ํธ๊ฐ ๋ํ๋๊ณ ๋ณด์ด๊ธฐ ๋ฒํผ์ด
์จ๊ธฐ๊ธฐ ๋ฒํผ์ผ๋ก ๋ฐ๋๊ฒ ๋๋ค. visible์ ๊ธฐ๋ณธ๊ฐ์ด false๋ก ๋์ด์๊ธฐ ๋๋ฌธ์ false์ผ ๊ฒฝ์ฐ ๋ณด์ด๊ธฐ ๋ฒํผ์ด ๋จผ์ ๋์ค๊ฒ ๋๊ณ ์ด ๋ฒํผ์ ํด๋ฆญํ ์ false -> true ๊ฐ์ผ๋ก ๋ณํ๊ธฐ ๋๋ฌธ์ ์จ๊ธฐ๊ธฐ ๋ฒํผ์ด ๋ํ๋๊ฒ ๋๋ค. ๊ทธ๋์ ์ด ์์ ๋ ๋ ๋๋ง๋ ๋๋ง๋ค ๋ท์ ๋ฆฌ ํจ์๊ฐ ๊ณ์ ๋ํ๋๋๊ฒ์ ํ์ธํ ์ ์๊ณ ๋ท์ ๋ฆฌ ํจ์๊ฐ ํธ์ถ๋ ๋๋ ์
๋ฐ์ดํธ
๋๊ธฐ ์ง์ ์ ๊ฐ์ ๋ณด์ฌ์ค๋ค.
์ค์ง ์ธ๋ง์ดํธ๋ ๋๋ง ํจ์๋ฅผ ํธ์ถํ๊ณ ์ถ๋ค๋ฉด ๊ผญ ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ๋น ๋ฐฐ์ด์ ๋ฃ์ด์ฃผ๋ฉด ๋๋๊ฒ์ด๋ค.
๊ทธ๋ผ ์ด๋ ๊ฒ ๋ณด์ด๊ธฐ๋ฅผ ํด๋ฆญ์ Info ์ปดํฌ๋ํธ์ ์๋ ์ปจํ
์ธ ๊ฐ ๋ํ๋๊ณ ์ฝ์์๋ ๋ํ๋ ๋ effect์
์ฌ๋ผ์ง๋ cleanup ํ
์คํธ๊ฐ ์ฐํ๋๊ฒ์ ์ ์ ์๋ค.
๋ฆฌ์กํธ์์ ์๋ ์์ด ์ฐ์ด๋ useState์ useEffect๋ฅผ ์์ ์ ํจ๊ป ์ ๋ฆฌํด๋ณด์๋ค.
์ญ์ ๊ทผ๋ณธ์ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํํํ๊ฒ ์๋๊ฑฐ์ง! โ