State
๐ ๋ฆฌ์กํธ์์ ๋ฐ์ดํฐ์ ํ๋ฆ
๋ฆฌ์กํธ๋ ๊ฐ์ ๋ค๋ฅธ ์ญํ ์ ํ๋ ๋ค์ํ ์ปดํฌ๋ํธ๋ค์ ์งํฉ์ด๋ค.
๋ฆฌ์กํธ์ ์ปดํฌ๋ํธ๋ ๋จ์ผ์ฑ ์ ์์น์ ๊ธฐ๋ณธ์ผ๋ก, ํ ์ปดํฌ๋ํธ๋ ํ ๊ฐ์ง ์ญํ ๋ง ํ๋ค.
ํ ์ปดํฌ๋ํธ์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๊ฐ ๋ถ๋ชจ ์์ ๊ด๊ณ์ฒ๋ผ ๋ค์ด์ฌ ์ ์๋ค.
์ด๋ ๊ฒ ์ญํ ๊ณผ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ปดํฌ๋ํธ๋ค์ ๋ฐฐ์นํ๋ค๋ณด๋ฉด ์ปดํฌ๋ํธ๋ 'ํธ๋ฆฌ๊ตฌ์กฐ'๊ฐ ๋๋ค.
๊ฒฐ๊ตญ ํ๋์ ์ปดํฌ๋ํธ ์์ ๋ชจ๋ ์ปดํฌ๋ํธ๋ค์ด ์์นํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
๋ฆฌ์กํธ ์์ ๋ฐ์ดํฐ๋ ์ด๋ฌํ ํธ๋ฆฌ๊ตฌ์กฐ์ ๋ฐ๋ผ ์์์ ์๋๋ก ํ๋ฅธ๋ค.
ํ ๋ถ๋ชจ ์์ ์์นํ ์์ ์ปดํฌ๋ํธ๋ ๋ถ๋ชจ๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ ๋ฐ์ ์ธ ์ ์๋ค.
๋ฐ์ดํฐ๊ฐ ๋ถ -> ์ ์ด๋ ๊ฒ ์๋๋ก ํ๋ฅด๋๊น.
๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ฆฌ์กํธ์ ์ค์ํ ํค์๋์ด๋ค.
์ปดํฌ๋ํธ๋ ๋ฐ๊นฅ์์ props๋ฅผ ์ด์ฉํด์ ์์ฑ์ ์ ๋ฌ ๋ฐ์ ์ฌ์ฉํ๋ ๊ฒ ์ญ์ ํํฅ์ ๋ฐ์ดํฐ ํ๋ฆ์ ํ ์์ด๋ค.
๐ state
๐ ๋ณํ๋ ๊ฐ์ state๋ก ๊ด๋ฆฌํ๋ค
๐ ์๋ ์ธ๊ฐ์ง ์กฐ๊ฑด์ ๊ธฐ์ค์ผ๋ก state ์ฌ๋ถ๋ฅผ ํ๋จํ ์ ์๋ค
- ๋ถ๋ชจ๋ก๋ถํฐ props๋ฅผ ํตํด ์ ๋ฌ๋ฉ๋๊น? ๊ทธ๋ฌ๋ฉด ํ์คํ state๊ฐ ์๋๋๋ค.
- ์๊ฐ์ด ์ง๋๋ ๋ณํ์ง ์๋์? ๊ทธ๋ฌ๋ฉด ํ์คํ state๊ฐ ์๋๋๋ค.
- ์ปดํฌ๋ํธ ์์ ๋ค๋ฅธ state๋ props๋ฅผ ๊ฐ์ง๊ณ ๊ณ์ฐ ๊ฐ๋ฅํ๊ฐ์? ๊ทธ๋ ๋ค๋ฉด state๊ฐ ์๋๋๋ค.
๐ state์ ์์น
state๊ฐ ํ์ํ, ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ์ ์์น์ํจ๋ค.
๋ค์์ ์ปดํฌ๋ํธ์์ ํ state์ ์ํฅ์ ๋ฐ๋๋ค๋ฉด ์ปดํฌ๋ํธ๋ค์ ๊ณตํต ์์ ์ปดํฌ๋ํธ์ ์์น์ํจ๋ค
๊ณตํต ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ๋๋ ๊ฒ์ด๋ค.
๐ state ๋์ด์ฌ๋ฆฌ๊ธฐ
๐ state๊ฐ ๋์ด์ฌ๋ ค์ง๋ ๊ฒฝ์ฐ
์์ ์ปดํฌ๋ํธ๊ฐ ํ์ ์ปดํฌ๋ํธ์ ์ํด ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์๋ฅผ ๋ค์ด, ํธ์์ ์์ฑํ๋ ํผ์ด ์๋ ์ปดํฌ๋ํธ๋ ์ ์ฒด ํธ์ ์ปดํฌ๋ํธ ์์ ์๋ค. ํผ์์ ์์ฑํ ์๋ก์ด ํธ์ ๋ด์ฉ์ ์ ์ฒด ํธ์์ ์ถ๊ฐ์ํค๋ ์์ ์ ์์ ์ปดํฌ๋ํธ์์ ๋ง๋ค์ด์ง ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ผ ํ ์ ์๋ค.
๋ฆฌ์กํธ๋ ๋จ๋ฐฉํฅ ํ๋ฆ์ ์งํฅํ๋ค๊ณ ํ๋ค. ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ์ญ๋ฐฉํฅ ํน์ ์๋ฐฉํฅ์ด๋ผ๊ณ ์๊ฐํ ์ ์์ง๋ง ์๋๋ค.
๋จ๋ฐฉํฅ์ ์์น์ ์ฌ์ ํ ์ง์ผ์ผ ํ๋ ๊ฒ์ด๋ค.
์ด๋ฐ ๊ฒฝ์ฐ์์ ์ฌ์ฉํ๋ ๊ฒ์ด state ๋์ด์ฌ๋ฆฌ๊ธฐ ์ด๋ค.
state๊ฐ ๋์ด์ฌ๋ ค์ง๋ ๋ฐฉ๋ฒ๊ณผ ์ฌ์ฉ์ ๋ํด ์์ฃผ ๊ฐ๋จํ๊ฒ ์ด์ผ๊ธฐ ํ์๋ฉด,
๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์๋ ํจ์๋ฅผ props๋ก ์์ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๋ค.
๊ทธ๋ผ ์์ ์ปดํฌ๋ํธ์์ ์ด ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
ํจ์๋ฅผ ํธ์ถํ๋ฉฐ ์ธ์๋ก ์์ ์ปดํฌ๋ํธ์ ๊ฐ์ ์ฌ์ฉํ๋ฉด ์์ ์ปดํฌ๋ํธ์์ ๋ง๋ค์ด์ง ๊ฐ์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ ์ ์๋ ๊ฒ์ด๋ค!
๐ ๋ถ๋ชจ์ ์๋ ํจ์๋ฅผ ์ฌ์ฉํด์ ์๊ธฐ๊ฐ ๊ฐ๊ณ ์๋ ๊ฐ, ํน์ ์ด๋ค ํ์๋ฅผ 'ํจ์์ ๋ฌปํ์ ๋๋ ค ๋ณด๋ด๋', ๊ทธ๋ฐ ๋๋์ด๋ค. ํํ.
๐ state ์ฌ์ฉ ๋ฐฉ๋ฒ
๐ useState๋ฅผ ์ํฌํธ ํด์ผํ๋ค.
๐ ์์ ์ปดํฌ๋ํธ์ ์๋ ํจ์๋ฅผ ์์ ์ปดํฌ๋ํธ์ ์ํฌํธ ๋ ํ์ ์ปดํฌ๋ํธ์ ์์ฑ์ผ๋ก ์ ๋ฌํ๋ค.
๐ ํ์ ์ปดํฌ๋ํธ์์ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
๐ ๊ทธ๋ฅ ํธ์ถํด๋ ๋๊ณ , ์ธ์๋ก ๋ฃ์ด์ ๋ณด๋ด๋ ๋๋ค.
๐ ์์
NewTweet ์ปดํฌ๋ํธ์ ๊ฐ์ฒด(๋ฐ์ดํฐ)๋ฅผ Twittler ์ปดํฌ๋ํธ๋ก ๋ณด๋
import React, { useState } from "react";
import "./styles.css";
const currentUser = "๊น์ฝ๋ฉ";
function Twittler() {
const [tweets, setTweets] = useState([
{
uuid: 1,
writer: "๊น์ฝ๋ฉ",
date: "2020-10-10",
content: "์๋
๋ฆฌ์กํธ"
},
{
uuid: 2,
writer: "๋ฐํด์ปค",
date: "2020-10-12",
content: "์ข์ ์ฝ๋์คํ
์ด์ธ !"
}
]);
const addNewTweet = (newTweet) => {
setTweets([...tweets, newTweet]);
}; // ์ด ์ํ ๋ณ๊ฒฝ ํจ์๊ฐ NewTweetForm์ ์ํด ์คํ๋์ด์ผ ํฉ๋๋ค.
return (
<div>
<div>์์ฑ์: {currentUser}</div>
<NewTweetForm onButtonClick={addNewTweet}/> //onButtonClick์ผ๋ก ์์ฑ ์ ๋ฌ
<ul id="tweets">
{tweets.map((t) => (
<SingleTweet key={t.uuid} writer={t.writer} date={t.date}>
{t.content}
</SingleTweet>
))}
</ul>
</div>
);
}
function NewTweetForm({ onButtonClick }) { // ํ์ ์ปดํฌ๋ํธ์ onButtonClick ๊ฐ์ ธ์ด
const [newTweetContent, setNewTweetContent] = useState("");
const onTextChange = (e) => {
setNewTweetContent(e.target.value);
};
const onClickSubmit = () => {
let newTweet = {
uuid: Math.floor(Math.random() * 10000),
writer: currentUser,
date: new Date().toISOString().substring(0, 10),
content: newTweetContent
};
// TDOO: ์ฌ๊ธฐ์ newTweet์ด addNewTweet์ ์ ๋ฌ๋์ด์ผ ํฉ๋๋ค.
onButtonClick(newTweet); // onButtonClick(=addNewTweet)ํธ์ถ
};
return (
<div id="writing-area">
<textarea id="new-tweet-content" onChange={onTextChange}></textarea>
<button id="submit-new-tweet" onClick={onClickSubmit}>
์ ๊ธ ์ฐ๊ธฐ
</button>
</div>
);
}
function SingleTweet({ writer, date, children }) {
return (
<li className="tweet">
<div className="writer">{writer}</div>
<div className="date">{date}</div>
<div>{children}</div>
</li>
);
}
export default Twittler;
๐ reference
์ฝ๋์คํ ์ด์ธ