Skip to content
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주차 기본/심화 과제] 🍚 점메추 🍚 #4

Open
wants to merge 29 commits into
base: main
Choose a base branch
from

Conversation

eonseok-jeon
Copy link
Contributor

@eonseok-jeon eonseok-jeon commented Dec 14, 2023

✨ 구현 기능 명세

🌱 기본 조건

  • 기본조건1

✅ 선택 과정은 총 3단계입니다. ( 3개 → 3개 → 2개)

✅ 아이템은 총 18개 이상입니다. (3 x 3 x 2 = 18)

위는 “최소”기준이며 그 이상의 개수는 가능합니다.

스크린샷 2023-12-14 오후 5 29 17
  • 기본조건2

✅ 전역상태관리 라이브러리, context 사용 금지 ❌

✅ Router 사용 금지 ❌


🧩 기본 과제

  1. 추천 종류 선택
    • 취향대로 추천 / 랜덤 추천 중 선택합니다.
    • 선택시 다음화면으로 넘어갑니다.

[취향대로 추천]

  1. 답변 선택

    • 호버시 스타일 변화가 있습니다.
    • 클릭시(선택시) 스타일 변화가 있습니다.
  2. 이전으로, 다음으로(결과보기) 버튼

    • 아무것도 선택되지 않았을 시 버튼을 비활성화 시킵니다.

      → 눌러도 아무 동작 X

      → 비활성화일 때 스타일을 다르게 처리합니다.

    • 이전으로 버튼을 누르면 이전 단계로 이동합니다.

    • 다음으로 / 결과보기 버튼을 누르면 다음 단계로 이동합니다.

    • 버튼 호버시 스타일 변화가 있습니다.

  3. 결과

    • 선택한 정보들에 맞는 결과를 보여줍니다.

[ 랜덤 추천 ]

  1. 숫자 카운트 다운
    • 3 → 2 → 1 숫자 카운트 다운 후 결과를 보여줍니다.
    • 추천 결과는 반드시 랜덤으로 지정합니다.

[ 공통 ]

  1. 결과 화면
    • 다시하기 버튼

      → 랜덤추천이면 랜덤 추천 start 화면으로, 취향대로 추천이면 취향대로 추천 start 화면으로 돌아갑니다.

      → 모든 선택 기록은 리셋됩니다.


🌠 심화 과제

  1. theme + Globalstyle 적용

    • 전역으로 스타일을 사용할 수 있도록 적용해보세요
  2. 애니메이션

    • 랜덤 추천 - 카운트다운에 효과를 넣어서 더 다채롭게 만들어주세요!
  3. 헤더

    • 처음으로 버튼

      → 추천 종류 선택 화면일시 해당 버튼이 보이지 않습니다.

      → 처음 추천 종류 선택 화면으로 돌아갑니다.

      → 모든 선택 기록은 리셋됩니다.

[ 취향대로 추천 ]

  1. 단계 노출

    • 3단계의 진행 단계를 보여줍니다.
  2. 이전으로 버튼

    • 이전으로 돌아가도 선택했던 항목이 선택되어 있습니다.
  • 6. useReducer , useMemo , useCallback 을 사용하여 로직 및 성능을 최적화합니다.


💎 PR Point

  • funnel 구조 사용

🥺 소요 시간, 어려웠던 점

  • 12h
    제가 원하는 대로 분명 코드를 짰는데 정말 이상하게도 동작을 안 하는 오류가 발생했습니다.
    그로 인해 결국 과제를 다 하지 못한 채 미국으로 가게 되었는데요
    다시 돌와와서 해보니 잘 되었습니다.
    정말 이상하네요;

🌈 구현 결과물

2023-12-14.5.29.45.mov

@eonseok-jeon eonseok-jeon added the 🐤 기본과제 기본과제 label Dec 14, 2023
@eonseok-jeon eonseok-jeon self-assigned this Dec 14, 2023
Copy link
Member

@seobbang seobbang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와 너무 너무 깔끔하게 구조를 잘 짜서 깜짝 놀랬어.. 최고다 !!! 고생 많았어 ㅎㅎ

