์ ๊ทผ๋ react๋ฅผ ๊ณ์ ์ด์ฌํ ์ตํ๋์ค์ด๋ค๐
์ ์๋ ์๊ฐ์ด ์๊น์ด๊ฒ ์ด๋ฐ ๊ธฐ๋ถ์ผ๊น๐ ํํ...
์๋ฌดํผ ๊ฐ์คํ๊ณ , react์์ ๊ฐ์ฅ ํท๊ฐ๋ฆฌ๋ ์ ์ ์๋ฌด๋๋ props๋ useState๊ฐ ์๋๊น ์ถ๋ค.
๋ ์์์ ๊ฐ๋
์ ์ธ ์ฐจ์ด์ ์,
react์์๋ props,useState์ฌ์ฉ์ด ๋น๋ฒํ๋งํผ, ์ค์ํ ๊ฐ๋ ์ด ์๋์์๋ค.
๋ฐ์ ์ฝ๋๋ค์ ํธ์ํฐ์ ๋ด์ฉ์ ๊ฐ๋จํ๊ฒ ๊ตฌํํด๋ณธ๊ฑด๋ฐ, ์์ฑ์๊ฐ ์ ์ form์ ํธ์์ ํฌํจ์์ผ์ ๋ด๋ณด๋ด๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.
์ด๋ฒ ๊ณผ์ ์ ์ฝ๋๋ฅผ ์๋ก ๋ค์ด ๋ด๊ฐ ์๊ฒ๋ ์ ์ ์ญ ์ ์ผ๋ฉฐ ์๊ธฐ์์ผ๋ด์ผ๊ฒ ๋ค.
โ์ฝ๋ ์์ ์๋ //์ซ์๋ ๋ฌด์ํด์ฃผ์ธ์! ์ค๋ช
์ ๋ง๋ถ์ด๋ ค๊ณ ์ฝ๋์ ์ง์ ์ฝ์
ํ ์ซ์์
๋๋ค.
//App.js
import React from 'react';
import {BrowserRouter, Routes, Route} from 'react-router-dom';//1
import Sidebar from './Sidebar';
import Tweets from './Pages/Tweets';
import About from './Pages/About';
//2
import './App.css';
import './global-style.css';
const App = (props) => {
return (
<BrowserRouter>
<div className="App">
<main>
<Sidebar />
<section className="features">
<Routes>
<Route path='/' element={<Tweets />} />
<Route path='/about' element={<About />}/>
<Route path='/mypage' element={<MyPage />} />
</Routes>
</section>
</main>
</div>
</BrowserRouter>
);
};
export default App;
//Tweet.js
import React from 'react';
import './Tweet.css';
const Tweet = ({ tweet }) => { //1
const parsedDate = new Date(tweet.createdAt).toLocaleDateString('ko-kr');
return (
<li className="tweet" id={tweet.id}>
<div className="tweet__profile">
<img src={tweet.picture} />
</div>
<div className="tweet__content">
<div className="tweet__userInfo">
<div className="tweet__userInfo--wrapper">
<span className='tweet__username'>{tweet.username}</span>
<span className='tweet__createdAt'>{parsedDate}</span>
</div>
</div>
<div className="tweet__message">
{tweet.content}
</div>
</div>
</li>
);
};
export default Tweet;
ํ์
์ ๋ํ๋ด๊ณ ์๋ค. Tweet์ defaultํ๊ณ ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ prop์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๊ตฌ์กฐ๋ค.<Tweet tweet={something} />
์ ๊ฐ์ด ์ฌ์ฉ๊ฐ๋ฅํ๋ค.//Tweet.js
import React, { useState } from 'react';
import Footer from '../Footer';
import Tweet from '../Components/Tweet';
import './Tweets.css';
import dummyTweets from '../static/dummyData';
const Tweets = () => {
const [tweets, setTweets] = useState(dummyTweets) //1
const [username, setUsername] = useState("");
const [msg, setMsg] = useState("");
const getRandomNumber = (min, max) => {
return parseInt(Math.random() * (Number(max) - Number(min) + 2));
};
const handleButtonClick = (event) => {
const tweet = {//2
id: tweets.length + 1,
username: username,
picture: `https://randomuser.me/api/portraits/women/${getRandomNumber(
1,
98
)}.jpg`,
content: msg,
createdAt: new Date().toLocaleDateString('ko-kr'),
updatedAt: new Date().toLocaleDateString('ko-kr'),
};
console.log([tweets])
console.log([tweet,...tweets]) //๊ทธ๋ฅ tweet๋ก ์ฐ๋ฉด ๋ฐฐ์ด, ๊ฐ์ฒด, ๋ฌธ์์ด์ ์์๋ฅผ ๋ชจ๋ ๊บผ๋ด์ค๊ฒ ์๋ ๊ทธ๋ฅ Array๋ก ๋์จ๋ค.
setTweets([tweet,...tweets]) //์ด๊ฑฐ ๋ฐฐ์ด๋ก ๋์ค๋๊ฑฐ ๋ง์ []์์ ๊ฐ์ฒด 6๊ฐ์๋๊ฑธ๋ก ๋์ด//3
//dummydata + ์ ์ก๋ ํธ์ = tweets
};
const handleChangeUser = (event) => {
setUsername(event.target.value)
};
const handleChangeMsg = (event) => {
setMsg(event.target.value)
};
return (
<React.Fragment>
<div className="tweetForm__container">
<div className="tweetForm__wrapper">
<div className="tweetForm__profile">
<img src="https://randomuser.me/api/portraits/men/98.jpg" />
</div>
<div className="tweetForm__inputContainer">
<div className="tweetForm__inputWrapper">
<div className="tweetForm__input">
<input
type="text"
placeholder="your username here.."
className="tweetForm__input--username"
onChange={handleChangeUser}
value={username}
></input>
<textarea
placeholder="write here.."
className="tweetForm__input--message"
onChange={handleChangeMsg}
value={msg}
>
</textarea>
</div>
<div className="tweetForm__count" role="status">
<span className="tweetForm__count__text">
{'total:'+ tweets.length}
</span>
</div>
</div>
<div className="tweetForm__submit">
<div className="tweetForm__submitIcon"></div>
<button className='tweetForm__submitButton' onClick={handleButtonClick}>submit</button>
</div>
</div>
</div>
</div>
<div className="tweet__selectUser"></div>
<ul className="tweets">
{tweets.map((value) => <Tweet key={value.id} tweet={value} />)}//4
</ul>
<Footer />
</React.Fragment>
);
};
export default Tweets;
//1 : usestate๋ก ์ค์ ํด์ค ๋ชจ์ต์ด๋ค. tweets์ dummy~๋ก ์ค์ ํ๊ณ ,
useState ์ด๊น๊ฐ์ dummy~๋ก ์ค์ ํด์คฌ๋ค.
๊ทธ ๋ฐ์ผ๋ก๋ ๊ฐ๊ฐ input๊ณผ textare๋ฅผ changeํ๋ ์ด๋ฒคํธ๋ฅผ ์ ์ฅํ๋ useState๋ฅผ ๋ง๋ค์๋ค.
//2 : submit ๋ฒํผ์ ๋๋ฅด๊ฒ ๋๋ฉด, ์ผ์ด๋๋ event๋ฅผ ์ ๋ฆฌํด๋์ ๊ณณ์ด๋ค. const tweet์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ง์ ์ค์ ํด์, ํผ์ ์์ฑํ๋ ์์ฑ์์ id ๋ฑ๋ฑ์ useState๋ณ์๋ก ์ค์ ํ๋ค. ํผ์ ๋ณด์ฌ์ฃผ๋ ๊ณณ์ ๋ฐ์์ ๋ฐ๋ก ์์ฑํ๋ค.
//3 : ์์ useState๋ณ์๋ค์ ์ ๊ธฐ์ตํด์ผํ๋ค. tweets๋ dummydata(๋๋ฏธ๋ฐ์ดํฐ)๋ผ์ ๋ฐ์ดํฐ๋ค์ ๋ฐ์์ค๋ ๊ณณ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ง์ ์ค์ ํ ๋ณ์ tweet์ ํฉ์ณ์ ํธ์์ ๋ณด์ฌ์ค์ผ ํ๊ธฐ ๋๋ฌธ์ tweets์ ๋์ ํฉ์น๋ ํจ์ setTweets๋ฅผ ์์ฑํด์ค์ผ ํ๋ค. tweets๋ฅผ ๊ทธ๋๋ก ์ฐ๋ฉด ๋ฐฐ์ด์ด ์ง์ ๋ฆฌํด๋๊ธฐ ๋๋ฌธ์, ์ฌ๊ธฐ์๋ spread์ฐ์ฐ์๋ฅผ ์จ์ค์ผํ๋ค. ๋ฐ๋ผ์ ์์ฑ์๊ฐ ์ด ํผ + ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ [์์ฑ์๊ฐ์ด form + ...dummydata]ํ์์ ํจ์๋ก ๋ฐ์์ค ํ tweets์ ๋ฆฌ๋ ๋๋งํ๊ฒ ๋๋ค.
//4 : Tweet์ prop์ ๋ฐ์์์ map์ผ๋ก ์๋ก์ด ํจ์๋ก ๋ง๋ ๋ค. ์ฌ๊ธฐ์ prop์ผ๋ก tweet์ด ์ฌ์ฉ๋๊ณ , map์ ์ธ์๊ฐ tweet์์ ๋ฐ์ดํฐ๋ก ๋ค์ด๊ฐ์ ๊ทธ๋ ค๋ธ๋ค.
๋ด๊ฐ props.texContent๋ผ๊ณ ๊ณ ๋ฅธ์ด์ ๋, ๋ง์ฐํ๊ฒ Tweet ์์ ๋ด์ฉ์ด ๋ค์ด๊ฐ๋๊น!
๋ผ๊ณ ๋์ถฉ ์๊ฐํด๋ฒ๋ ธ๋ ๊ฒ ๊ฐ๋ค. ๊ทผ๋ฐ ์ง๊ธ ๋ค์ ๋ณด๋๊น, ์ด๋ ๊ฒ ์๊ฐํ ๊ฑฐ๋ฉด ์ฐจ๋ผ๋ฆฌ
Tweet.textcontent๋ฅผ ๊ณ ๋ฅด๋๊ฒ ๋ง์ง ์์๋....์ถ๋ค;;
์๋ฌดํผ props.children์ด๋ผ๋ ๊ฐ๋
์ ๋ํด์ ์ ๋ฆฌํด๋ณด์๋ฉด,
const Poet = (props) => {
return <ul>{props.children}</ul>
}
์๋ฅผ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์์ฑํ ์๋ ์๋๋ฐ,
const Poet = ({children}) => {
return <ul>{children}</ul>
}
์ด๋ ๊ฒ prop์ ๋นผ๊ณ children์ prop๊ทธ ์์ฒด๋ก ์ธ ์๋ ์๋ค.
props.children์ ์ฃผ๋ก ์์ or html ์ component๊ฐ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด์๋์ง ๋ชจ๋ฅผ ๋,
ํ๋ฉด์ ํ์ํด์ผ ํ๋ ๊ฒฝ์ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ค.
๋๋ฒ์งธ ์ค๋ต์ ๋ณต์์ ๋ต์ธ์ค ๋ชจ๋ฅด๊ณ ํ๋๋ง ์ฒดํฌํด๋ฒ๋ ธ๋ค!
์ด ์ ๊ธ์์๋ ๋งํ๋ฏ์ด, onClick ์์๋ ํจ์๋ก ๋ค์ด๊ฐ๊ฑฐ๋, ์ธ๋ถ์์ ํจ์ ์ ์ธ ํ ๋ฃ์ด์ค์ผ ํ๊ธฐ๋๋ฌธ์, D๋ฒ๋ ๋ง๋ ์ ๋ต์ง๋ค.
props๋ ๊ฐ์ฒด๋ก ๋ค์ด์ค๊ฒ ๋๋ค๋ ์ฌ์ค์ ์์ง๋ง์!
A์ B๋ ๊ฐ๊ฐ ํจ์ ์ ์ธ์๊ณผ ํํ์์ผ๋ก ๋ง๋ ๊ฒ์ด๊ณ ,
C๋ name์ด๋ผ๋ ๋ณ์๋ฅผ ์ค์ ํ name์ "walli"๊ฐ์ ์ค์ ํด์คฌ๋ค.
D๋ props๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ณ์๋ก ์ค์ ํด ์ค ํ key์ value๊ฐ์ ์ ํด์คฌ๋ค.
๊ทธ ํ์ spread syntax๋ก {name:"wailli"}๋ฅผ ์ ๋ฌํด์ฃผ๋ ๋ชจ์ต์ด๋ค.
์.....์ฌ๊ธฐ์ ๋ญ๊ฐ ์ค์ํ ๊ฑธ ๊นจ๋ฌ์๊ฒ๊ฐ๋ค.
props์ ๊ดํ ์ด์ง๋ฌ์ด ์๊ฐ์ด ์ข ์ ๋ฆฌ๋ ๋๋.
๊ธ ๋งจ ์์์ ๊ณต๋ถํ props.child์ฒ๋ผ ์ ๋ฌธ์ ์ ๊ตฌ๋ฌธ๋ ์ ๋ฆฌํด๋ณด๋ฉด,
const Hello = ({name}) => <div>{name}</div>
์ด๋ ๊ฒ ๋์ค๊ฒ ๋๋ค.
D๋ฅผ ํ์ด๋ณด๋ฉด, {...props}์ {name: "walli"}๋ก ๋์ค๊ฒ ๋์, name์ด๋ผ๋ prop์ ์ ์ฅํ๊ฒ ๋๋ค. ์์ ์์ ์ ์ผ๋งฅ์ํตํ๋ค!
์๋ฌด๋๋ ๊ฐ์ฒด๊ตฌ์กฐ๋ถํดํ ๋น
์ ๋ค์ ๋์ง์ด๋ณด๋ ์๊ฐ์ด ํ์ํ ๊ฒ ๊ฐ๋ค.
//๋ฐฐ์ด
let x = [1, 2, 3, 4, 5];
let [y, z] = x;
console.log(y); // 1
console.log(z); // 2
//๊ฐ์ฒด
//์์ 1
let o = {p: 42, q: true};
let {p, q} = o;
console.log(p); // 42
console.log(q); // true
//์์ 2
{a : 1}
const { a } = { a : 1 };
a = 1;
๊ทธ ์ ์ ๊ณผ์ ์์๋ ๋น์ทํ ๊ฒฝ์ฐ๋ฅผ ์ฐพ์ ์ ์๋ค.
const Tweet = ({ tweet }) => { //์๋ต }
์์ component๋ tweet์ด๋ผ๋ prop์ ๋ฐ์์ ํจ์๋ฅผ ๋ค๋ฅธ component์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.