<div>
<div>
<h1>Hi</h1>
</div>
<div>
<h1>hello</h1>
</div>
</div>
<div classname = "good">coding</div>
function app {
const name = "hong";
return {
<div>
hello,{name}
</div>
};
}
function Hello() {
...
}
function HelloBye() {
return <Hello />;
}
<div>
{
(1 + 1 === 2) ? (<p>์ ๋ต</p>) : (<p>์ค๋ต</p>)
}
</div>
return (
<div className="App">
<h1>Hello JSX</h1>
{posts.map((post) =>
<div key={post.id}>
<h3>{post.title}</h3>
<p>{post.content}</p>
</div>
)}
</div>
);
function Blog() {
const blogs = posts.map((post) => (
<div key={post.id}> // key ์์ฑ์ ๋ฃ์ ์์
<h3>{post.title}</h3>
<p>{post.content}</p>
</div>
));
return <div className="post-wrapper">{blogs}</div>;
}
https://github.com/forhrever/fe-sprint-react-twittler-intro.git
Q : Font Awesome์ ํ์ฉํ์ฌ ํธ์ ๋ฉ์์ง ์์ด์ฝ์ด ์์ด์ผ ํฉ๋๋ค. (className : "far fa-comment-dots"
).
const Sidebar = () => {
return (
<section className="sidebar">
{/* TODO : ๋ฉ์ธ์ง ์์ด์ฝ์ ์์ฑํฉ๋๋ค. */}
<i className = "far fa-comment-dots"></i>
</section>
);
};
Q : dummyTweet
๋ก ์ ๋ฌ๋๋ ํธ์ ๊ฐ์์ ์นด์ดํธ๊ฐ ์ผ์นํด์ผ ํฉ๋๋ค. ex) total : 5
const Counter = () => {
return (
<div className="tweetForm__input">
<div className="tweetForm__inputWrapper">
<div className="tweetForm__count" role="status">
{/*TODO : dummyTweet๋ก ์ ๋ฌ๋๋ ๋ฐ์ดํฐ์ ๊ฐฏ์๋ฅผ ๋ณด์ฌ์ค๋๋ค. */}
{'total:' + dummyTweets.length}
</div>
</div>
</div>
);
};
Q : Footer ์ปดํฌ๋ํธ์ ํ์ ์๋ฆฌ๋จผํธ๋ก ์๋งจํฑ ์๋ฆฌ๋จผํธ footer๊ฐ ์์ด์ผ ํฉ๋๋ค.
<footer>
๊ฐ ํฌํจ๋์ด์ผ ํฉ๋๋ค.const Footer = () => {
return (
<footer>
<img id="logo" src={`${process.env.PUBLIC_URL}/codestates-logo.png`} />
Copyright @ 2022 Code States
</footer>
);
};
// TODO : Footer ํจ์ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํฉ๋๋ค. ์๋ฉํฑ ์๋ฆฌ๋จผํธ footer๊ฐ ํฌํจ๋์ด์ผ ํฉ๋๋ค.
Q : ํธ์ ์ ์์ ํ๋กํ ์ฌ์ง์ด ์์ด์ผ ํฉ๋๋ค.
li.tweet
์๋ฆฌ๋จผํธ์ ํ์ ์๋ฆฌ๋จผํธ๋ก <img>
์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ๊ณ dummyTweets
์ ์ด๋ฏธ์ง ์ฃผ์ ์ ๋ณด๋ฅผ ์ฐพ์์ <src>
์์ฑ์ ์ง์ ํฉ๋๋ค.const Tweets = () => {
return (
<ul className="tweets">
{dummyTweets.map((tweet) => {
return (
<li className="tweet" key={tweet.id}>
<div className="tweet__profile">
<img src = {tweet.picture}></img> // ๋ณ๊ฒฝ ์ img class ...
</div>
.
.
.
Q : ์ ์ ์ด๋ฆ์ด ์์ด์ผ ํฉ๋๋ค.
li.tweet
์๋ฆฌ๋จผํธ์ ํ์ ์๋ฆฌ๋จผํธ๋ก <span>
์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ๊ณ dummyTweets
์ ์ ์ ์ด๋ฆ์ <span>
์ ํ
์คํธ ์ฝํ
์ธ ๋ก ๋ฃ์ต๋๋ค.tweet__username
์ผ๋ก ์ง์ ํฉ๋๋ค. .
.
.
<div className="tweet__content">
<div className="tweet__userInfo">
{/* TODO : ์ ์ ธ ์ด๋ฆ์ด ์์ด์ผ ํฉ๋๋ค. */}
<span className=tweet__username>{tweet.username}</span>
.
.
.
Q : ํธ์ ์์ฑ ์ผ์(yyyy. m. d.) ๊ฐ ์์ด์ผ ํฉ๋๋ค.
li.tweet
์๋ฆฌ๋จผํธ์ ํ์ ์๋ฆฌ๋จผํธ๋ก <span>
์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ๊ณ dummyTweets
์ ํธ์ ์์ฑ ์ผ์๋ฅผ <span>
์ ํ
์คํธ ์ฝํ
์ธ ๋ก ๋ฃ์ต๋๋ค.tweet__createdAt
์ผ๋ก ์ง์ ํฉ๋๋ค.<div className="tweet__content">
.
.
.
{/* TODO : ํธ์ ์์ฑ ์ผ์๊ฐ ์์ด์ผ ํฉ๋๋ค. */}
<span className='tweet__createdAt'>{tweet.createdAt}</span>
</div>
.
.
.
Q : ํธ์ ๋ฉ์์ง๊ฐ ์์ด์ผ ํฉ๋๋ค.
li.tweet
์๋ฆฌ๋จผํธ์ ํ์ ์๋ฆฌ๋จผํธ๋ก <div>
์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ๊ณ dummyTweets
์ ํธ์ ๋ด์ฉ์ <div>
์ ํ
์คํธ ์ฝํ
์ธ ๋ก ๋ฃ์ต๋๋ค.tweet__message
์ผ๋ก ์ง์ ํฉ๋๋ค.<div className="tweet__content">
<div className="tweet__userInfo">
.
.
.
</div>
<div className='tweet__message'>{tweet.content}</div>
</div>
Q : Feature ์ปดํฌ๋ํธ์ ํ์ ์ปดํฌ๋ํธ๋ก Counter ์ปดํฌ๋ํธ๊ฐ ์์ด์ผ ํฉ๋๋ค.
Q : Features ์ปดํฌ๋ํธ์ ํ์ ์ปดํฌ๋ํธ๋ก Footer ์ปดํฌ๋ํธ๊ฐ ์์ด์ผ ํฉ๋๋ค.
const Features = () => {
return (
<section className="features">
<div className="tweetForm__container">
<div className="tweetForm__wrapper">
<div className="tweetForm__profile"></div>
<Counter /> // Feature์ ํ์ Counter ์ปดํฌ๋ํธ ์ง์
</div>
</div>
<Tweets />
<Footer /> // Feature์ ํ์ Footer ์ปดํฌ๋ํธ ์ง์
</section>
);
};
Q : App ์ปดํฌ๋ํธ์ ํ์ ์ปดํฌ๋ํธ๋ก Sidebar ์ปดํฌ๋ํธ๊ฐ ์์ด์ผ ํฉ๋๋ค.
const App = () => {
return (
<div className="App">
<main>
{/* TODO : Sidebar ์ปดํฌ๋ํธ๋ฅผ ์์ฑํฉ๋๋ค. */}
<Sidebar /> // App ํ์ Sidebar ์ปดํฌ๋ํธ ์ง์
<Features />
</main>
</div>
);
};
Q : ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ํ์ฉํด์ ์ฌ๋ฌ ํธ์ ์ค ์ ์ ์ด๋ฆ์ด parkhacker์ธ ๋ฐฐ๊ฒฝ์์ด var(--point-color-tint-2)
๊ฐ ๋๋๋ก ํด๋์ค(tweet__username--purple
)๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค. (tweet__username tweet__username--purple
)
'tweet__username--purple'
)const Tweets = () => {
return (
<ul className="tweets">
{dummyTweets.map((tweet) => {
const isParkHacker = tweet.username === 'parkhacker'; // ๋ณ์ isParkHacker = ๋ฐํด์ปค
const tweetUserNameClass = isParkHacker
? 'tweet__username tweet__username--purple'
: 'tweet__username';
// ์ผํญ์ฐ์ฐ์์ด์ฉํ์ฌ ๋ฐํด์ปค๋ผ๋ฉด ๋ณด๋ผ์์ผ๋ก ๋จ๊ฒํ๋ผ.
return (
<li className="tweet" key={tweet.id}>
<div className="tweet__profile">
<img src = {tweet.picture}></img>
</div>
<div className="tweet__content">
<div className="tweet__userInfo">
{/* TODO : ์ ์ ธ ์ด๋ฆ์ด ์์ด์ผ ํฉ๋๋ค. */}
<span className={tweetUserNameClass}>{tweet.username}</span>
// ์์ ์ ์ธํ๋ tweetUserNameClass
</div>