카테고리 없음

React Twittler Intro

novem 2023. 1. 20. 20:55
//export(내보내기)키를 통해서 dummyData 안에 있는 dummyTweet라는 배열의 값을 다른 파일에 import키를 통해서 쓸 수 있음
import { dummyTweets } from './static/dummyData'; //{해당변수명} + 해당경로

console.log(dummyTweets); //개발 단계에서 사용하는 더미 데이터입니다.

const Sidebar = () => {
  return (
    <section className="sidebar">
      Sidebar
      <i class="fa-regular fa-comment-dots"></i>
      //<span class="fa-regular fa-comment-dots"></span>가능
      //<div class="fa-regular fa-comment-dots"></div>가능
      //class명만 동일하면 대부분의 태그가 가능함
    </section>
  );
};

const Counter = () => {
  return (
    <div className="tweetForm__input">
      <div className="tweetForm__inputWrapper">
        <div className="tweetForm__count" role="status">
        //JS문법 사용하기위해 {}에 + 탬포럴 스트링 사용
        {`total : ${dummyTweets.length}}
        </div>
      </div>
    </div>
  );
};

const Footer = () => {
  return (
    //<div>를 <footer>로 바꿈 -> 시맨틱 엘리먼트 사용 시 <div>를 사용했을 때보다 footer영역을 더 명확하게 알 수 있음
    <footer>
      <img id="logo" src={`${process.env.PUBLIC_URL}/codestates-logo.png`} />
      Copyright @ 2022 Code States
    </footer>
  );
};

const Tweets = () => {
  return (
    <ul className="tweets">
    //dummyData를 고차함수 map을 통해서 원하는 형식의 레이아웃으로 표현
      {dummyTweets.map((tweet) => {
      //조건부 렌더링 할 때에는 삼항연산자를 사용
      //user이름이 parkhacker인 사람을 만나면 class를 하나 더 추가
      //삼항연사자 사용할 위치: className -> 조건부가 나뉘는 기준이니까
      //가독성을 위해 변수화함
        const isParkHacker = tweet.username === 'parkhacker' //tweet에서 username꺼내와서
         //parkhacker true일때는 tweet 두개를 설정
          ? 'tweet__username tweet__username--purple'
          : 'tweet__username'; //parkhacker가 아닐 경우 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={isParkHacker}>{tweet.username}</span>
                {/* TODO : 이름이 "parkhacker"인 경우, 이름 배경색을 rgb(235, 229, 249)으로 바꿔야 합니다. */}
                {/* TODO : 트윗 생성 일자가 있어야 합니다. */}
                <span className='tweet__createdAt'>{tweet.createdAt}</span>
              </div>
              <div className='tweet__message'>{tweet.content}</div>
            </div>
          </li>
        );
      })}
    </ul>
  );
};

const Features = () => {
  return (
    <section className="features">
      <div className="tweetForm__container">
        <div className="tweetForm__wrapper">
          <div className="tweetForm__profile"></div>
          <h1>Counter</h1> <br />
          total :{dummyTweets.length}
          <Counter />
        </div>
      </div>
      <Tweets />
      <Footer /> //Footer을 Features의 후속 컴퍼넌트로 선언
    </section>
  );
};

const App = () => {
  return (
    <div className="App">
      <main>
        <Sidebar /> //Sidebar컴퍼넌트를 App컴퍼넌트의 하위 컴퍼넌트로 선언
        <Features />
      </main>
    </div>
  );
};