-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[3주차 기본/심화/생각 과제] Would You Like Something to Drink? #3
base: main
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OB의 코드는 넘넘 귀하다,,!!!! props 넘기는 게 너무 어색하기도 하고 React는 초면이라 다른 사람 코드를 보면서 많이 배워가는 것 같아욤❤❤❤ 시연 언니랑 금잔디해서 넘 행복해~~~~~~~~!~!!~~!!
그래도 PR 제목은 바꿔주세요,,,><
week3/World-Cup/README.md
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
,,,나 이거 지웠는데 이 파일은 남겨두는 게 좋나,,,,,?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
지워두 될듯,, 나두 지워야징😅
week3/World-Cup/src/App.css
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
😮비,,,비었어요 선생님,,,!!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🫥
@@ -0,0 +1,113 @@ | |||
import americano from "./images/americano.jpg"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
직접 경로를 붙여넣지 않고 상수명 붙여서 불러오는 이유가 있으까??? (단순 궁금증입니다.)
disabled_button: "#b1ad9a", | ||
}; | ||
|
||
const fonts = { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
언니 거 이 부분 보고 나도 폰트 적용해봤어 ㅎㅎㅎㅎㅎㅎㅎㅎ
background-color: ${({ theme }) => theme.colors.orange}; | ||
color: ${({ theme }) => theme.colors.navy}; | ||
|
||
user-select: none; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
와 저 이 속성 처음 봤어요 ㅎㅎ 새로운 거 알아갑니다~~~~~~~~~
${({ theme }) => theme.fonts.body_bold}; | ||
`; | ||
|
||
const StartBtn = styled.button` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
TournamentResult.jsx
에 있는 BackBtn
과 위에 있는 Button
까지 요렇게 3개의 스타일드 컴포넌트까지 기본적인 구성이 똑같은데 상속 활용해서 스타일드 컴포넌트를 만들면 더 깔끔한 코드가 되지 않을까용??
const filterList = () => { | ||
const firstFilteredList = DRINK_LIST.filter( | ||
(item) => item.category[0] === firstChoice | ||
); | ||
|
||
const secondFilteredList = firstFilteredList.filter( | ||
(item) => item.category[1] === secondChoice | ||
); | ||
|
||
const thirdFilteredList = secondFilteredList.filter( | ||
(item) => item.category[2] === thirdChoice | ||
); | ||
|
||
const finalResult = thirdFilteredList[0]; | ||
|
||
return finalResult; | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
const filterList = () => { | |
const firstFilteredList = DRINK_LIST.filter( | |
(item) => item.category[0] === firstChoice | |
); | |
const secondFilteredList = firstFilteredList.filter( | |
(item) => item.category[1] === secondChoice | |
); | |
const thirdFilteredList = secondFilteredList.filter( | |
(item) => item.category[2] === thirdChoice | |
); | |
const finalResult = thirdFilteredList[0]; | |
return finalResult; | |
}; | |
const filterList = () => { | |
let filteredList = DRINK_LIST; | |
const choices = [firstChoice, secondChoice, thirdChoice]; | |
choices.forEach((choice, i) => { | |
filteredList = filteredList.filter((item) => item.category[i] === choice); | |
}); | |
return filteredList; | |
}; |
지금 상수 list에 있는 값 중에서 결과값과 일치하는 조건을 가진 값들을 빼오는 과정인 것 같은데
똑같은 비교 과정을 반복해서 써주는 것보다 forEach
를 사용해서 이렇게 작성해주면 더 간결해 보이지 않을까요?ㅎㅎ,,
</Choice> | ||
</ChoiceBox> | ||
<ButtonBox> | ||
<Button |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 ButtonBox
컴포넌트 내부의 자식들을 포함한 내용이 First, Second, Third Stage 모두 똑같이 작동 및 구성되는 것 같은데 아예 이걸 컴포넌트로 빼는 게 어떨까요?? 매 컴포넌트에서 재사용되는 부분이니까 충분히 컴포넌트로 빼도? 가능할 것 같다는 생각-!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
22!!!!! 가형이 의견에 동의합니당!!! 나두 재사용하도록 고칠 거 옴총 많은데 😮💨
return ( | ||
<FirstStageContainer> | ||
<StageTitle>Choose your preference</StageTitle> | ||
<ChoiceBox> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 ChoiceBox 내부도,,,!! ChoiceBox
컴포넌트 내부에서 mapping 돌려주면 더 이쁠 거 같긴 하다🤭
뜽희가 재훈 오빠 코드에 달아준 리뷰를 참고했습니다 ㅎㅎㅎㅎ
const [firstChoice, setFirstChoice] = useState(""); | ||
const [secondChoice, setSecondChoice] = useState(""); | ||
const [thirdChoice, setThirdChoice] = useState(""); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 3가지 state들을 꼭 별도로 관리해줘야 할까요??? 아무래도 셋 다 선택된 선택지 값을 저장하는 거다 보니까,,굳이 다른 state로 쪼개서 별도로 관래해줄 필요가 없을 것 같아서요! 특히, FirstStage.jsx
보면 previous
누를 때 3 state가 별도로 설정되는데 조금 더 심플하게 갈 수 있을 것 같아요!!
일단 제가 생각한 방법은 이 state들을 하나의 배열로 만들어서 하나의 state로 관리하는 방법을 생각해봤습니다!! 더 좋은 방법 있다면 저한테도 알려주세요❤
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
나두 가형이랑 동일한 생각!! 한 번에 관리해주는 게 좋을 것 같다는 생각이 들어!! 실제로 나도 그렇게 구현했구 :)
더 좋은 방법이 있으려나...?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
확실히 React 오니까 사람마다 컴포넌트 분리하는 기준도 다르고 설계 방법도 달라서 코리하는 재미도 있고 많이 배우는 것 같아!!! 심화과제까지 하느라 넘넘 고생했어 체고다!!!!! 👍🏻👍🏻👍🏻
</Choice> | ||
</ChoiceBox> | ||
<ButtonBox> | ||
<Button |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
22!!!!! 가형이 의견에 동의합니당!!! 나두 재사용하도록 고칠 거 옴총 많은데 😮💨
|
||
export default FirstStage; | ||
|
||
const FirstStageContainer = styled.section` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
시맨틱하게 div 말고 section 디테일 좋다 👍🏻👍🏻👍🏻
background-color: ${({ theme }) => theme.colors.blue}; | ||
color: ${({ theme }) => theme.colors.white}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
theme 적용한곤가?? GlobalStyle밖에 사용 안 해봤는데 나도 적용해봐야겠다!!!
} | ||
|
||
&:disabled { | ||
background-color: ${({ theme }) => theme.colors.disabled_button}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
theme 진짜 좋은 것 같아... 가독성도 좋고 엄청 편리해보여!!!!!
&:disabled { | ||
background-color: ${({ theme }) => theme.colors.disabled_button}; | ||
color: ${({ theme }) => theme.colors.navy}; | ||
cursor: not-allowed; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
처음 보는 속성값이다!!! 찾아보니까 금지 표시 커서가 뜬다구 하네 신기신기!!
|
||
import React from "react"; | ||
|
||
const ThirdStage = (ThirdStageProps) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
각 Stage 컴포넌트 구조가 동일하고 선택 옵션만 다른 것 같은데 이러면 Stage 컴포넌트를 하나로 묶어 빼고 Prop으로 각 레벨 옵션 데이터 넘겨줘서 map으로 뿌리는 게 재사용성이 더 좋을 것 같다는 생각이 들어!!
const [firstChoice, setFirstChoice] = useState(""); | ||
const [secondChoice, setSecondChoice] = useState(""); | ||
const [thirdChoice, setThirdChoice] = useState(""); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
나두 가형이랑 동일한 생각!! 한 번에 관리해주는 게 좋을 것 같다는 생각이 들어!! 실제로 나도 그렇게 구현했구 :)
더 좋은 방법이 있으려나...?
const SET_STAGE = "SET_STAGE"; | ||
const RESET_STAGE = "RESET_STAGE"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
요 부분은 상수명으로 가져다 쓸 거면 데이터를 정수값으로 줘도 괜찮지 않을까...? 확실하진 않지만.....
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
상수명으로 가져다 써서 어떠한 비교를 한다고 생각하면 의미없는 정수로 줬을 때 의도치 않게 로직이 잘못 적용될 수 있기 때문에, 유일할 수 있도록 이렇게 쓰는게 맞다고 생각해요! 정수값으로 주려면 아무래도 객체 같은걸로 묶으면 또 가능할 수도 있겠다
flex-direction: column; | ||
align-items: center; | ||
|
||
width: calc(100vw - 20rem); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
나도 시연누나 코드보고 배워서 요거 애용하는 중~~~~~
const RESET_STAGE = "RESET_STAGE"; | ||
|
||
function App() { | ||
const [state, dispatch] = useReducer(reducer, initialState); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
심화과제 👍🏻👍🏻👍🏻
const SET_STAGE = "SET_STAGE"; | ||
const RESET_STAGE = "RESET_STAGE"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
상수명으로 가져다 써서 어떠한 비교를 한다고 생각하면 의미없는 정수로 줬을 때 의도치 않게 로직이 잘못 적용될 수 있기 때문에, 유일할 수 있도록 이렇게 쓰는게 맞다고 생각해요! 정수값으로 주려면 아무래도 객체 같은걸로 묶으면 또 가능할 수도 있겠다
const renderResetBtn = () => { | ||
if (state.currentStage !== "") { | ||
return ( | ||
<ResetBtn | ||
type="button" | ||
onClick={() => { | ||
dispatch({ type: RESET_STAGE }); | ||
}} | ||
> | ||
Start Over | ||
</ResetBtn> | ||
); | ||
} | ||
}; | ||
|
||
return ( | ||
<> | ||
<Header>Would You Like Something to Drink?</Header> | ||
<Main> | ||
{renderOption()} | ||
{renderResetBtn()} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
const renderResetBtn = () => { | |
if (state.currentStage !== "") { | |
return ( | |
<ResetBtn | |
type="button" | |
onClick={() => { | |
dispatch({ type: RESET_STAGE }); | |
}} | |
> | |
Start Over | |
</ResetBtn> | |
); | |
} | |
}; | |
return ( | |
<> | |
<Header>Would You Like Something to Drink?</Header> | |
<Main> | |
{renderOption()} | |
{renderResetBtn()} | |
return ( | |
<> | |
<Header>Would You Like Something to Drink?</Header> | |
<Main> | |
{renderOption()} | |
{state.currentStage && <ResetBtn | |
type="button" | |
onClick={() => { | |
dispatch({ type: RESET_STAGE }); | |
}} | |
> | |
Start Over | |
</ResetBtn>} |
요롷게는 어떤가요?-?
✨ 구현 기능 명세
🌱 기본 조건
🧩 기본 과제
[취향대로 추천]
답변 선택
이전으로, 다음으로(결과보기) 버튼
아무것도 선택되지 않았을 시 버튼을 비활성화 시킵니다.
→ 눌러도 아무 동작 X
→ 비활성화일 때 스타일을 다르게 처리합니다.
이전으로
버튼을 누르면 이전 단계로 이동합니다.다음으로
/결과보기
버튼을 누르면 다음 단계로 이동합니다.버튼 호버시 스타일 변화가 있습니다.
결과
[ 랜덤 추천 ]
[ 공통 ]
다시하기
버튼→ 랜덤추천이면
랜덤 추천 start
화면으로, 취향대로 추천이면취향대로 추천 start
화면으로 돌아갑니다.→ 모든 선택 기록은 리셋됩니다.
🌠 심화 과제
theme + Globalstyle 적용
애니메이션
헤더
처음으로
버튼→ 추천 종류 선택 화면일시 해당 버튼이 보이지 않습니다.
→ 처음 추천 종류 선택 화면으로 돌아갑니다.
→ 모든 선택 기록은 리셋됩니다.
[ 취향대로 추천 ]
단계 노출
이전으로 버튼
useReducer
,useMemo
,useCallback
을 사용하여 로직 및 성능을 최적화합니다.생각과제
💎 PR Point
🥺 소요 시간, 어려웠던 점
8h
🌈 구현 결과물
https://puzzled-attack-df1.notion.site/3-08749f949d3a405990ca8e88eb34479a?pvs=4