์์ฑ์ : ๊น์ฐ์
React์ ์ํ๊ด๋ฆฌ ๊ธฐ๋ฒ์ ๋ํด ์ ๋ฆฌํ์์ต๋๋ค.
useState๋ฅผ ์ฌ์ฉํ ๋ ์ฝ๋์ ์๋จ์์ import ๊ตฌ๋ฌธ์ ํตํด ๋ถ๋ฌ์ค๊ณ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
const [value, setValue] = useState(0);
์ด๋ฌํ ๋ฌธ๋ฒ์ ๋ฐฐ์ด ๋น๊ตฌ์กฐํ ํ ๋น ๋ฌธ๋ฒ์ด๋ผ๊ณ ํ๋๋ฐ, ์๋ ์ฝ๋๋ ๋ฐฐ์ด ๋น๊ตฌ์กฐํ ํ ๋น์ ์ดํดํ๊ธฐ ์ํด ์ค๋นํ ์์ ์ ๋๋ค.
// array๋ผ๋ ์ด๋ฆ์ ๋ฐฐ์ด์ ์์ฑํ๊ณ ์์๊ฐ์ผ๋ก๋ ๊ฐ๊ฐ 'dog', 'cat', 'sheep'์ ํ ๋นํฉ๋๋ค.
const array = ['dog', 'cat', 'sheep'];
// ์๋ ์ฝ๋๋ ๊ฐ๊ฐ array์ 0๋ฒ์งธ, 1๋ฒ์งธ ์์๋ฅผ [first, second]์ ํ ๋นํฉ๋๋ค.
const [first, second] = array;
// ๊ฒฐ๋ก ์ ์ผ๋ก first ๋ณ์์๋ 'dog', second ๋ณ์์๋ 'cat'์ด๋ผ๋ ๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
console.log(first, second); // dog cat
๋ค์ ์ฝ๋๋ useState์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๊ฐ ์ ์ฉ๋ Component Counter.js
์
๋๋ค.
/*
useState ๊ธฐ๋ณธ ๊ตฌ์กฐ
*/
import React, { useState } from 'react';
// Counter ํจ์ (ํ๋จ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ์คํ๋จ)
const Counter = () => {
// ๋น๊ตฌ์กฐํ ํ ๋น ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ ์ํ๊ด๋ฆฌ
// useState(x) <- x์๋ ์ด๊ธฐ๊ฐ์ด ๋ค์ด๊ฐ๋ฉฐ ์ด๋ value์ ๋ฐ์๋จ, setValue๋ value์ ์ํ๋ฅผ updateํ๊ธฐ ์ํ ํจ์(?)
const [value, setValue] = useState(0);
// ์ดํด๋ฅผ ์ํด `console.log` ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๋ ฅํด๋ณด๋ฉด value๋ ์ค์ ๊ฐ, setValue๋ ํจ์๋ก ์ถ๋ ฅ๋๋ค.
console.log(value, setValue);
return (
<div>
<p>
ํ์ฌ ์นด์ดํฐ ๊ฐ์ <b>{value}</b> ์
๋๋ค.
</p>
<button onClick={() => setValue(value + 1)}>+1</button>
<button onClick={() => setValue(value - 1)}>-1</button>
</div>
);
};
export default Counter;
์ Component๋ฅผ App.js
์์ ํธ์ถํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์คํ๋ฉ๋๋ค.
+1 ๋ฒํผ์ ํด๋ฆญํ๊ฒ๋๋ฉด setValue
ํจ์๋ฅผ ํธ์ถํ๊ณ ํ์ฌ value
์ 1์ ๋ํ์ฌ ์ํ๋ฅผ ์
๋ฐ์ดํธ,
-1๋ฒํผ์ ํด๋ฆญํ๊ฒ๋๋ฉด ๋ง์ฐฌ๊ฐ์ง๋ก setValue
ํจ์๋ฅผ ํธ์ถํ์ฌ ํ์ฌ value
์ 1์ ๋นผ๊ณ ์ํ๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.
useState๋ ์ฌ๋ฌ๊ฐ๋ฅผ ๋์์ ์ฌ์ฉํ๋๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ค์์ Info.js
Component์
๋๋ค.
/*
useState ์ค์ (์ฌ๋ฌ๊ฐ ์ฌ์ฉ)
*/
import React, { useState } from 'react';
const Info = () => {
// ์ด๋ฆ์ ์ ์ฅํ name state
const [name, setName] = useState('');
// ๋๋ค์์ ์ ์ฅํ nickname state
const [nickname, setNickname] = useState('');
// ์ด๋ฆ์ด ๋ณ๊ฒฝ๋๋ฉด ์คํ๋ onChangeName ํจ์
const onChangeName = e => {
setName(e.target.value);
};
// ๋๋ค์์ด ๋ณ๊ฒฝ๋๋ฉด ์คํ๋ onChangeNickname ํจ์
const onChangeNickname = e => {
setNickname(e.target.value);
};
return (
<div>
<div>
{/* input์ value๋ name state๋ก ์ง์ , ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ onChangeName ํจ์ ํธ์ถ */}
<input value={name} onChange={onChangeName} />
{/* input์ value๋ nickname state๋ก ์ง์ , ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ onChangeNickname ํจ์ ํธ์ถ */}
<input value={nickname} onChange={onChangeNickname} />
</div>
<div>
<div>
<b>์ด๋ฆ:</b> {name}
</div>
<div>
<b>๋๋ค์: </b>
{nickname}
</div>
</div>
</div>
);
};
export default Info;
๋ง์ฐฌ๊ฐ์ง๋ก App.js
์์ ํธ์ถํฉ๋๋ค.
useEffect๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋๋ง๋ค ํน์ ์์ ์ ์ํํ๋๋ก ์ค์ ํ ์ ์๋ Hook ์ ๋๋ค.
ํด๋์คํ ์ปดํฌ๋ํธ์ componentDidMount์ componentDidUpdate๋ฅผ ํฉ์น ํํ๋ก ๋ณด์๋ ๋ฌด๋ฐฉํฉ๋๋ค.
์์์ ๋ง๋ค์๋ Info component์ useEffect๋ฅผ ์ ์ฉํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
info.js
๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ ํฉ๋๋ค.
import React, { useState, useEffect } from 'react';
const Info = () => {
const [name, setName] = useState('');
const [nickname, setNickname] = useState('');
useEffect(() => {
console.log('๋ ๋๋ง์ด ์๋ฃ๋์์ต๋๋ค!');
console.log({
name,
nickname
});
});
const onChangeName = e => {
setName(e.target.value);
};
const onChangeNickname = e => {
setNickname(e.target.value);
};
return (
(...)
);
};
export default Info;
๋ง์ฐฌ๊ฐ์ง๋ก App.js
์์ ์์ ํ Info-useEffect ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ฉ๋๋ค.