-
Notifications
You must be signed in to change notification settings - Fork 13
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주차] 김채림 미션 제출합니다. #18
base: master
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.
안녕하세요 채림님
프론트엔드 멘토 김선종입니다.
커스텀 훅도 사용하려 하시고, 이번주에 과제 수행을 위해 많은 노력을 하신게 느껴집니다. 커스텀 훅이라는게 자주 사용하는 로직을 한번 더 추상화 하는것이기 때문에, 기존에 있던 함수들을 모아서 하나의 모듈 처럼 사용할 수 도 있고, 어떤 상태를 변화시키는 특정 로직을 묶어서 추상화해볼 수 도 있습니다. 그런 의미에서 제가 채림님의 코드에서 어떻게 커스텀 훅을 사용해 리팩토링 해볼 수 있는지 몇몇 제안을 해봤습니다. 한번 참고해보시면 좋을 것 같아요,
과제 하느라 고생하셨습니다
const Clock = () => { | ||
//moment.js 모듈 사용 | ||
const [time, setTime] = useState(moment()); | ||
|
||
// 처음 렌더링될 때만 실행 | ||
useEffect(() => { | ||
setInterval(() => { | ||
//현재 시간 불러오기 | ||
setTime(moment()); | ||
|
||
//1초마다 반복 | ||
}, 1000); | ||
}, []); | ||
|
||
return <ClockContainer>{time.format('HH:mm:ss')}</ClockContainer>; | ||
}; |
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 moment from 'moment'
const useClock = () => {
const [time, setTime] = useState(moment().format('HH:mm:ss'));
useEffect(() => {
setInterval(() => {
setTime(moment().format('HH:mm:ss'));
}. 1000);
}, []);
return [time, setTime];
}
이렇게 시계 텍스트만 리턴하도록 커스텀 훅을 만들면 어떨까요?
import useClock from 'hooks'
const Clock = () => {
const [currentTime, ] = useClock();
return <ClockContainer>{currentTime}</ClockContainer>
}
이렇게 내가 원하는 형태로 시계 컴포넌트를 재사용할 수 있겠죠.
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.
커스텀 훅에 대한 조언 감사드립니다!!! 또 어디에 커스텀 훅을 적용해볼 수 있을까 고민이 있었는데 시계에 적용해보면 좋을 것 같네요!! 감사합니다 😆
} | ||
|
||
//handleTodoInput 인터페이스 정의 | ||
export interface ITodoInputTypes { |
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.
props
의 인터페이스는 보통 이름에 props가 들어갑니다
export interface ITodoInputTypes { | |
export interface ITodoInputProps { |
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.
안녕하세요 채림님! 3주차 코드리뷰 파트너 오민지입니다 :)
코드를 잘 작성해주셔서 제 코드랑 다른 점 하나 코멘트 남기고 갑니다!
확실히 로컬 스토리지를 사용하니까 코드가 길어지는데 이 부분을 훅으로 처리하니까 보기 편한 것 같아요 👍
다만 아쉬운 점은 배포 링크가 오류가 뜨네요 :'( 오늘 스터디 세션 때 뵙겠습니다!!
|
||
const TodoInput = ({ handleTodoInput }: ITodoInputTypes) => { | ||
const { todoText, handleInputChange, handleInputInitialize } = useInput(''); | ||
const handleInputSubmit = (e: React.SyntheticEvent) => { |
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.
저는 이 부분을 e: React.FormEvent으로 설정했는데 혹시 SyntheticEvent를 설정하신 이유가 있는지 궁금합니다!
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.
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.
저번주 현재님 코드리뷰 참고했던 부분인데 멘토님께서 이번주 프짱님 리뷰에서 다시 한 번 짚어주셨습니다! e: React.SyntheticEvent
보다 민지님, 성우님께서 사용하신 e: React.FormEvent<HTMLFormElement>
를 사용해주는 것이 좋다고 하네요! 저도 이부분 참고해서 수정해보려구요 ㅎㅎ
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주차 리뷰파트너 신성우 입니다! 채림님 코드를 읽으면서 정말 많이 배웠습니다. 특히 custom hooks와 관련해서 많은 참고가 되었습니다. 이번주 과제에 많은 열정을 쏟으신게 코드에서 느껴져서 자극이 되네요. 잘 작성해주신 코드라 제가 코멘트 드릴것은 별로 없었지만 몇가지 의견과 궁금한점 남깁니다! 😁
+) 배포 링크를 클릭하니 흰화면만 나오네요. 확인 해보시면 좋을것 같습니다!
const TodoContainer = styled.div` | ||
margin: 0 auto; | ||
margin-top: 3rem; | ||
background: rgba(189, 187, 187, 0.8); | ||
width: 30rem; | ||
height: 39rem; | ||
border-radius: 30px; | ||
box-shadow: 0 5px 18px -7px rgba(0, 0, 0, 1); | ||
padding: 30px; | ||
`; |
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 compenets 관련 코드가 컴포넌트 관련 코드 하단에 위치하는게 코드 가독성 측면에서 더 좋은것 같습니다!
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'; | ||
import { ITodo } from '../interface/interface'; | ||
import useAddTodo from '../hooks/useAddTodo'; | ||
import useInput from '../hooks/useInput'; |
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 TodoInput = ({ handleTodoInput }: ITodoInputTypes) => { | ||
const { todoText, handleInputChange, handleInputInitialize } = useInput(''); | ||
const handleInputSubmit = (e: React.SyntheticEvent) => { |
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.
저도 궁금하네요 🙌
} | ||
|
||
// todolist, handleTodoDelete, handleTodoToggle 인터페이스 정의 | ||
export interface ITodoListsTypes { |
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.
타입스크립트 기초에 대해 공부하면서 알게되었는데 export를 한번에 해주는게 일반적이라고 합니다!
export interface ITodoListsTypes { | |
export type { | |
ITodo, | |
ITodoInputTypes, | |
ITodoItemTypes, | |
ITodoListsTypes, | |
} |
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.
와.. 이렇게 하면 하나하나 export를 작성하지 않아도 되는군요...!!! 공부가 부족했던 부분이네요!! 감사합니다!!!!
onChange={handleInputChange} | ||
placeholder="할 일을 입력하세요" | ||
type="text" | ||
required |
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.
이부분은 저도 시원님 코드 리뷰 하면서 배웠던 부분인데 한번 가져다 써봤어요 ㅎㅎ
text-decoration: ${({ isCompleted }: { isCompleted: boolean }) => | ||
isCompleted ? 'line-through' : 'none'}; | ||
color: ${({ isCompleted }: { isCompleted: boolean }) => | ||
isCompleted ? '#adb5bd' : 'black'}; |
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.
text-decoration: ${({ isCompleted }: { isCompleted: boolean }) => | |
isCompleted ? 'line-through' : 'none'}; | |
color: ${({ isCompleted }: { isCompleted: boolean }) => | |
isCompleted ? '#adb5bd' : 'black'}; | |
import styled, { css } from "styled-components"; | |
... | |
${({ isCompleted }) => | |
isCompleted && { | |
css` | |
text-decoration: line-through; | |
color: #adb5bd; | |
`} |
이렇게도 작성해볼 수 있을것 같습니다!
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.
wow.....props 한번만 전달 받아서 이렇게 쓸 수가 있군요.. 대박...혹시 스터디 시간에 설명 조금 부탁드려도 될까요,,,,,?
안녕하세요! CEOS 프론트 15기 김채림입니다. 타입스크립트를 제대로 사용해본 적이 처음이라 수 많은 빨간 줄을 봤던 한 주였습니다.. 😇
공부 의지를 불태워주네요..ㅎㅎ...
💻 배포링크
https://chaaerim.github.io/react-todo-15th/
+vercel 오류를 해결하지 못해서 일단 깃허브로 배포했습니다.. vercel에서 빌드는 되었는데 화면에 아무것도 보이지 않아요..^^
typescript를 -g로 설치하지 않은 것이 문제같아서 몇 번이나 삭제하고 다시 설치했는데....아직 해결을 못했습니다......🥲�
📗 수정한 내용
크게 추가한 내용은 없지만 2주차 코드리뷰 반영, 중복제거를 위해 노력했습니다. 원래 TodoLists 컴포넌트 내부에 TodoItem을 중복해서 사용하는 부분이 있어 중복되는 부분을 다른 컴포넌트로 만들까 하다가 컴포넌트의 개수만 너무 많아지는 것 같아 기존에 있는 TodoLists를 활용하는 방향으로 수정해보았습니다.
✏️어려웠던 부분
타입스크립트로 변환하는데 생각보다 시간이 오래걸렸습니다 ..ㅎ 분명 tsc로 컴파일하고 npm start로 빌드했을 때는 오류가 없었는데 화면에는 백지 밖에 보이지 않는 속 터지는 상황이 발생했습니다.
개발자 도구를 확인해보니
Uncaught SyntaxError: Unexpected token '<'
라는 에러 메세지가 떠서 package.json에서 원래 있던 homepage 값을 삭제하고"homepage": “.”
로 바꿨더니 해결이 되긴 했는데 저도 어떤 부분에서 에러가 발생한 건지, 어떻게 해결한 건지 감이 안잡혀요.. 혹시 이 부분에 대해서 아시는 분 계신다면 조언 부탁드립니다!그리고 아직 hooks에 대한 이해도 부족한 것 같습니다..
useInput
을 만들고 커스텀 훅을 하나 더 만들어보고 싶어서useAddTodo
를 만들어보긴 했는데 과연 제가 만든 것을 hook이라고 할 수 있는지 잘 모르겠습니다. 그냥 기존의 코드를 옮겨 붙여넣기만 한 것 같아서 만들면서도 찝찝한 기분이 들었는데 이 부분에 대해서도 코드리뷰 많이 남겨주시면 감사하겠습니다.😅 아쉬운 부분
Context API 적용을 추천한다는 코멘트를 마무리 하고 나서 확인해 Context API를 사용해보지 못한 것이 아쉽습니다. 주말 동안 다시 공부해서 적용할 수 있도록 해봐야겠어요!
+커밋메세지도 너무 큰 단위로 작성한 것 같아 아쉽네요ㅠ