티스토리 뷰

TIL/2022 TIL

[항해99 15일차] 2022.03.21 TIL

dogdogdodo 2022. 3. 21. 14:09

목차


    반응형

    <오늘 내가 할 일>

     

    주특기 기본 개인 과제 시작 !

    1. 메인 페이지, 평점 남기기 페이지 생성

    2. 라우팅

    3. 페이지간 이동

    -선택한 페이지로 이동시키기

    -남기기 버튼 클릭 시 이전 페이지로 이동

    4. 4주차&5주차 강의 듣기 

     

    음 일단 week-1이라는 프젝을 하나 만들어주었다.

    그리고 

     

    yarn add styled-components
    yarn add react-router-dom@5.2.1

    스타일 패키지, 라우터 패키지를 프젝에 설치해주었다.

     

    yarn start !!!

     

    막막하였다...........

    어디서부터..짜야될지..하나도 모르는 상황이 발생..🤫🤭

    예시 사이트를 봤는데.. 소스에서 답을 볼 수 있었다.

    답보면서 그냥 배끼는 수준의 코드를 짜고 있다.

    자괴감이 든다......

     

    index.js

    import React from 'react';
    import ReactDOM from 'react-dom';
    import './index.css';
    import App from './App';
    import reportWebVitals from './reportWebVitals';
    import { BrowserRouter } from "react-router-dom"; //이거 안쓰면 app페이지 열었을때 오류남
    
    ReactDOM.render(
      <BrowserRouter>//이거 안쓰면 app페이지 열었을때 오류남
        <App />
      </BrowserRouter>,//이거 안쓰면 app페이지 열었을때 오류남
      document.getElementById('root')
    );
    
    
    reportWebVitals();

    App.js

    import React from "react";
    import { Route } from "react-router-dom";
    //메인페이지 , 상세페이지 임포트
    import Main from "./Main";
    import Detail from "./Detail";
    
    function App() {
      console.log('앱파일');
      
      return (
        <div className="App">
         <Route path ="/" exact>
            <Main />
         </Route>
         <Route path ="/detail/:week" exact>
            <Detail />
         </Route>
        </div>
      );
    }
    
    export default App;

    Main.js 생성 !!!!

    import React from "react";
    import styled from "styled-components";
    //페이지 이동하기 위해 임포트
    import { useHistory } from "react-router-dom";
    
    const Main = (props) => {
        const history = useHistory(); //페이지 이동하기 위해서 필요한 객체 선언
        const day = { 0: "일", 1: "월", 2: "화", 3: "수", 4: "목", 5: "금", 6: "토" }; //요일 딕셔너리형태로 선언
        //console.log(Object.keys(day).map((_d, idx) => day[_d]))
    
        //Object.keys() 메소드는 주어진 객체의 속성 이름들을 일반적인 반복문과 동일한 순서로 순회되는 열거할 수 있는 배열로 반환합니다.
        const week = Object.keys(day).map((_d, idx) => {
            let today = new Date().getDay(); //오늘 날짜 구하는 함수
            let d = today + parseInt(_d) > 6 ? today + parseInt(_d) - 7 : today + parseInt(_d);
            return day[d];
        });
        //console.log(week) 오늘의 요일 구하는 함수
    
        const rate = week.map((w, idx) => {
            return {
                day: w,
                rate:
                    Math.floor(Math.random() * (Math.floor(5) - Math.ceil(1) + 1)) + Math.ceil(1),
            }
        })
        //console.log(rate) 평점 랜덤으로 뿌려주는 거
    
    
        return (
            <>
                <TxtBox>
                    <H3Style>내 일주일은?🤪 </H3Style>
                    {rate.map((w, idx) => {
                        return (
                            <WeekBox
                                key={`week_${idx}`}
                            >
                                <WeekFont>
                                    {w.day}
                                </WeekFont>
                                {Array.from({ length: 5 }, (item, idx) => {
                                    return (
                                        <div
                                            key={idx}
                                            style={{
                                                width: "25px",
                                                height: "25px",
                                                margin: "5px",
                                                backgroundColor: w.rate < idx ? "#ccc" : "#74E0B7",
                                            }}
                                        ></div>
                                    );
                                })}{/* Array */}
                                <Gogo
                                    onClick={() => {
                                    history.push(`/detail/${w.day}`);
                                }}>
                                    Go ▶️
                                </Gogo>
    
                            </WeekBox>
    
                        )
                    })}  {/* rate */}
    
                </TxtBox>
    
    
    
    
    
            </>
        );
    };
    
    const TxtBox = styled.div`
    max-width: 350px;
    min-height: 10vh;
    height:90vh;
    background-color: #fff;
    padding: 16px;
    margin: 20px auto;
    border-radius: 5px;
    border: 1px solid #ddd;
    `;
    const H3Style = styled.h3`
    text-align:center;
    `
    const WeekBox = styled.div`
     display: flex;
     justify-content: center;
     align-items: center;
     margin: 1rem 0;
     width: 100%;
     background-color:#eee;
    `
    const WeekFont = styled.h4`
    margin-right: 0.5rem;
    `
    const Gogo =styled.div`
    margin-left: 5px;
    cursor: pointer;
    `
    export default Main;

    Detail.js

    import React from "react";
    import styled from "styled-components";
    //페이지 이동하기 위해 임포트
    import { useHistory,useParams } from "react-router-dom";
    
    const Detail = (props) =>{
        const history = useHistory();
        const params = useParams();
        const [rate,setRate] =React.useState(0);
    
        React.useEffect(() => {
            const press = (e) =>{
                if([1,2,3,4,5].indexOf(parseInt(e.key)) !== -1){
                    setRate(parseInt(e.key));
                }
            }
            window.addEventListener("keydown", press);
            return ()=> window.removeEventListener("keydown", press);
        },[]);
    
    
    
        return (
            <>
            <DetailBox>
                <Dtitle>
                    <SpanDay>👻{params.week}요일👻</SpanDay>평점남기기
                </Dtitle>
                <RateDiv>
                    {Array.from({ length: 5 }, (item, idx) => {
                                        return (
                                            <div
                                                key={idx}
                                                onClick={()=>{
                                                    setRate(idx +1);
                                                }}
                                                style={{
                                                    width: "25px",
                                                    height: "25px",
                                                    margin: "5px",
                                                    backgroundColor: rate < idx + 1 ? "#ddd" : "#74E0B7"
                                                }}
                                            ></div>
                                        );
                                    })}{/* Array */}
                </RateDiv>
                <button  onClick={() => {
                history.goBack();
                }}>
                    평점 남기기🧚‍♀️
                </button>
            </DetailBox>
    
            </>
        )
    };
    
    const DetailBox =styled.div`
    max-width: 350px;
    min-height: 10vh;
    height:40vh;
    background-color: #fff;
    padding: 16px;
    margin: 20px auto;
    border-radius: 5px;
    border: 1px solid #ddd;
    display:flex;
    flex-direction:column;
    gap:30px;
    
    button{
        width:80%;
        margin: 10px auto;
        border:none;
        padding: 1rem;
        border-radius:8px;
        background-color:#74E0B7;
        font-weight:bold;
    }
    `
    const Dtitle =styled.h3`
    text-align:center;
    `
    const SpanDay =styled.span`
    background-color: #C4FEC6;
    color:#08A40E;
    `
    const RateDiv =styled.div`
    display:flex;
    justify-content:center;
    align-items:center;
    width:100%;
    `
    
    
    export default Detail;

    이렇게까지 만들고..

    깃허브에 커밋 푸쉬하려고 하니까 자꾸만 Git remote 에 인증 하지 못했습니다 이런..짱나는 에러메시지가 떴다.

    vsc에서 하는 건 정말~~~~~이지 ~~~~어려웠다.

     

    그래서 그냥 깃허브 데스크탑 깔고 커밋 푸쉬하니까 잘되었다. ! 해결 !!

    한시간 정도 삽질한 느낌이다.

     

    중요한 건 위 코드를 거의 ..배끼다싶이..작성한 것..

    이해가 간 것은 스타일 패키지 이용하기랑 파람스 !! 히스토리 !!!

    그래도 이해가 된 게 있어서 다행이다.

     

    짜잔 Go를 누르면 평점남기기 페이지로 넘어간다 ....!!!!

     

     

    <내일 내가 할 일>

     

    1. 5주차 강의 또 듣기

    2. 과제 배포하기

     

     

     

     

     

     

    728x90
    반응형

    'TIL > 2022 TIL' 카테고리의 다른 글

    [항해99 17일차] 2022.03.23 TIL  (0) 2022.03.23
    [항해99 16일차] 2022.03.22 TIL  (0) 2022.03.22
    [항해99 13일차] 2022.03.19 TIL  (0) 2022.03.19
    [항해99 12일차] 2022.03.18 TIL  (0) 2022.03.18
    [항해99 11일차] 2022.03.17 TIL  (0) 2022.03.17