return (
<S.HeaderStyle>
<h1>🍛 오늘의 점메추 🍛</h1>
{selectOption !== '' && (
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
{selectOption !== '' && (
{selectOption && (

이렇게만 해도 되겠다! 빈 문자열은 falsy값, 빈 문자열이 아니면 truthy 값이라서 가능합니당

@@ -0,0 +1,28 @@
import styled from 'styled-components';

const HeaderStyle = styled.header`
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

시맨틱하게 잘했다 !!

Comment on lines +10 to +13
{(selectOption === '' || selectOption === 'personal') && (
<S.ArticleStyle
onClick={() => {
selectOptionHandler('personal');
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사소한거지만 'personal'이런 특정 string은 상수화해서 가져다쓰는게 매직 넘버를 쓰지 않는 좋은 코드 습관!!

Comment on lines +20 to +29
{(selectOption === '' || selectOption === 'random') && (
<S.ArticleStyle
onClick={() => {
selectOptionHandler('random');
}}
>
<a href="#">랜덤 추천</a>
</S.ArticleStyle>
)}
</S.MainSectionStyle>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기 실제 태그로 보면 article 에 onClick을 주고 안에서 a 태그로 상단 이동이 되는 구조 같은데, 이렇게 구현한 이유가 있을까?!

나는 랜덤추천과 취향대로 추천이 각각 버튼이다 보니

Suggested change
{(selectOption === '' || selectOption === 'random') && (
<S.ArticleStyle
onClick={() => {
selectOptionHandler('random');
}}
>
<a href="#">랜덤 추천</a>
</S.ArticleStyle>
)}
</S.MainSectionStyle>
{(selectOption === '' || selectOption === 'random') && (
<button
onClick={() => {
selectOptionHandler('random');
}}
>랜덤 추천
</button>
)}

이렇게 button태그를 쓰는게 더 자연스럽다고 생각했는데 !

Comment on lines +41 to +44
const imgUrl = new URL(
`../../../assets/${menuState.firstChoice}-${menuState.secondChoice}-${menuState.thirdChoice}.jpg`,
import.meta.url
).href;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아 세상에 ㅋㅋㅋㅋㅋㅋ

return (
<>
<S.SubTitleStyle>오늘은 어떤 종류가 먹고 싶어?</S.SubTitleStyle>
<S.CountParagraph>1 / 3</S.CountParagraph>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이런것두 다 매직 넘붤이다

Comment on lines +11 to +22
case 'done': {
return { ...state, nthChoice: action.value };
}
case 'first': {
return { ...state, firstChoice: action.value };
}
case 'second': {
return { ...state, secondChoice: action.value };
}
case 'third': {
return { ...state, thirdChoice: action.value };
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

얘도 case 뒤에 string들이 상수 객체 같은걸로 관리되면 좋겠다! dispatch 함수 쓸 때도 가져가서 쓸 수 있게 ?!

<S.CountParagraph>1 / 3</S.CountParagraph>
<S.MainSectionStyle>
<S.ArticleStyle
$isClicked={firstChoice === 1 ? true : false}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
$isClicked={firstChoice === 1 ? true : false}
$isClicked={firstChoice === 1}

이렇게만 줘도 되겠네용 !

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

선택되지 않았을 때 0, 선택된 항목 순서에 따라서 1 ,2, 3 이렇게 숫자값을 준 것 같은데, 그 숫자가 각 항목을 뜻한다는걸 좀 보고 난 뒤에야 알았거든! 그래서 의미가 나타나지 않는 이런 숫자를 쓰기보다는 의미가 담긴 값(예를 들면 string)을 사용하면 좋을 것 같아! 그럼에도 나는 숫자값으로 관리를 하고 싶다면

export const SELECT_OPTION = {
none: 0,
first : 1,
second : 2,
third : 3,
}

이런식으로 만들어놓고 가져다 쓰는 것도 괜찮겠당. 뭔가 상수 얘기를 많이 하게 되는군 크크

Comment on lines +39 to +42
{count !== 0 && <AnimationText>{count}</AnimationText>}
{count === 0 && (
<ResultArticle imgUrl={imgUrl} num={randomNum} startPickHandler={startPickHandler} />
)}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
{count !== 0 && <AnimationText>{count}</AnimationText>}
{count === 0 && (
<ResultArticle imgUrl={imgUrl} num={randomNum} startPickHandler={startPickHandler} />
)}
{ count ? <AnimationText>{count}</AnimationText>
: (
<ResultArticle imgUrl={imgUrl} num={randomNum} startPickHandler={startPickHandler} />)}
)}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants