-
Notifications
You must be signed in to change notification settings - Fork 1
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
Conversation
@@ -0,0 +1,14 @@ | |||
<!DOCTYPE html> | |||
<html lang="ko"> |
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.
우리 셋은 이건 꼭 지켜야지.. 맞지맞지
<> | ||
<ThemeProvider theme={theme}> | ||
<GlobalStyle /> | ||
<Router /> |
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.
Router를 벌써 쓴거얌..?
<St.CardFront | ||
key={`${cardId}_${idx}_front`} | ||
className={ | ||
openCardList.indexOf(idx) >= openCardList.length - 2 && `${isRotate}` |
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.
혹시 이부분 자세히 설명해줄 수 있으까욤..?
margin-top: 1rem; | ||
`, | ||
|
||
CardFront: styled.article` |
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 styled from "styled-components"; | ||
|
||
const Header = ({ level, score, setIsModalOpen }) => { | ||
const cardCount = level === "EASY" ? 5 : level === "NORMAL" ? 7 : 9; |
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.
아니 엄청 여러가지 생각을 하게 해준 코드였ㅓ,,, (나는 하나하나 조건 나눠서 useState
로 바꿨는데, 코드 줄이기 딱 좋다 배워가요ㅠㅠ!
|
||
const Header = ({ level, score, setIsModalOpen }) => { | ||
const cardCount = level === "EASY" ? 5 : level === "NORMAL" ? 7 : 9; | ||
const [isBlink, setIsBlink] = useState(false); |
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.
pr 다시 읽어보니까 맞구만
@@ -0,0 +1,132 @@ | |||
import styled from "styled-components"; |
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 [isModalOpen, setIsModalOpen] = useState(false); | ||
|
||
// 난이도 버튼 렌더링 | ||
const levelButtonList = [EASY, NORMAL, HARD].map((item) => ( |
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.
아 요거 map 쓸 생각을 못했네,,, 어떻게 생각해 냈어..?
}; | ||
|
||
// 렌더링 할 랜덤 배열 만들기 | ||
let renderData = useMemo(() => { |
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.
첨에 내가 서현이랑 비슷하게 설계하다가 실패했는데, useMemo()
를 안 써서 계속 원하는 대로 안 됐던 게 그래서 였구나,,, 뭔가 반성중,,,
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.
항상 많이 배워갑니다~ 저는 이번에 주석을.. 좀 빼먹은 것 같은데 주석까지 꼼꼼하게 하신거 보고 반성하고 돌아가요
"eslint:recommended", | ||
"plugin:react/recommended", | ||
"plugin:react/jsx-runtime", | ||
"plugin:react-hooks/recommended", |
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.
eslint 설정까지 해줬네 대단해!
웹 심화에서 배우고 다시 많이 까먹었는데 이렇게 eslint랑 react에서 추천하는 plugin이라도 넣어주면서 다음부턴 초기설정부터 잘 하고 시작해야겠다는 생각이 드네..
*.log | ||
npm-debug.log* | ||
yarn-debug.log* | ||
yarn-error.log* | ||
pnpm-debug.log* | ||
lerna-debug.log* |
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.
log파일이 어떤거고 왜 ignore에 넣는건지 궁금한데 설명해줄 수 있어?
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.
기록이 자동으로 남는 파일로 알고 있어!
예를 들어 yarn-error.log같은 경우에는 yarn 하면서 발생한 에러를 자동으로 기록해주더라!
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,14 @@ | |||
<!DOCTYPE html> | |||
<html lang="ko"> |
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.
우리 셋은 이건 꼭 지켜야지.. 맞지맞지
"styled-components": "^5.3.10", | ||
"styled-reset": "^4.4.6" |
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.
styled-reset 적용했구나! 항상 코드리뷰 하면서 배워갑니다~
setIsRotate("rotate"); | ||
setTimeout(() => { | ||
// 카드 오픈 리스트에서 최근에 넣었던 두 개 카드 삭제 | ||
const newList = openCardList.slice(0, -1); |
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.
오호 이건
openCardList.slice(0, -1 + openCardList.length)
처럼 동작하는 거구나 문법도 배워가!!
근데 배열을 slice로 잘라서 newList에 대입하고 그걸 다시 setOpenList에 주는 이유가 궁금해!
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.
그냥 궁예: 오픈된 카드 안 맞춰줬으니까 다시 뒤집으려고,,,?
|
||
testCardList.push(classList[2]); // 테스트 배열에 cardId 추가 | ||
setTimeout(() => { |
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.
classList[2]가 무엇을 의미하는거야??
setIsModalOpen(true); | ||
} | ||
|
||
setIsBlink(true); |
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.
score가 바뀐다는건 곧 올라간다는 의미니까 setIsBlick를 이렇게 score가 의존성 배열에 들어있는 effect에 넣어줘도 되는거구나? 배워가요~
<St.HeaderContainer> | ||
<h1>🔮 옴팡이를 맞춰주세요 🔮</h1> | ||
<St.Score className={isBlink && "blink"}> | ||
{score} / {cardCount} | ||
</St.Score> | ||
</St.HeaderContainer> | ||
); | ||
}; | ||
|
||
export default Header; | ||
|
||
const St = { | ||
HeaderContainer: styled.header` |
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.
St.Component 의 방법으로 styled component를 사용하는 이유가 궁금해요 금장디장님
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.
저 같은 경우에는 한눈에 스타일 컴포넌트인지, 일반 컴포넌트인지 쉽게 구분하기 위해서 사용합니당!!!
요렇게 하면 컴포넌트명만 보고도 바로 알 수 있거든요 ㅎㅎㅎ
const handleOnClick = () => { | ||
setIsModalOpen(false); | ||
}; |
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.
온클릭에 reset매개변수도 넣어주어서 reset시켜주면 게임 이용자가 더 간편하지 않을까 생각을 해봤어!
html { | ||
font-size: 62.5%; | ||
} |
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.
나도 담부터 이렇게 설정해서 1rem 10px로 편하게 적용해야겠다ㅎㅎ;
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 [isClickAbled, setIsClickAbled] = useState(true); // 카드 클릭 가능 여부 | ||
const [isRotate, setIsRotate] = useState(""); | ||
|
||
// level이 바뀌면, reset 버튼 눌리면 모두 초기화 |
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.
하나하나 주석 달아줘서 너무 고마운,,,
setIsRotate("rotate"); | ||
setTimeout(() => { | ||
// 카드 오픈 리스트에서 최근에 넣었던 두 개 카드 삭제 | ||
const newList = openCardList.slice(0, -1); |
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.
그냥 궁예: 오픈된 카드 안 맞춰줬으니까 다시 뒤집으려고,,,?
<St.HeaderContainer> | ||
<h1>🔮 옴팡이를 맞춰주세요 🔮</h1> | ||
<St.Score className={isBlink && "blink"}> | ||
{score} / {cardCount} | ||
</St.Score> | ||
</St.HeaderContainer> | ||
); | ||
}; | ||
|
||
export default Header; | ||
|
||
const St = { | ||
HeaderContainer: styled.header` |
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 Router = () => { | ||
return ( | ||
<BrowserRouter> | ||
<Routes> |
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.
라우터 지금부터 쓰는 똑또기가 여기이따!!
✨ 구현 기능 명세
기본 과제
심화 과제
✅ 생각 과제
🌼 PR Point
전역 상태관리 라이브러리를 사용하지 않고 구현했습니다!
FindOmpangi.jsx
useMemo
를 이용했어요CardSection.jsx
openCardList
에 따라 조건부 렌더링했어요.필요한 작업을 동기적으로 구현하기 위해
setTimeOut
메소드를 이용했어요.👉 이런 상황에서 동기적으로 구현할 수 있는 더 좋은 방법이 있다면 공유해주세요! 👐
Header.jsx
최초 렌더링에는 깜빡이지 않도록 early return을 해주었습니다!
➕ 1차 리팩토링
testCardList
의 경우 선택한 두 카드가 짝이 맞는지 검사하기 위한 배열인데, 원래는 state로 만들었다가 다시 생각해보니 렌더링과 관련 없는 변수이므로 state로 관리하는게 적합하지 않다고 생각했어요! 그래서 일반 변수로 바꿔주었습니당🥺 소요 시간, 어려웠던 점
그래서 중간에 class 유무에 따라 앞 뒤를 보여주는 방식으로 다시 바꿀까 하다가, 그냥 한 번 이 상태로 구현해봤습니다! ㅎㅎ
🌈 구현 결과물
level 바꾸기
카드게임 구현 (뒤집어지는 애니메이션, 쌍을 맞춘 경우 깜빡이는)
level 바꾸면 초기화
reset 버튼
모달 구현