도영스 공간

[항해99 15일차] 2022.03.21 TIL 본문

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
Comments