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

[2주차] 노수진 미션 제출합니다. #8

Open
wants to merge 8 commits into
base: master
Choose a base branch
from

Conversation

sujinRo
Copy link

@sujinRo sujinRo commented Mar 24, 2023

안녕하세요! 노수진입니다.

React로 Todo를 구현하면서 저번 미션에서 하지 못했던 localStorage를 이용하여 재 실행하여도 todo가 남아있도록 하였고, 저번에 받았던 피드백들을 모두 수정하기 위해 노력하였습니다.!
구현을 하면서 기능별로 git에 commit하는 것에 익숙하지 않아 commit양이 적은데 과제를 하면서 점점 익숙해 나가겠습니다,,ㅎ
이번 과제도 하면서 많이 배웠습니다:)

[Key Questions]

1. Virtual-DOM은 무엇이고, 이를 사용함으로서 얻는 이점은 무엇인가요?
DOM은 트리구조로 이해하기는 쉽지만 구조때문에 거대한 DOM트리에서는 속도 문제가 발생하였고, 지속적인 DOM업데이트는 잦은 오류를 발생시켰습니다. 또한, DOM을 제대로 찾지 못한다면 코드를 분석하려고 다시 거대한 HTML을 들여다 봐야 하는 단점이 존재했습니다. 이러한 단점을 보완하기 위해 만든 것이 Virtual-DOM 입니다.

Virtual-DOM은 DOM을 추상화한 가상 객체로, 변화가 많은 View를 실제 DOM에서 직접 처리하는 방식이 아닌 Virtual Dom과 메모리에서 미리 처리하고 저장한 후 실제 DOM과 동기화 하는 프로그래밍 개념입니다. 실제 DOM보다 가볍고 빠른 rendering이 가능하기 때문에 DOM의 부담을 줄여줍니다. 또한 구조상으로 실제 DOM과 큰 차이가 없어 이해하기도 편리합니다!

2. 미션을 진행하면서 느낀, React를 사용함으로서 얻을 수 있는 장점은 무엇이었나요?
React Hook을 이용하여 계속해서 변화하는 값을 지정하는 것이 편리하다고 느껴졌습니다.

3. React에서 상태란 무엇이고 어떻게 관리할 수 있을까요?
React에서 상태(State)란 컴포넌트에 대한 데이터 또는 정보를 포함하는 데 쓰이는 React 내장 객체입니다. 컴포넌트 상태는 시간이 지남에 따라 변경될 수 있다. 변경될 때마다 컴포넌트가 다시 렌더링됩니다. state 변경은 사용자 작업 또는 시스템 생성 이벤트에 대한 응답으로 발생할 수 있으며 이 변경은 컴포넌트의 동작, 렌더링 방법을 결정합니다.

상태를 관리할 수 있는 라이브러리에는 Redux, MobX, Recoil 등이 있습니다.
참고: https://han-py.tistory.com/487

4. Styled-Components 사용 후기 (CSS와 비교)
같은 페이지에 있어 스타일을 지정할 때 페이지를 이동할 필요가 없고,
id나 class를 주지 않고, 컴포넌트 이름 쓰듯, 스타일을 지정해서 좀 더 보기 좋다는 점이 CSS보다 좋았습니다.

TodoList:
https://react-todo-17th-3ld7-kn5wybd5y-sujinro.vercel.app/

Copy link
Member

@YooSeonHo YooSeonHo left a comment

Choose a reason for hiding this comment

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

수진님 안녕하세요 프론트 운영진 유선호입니다!
코드 리뷰를 통해 받은 피드백들을 많이 받영해주시다니 감동입니당😭
코드가 깔끔해서 읽기 편했던 거 같아요!
수정 사항이라기 보단 저의 개인적인 의견들을 달아 두었으니 확인 부탁드려요!
한 주 동안 고생 많으셨고 스터디 때 봬요!!!

src/TodoList.js Outdated
Comment on lines 20 to 34
<div className="done">
<p className="subTitle">📂done</p>
<p className="doneCount">items: {doneId}</p>
<ul type="none" id="doneList">
<TodoText
key={doneInfo.id}
id={doneInfo.id}
todo={doneInfo.todo}
isChecked={doneInfo.isChecked}
deleteTodo={deleteDone}
move={moveToTodo}
moveList={moveTodoList}
/>
</ul>
</div>
Copy link
Member

Choose a reason for hiding this comment

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

todolistdonelist 로 분리하여 컴포넌트 별로 관리해주시면 더 좋을 거 같아요!

src/TodoList.js Outdated
return (
<div className="container">
<h1 className="title">Things to do</h1>
<AddForm />
<AddForm addTodo={addTodo} />
Copy link
Member

Choose a reason for hiding this comment

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

이벤트 핸들러의 이름은 보통 handle + 대상 + 동작의 형식으로 짓는다고 해요.

참고자료 한 번 읽어보시면 좋을 거 같아요!

Comment on lines +4 to +23
const FormInput = styled.form`
display: flex;
height: 8vh;
align-items: center; /*교차축 정렬*/
justify-content: center; /*주축 정렬*/
`;

const InputText = styled.input`
border-radius: 0.8vw;
border: none;
width: 75%;
height: 2vw;
background-color: rgb(255, 225, 170);
font-size: 1vw;
outline: none;
&::placeholder {
color: rgb(255, 236, 200);
}
`;

Copy link
Member

Choose a reason for hiding this comment

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

오... 마지막에 바꾸셨군요!


const All = styled.body`
const All = styled.div`
font-family: Arial, Helvetica, sans-serif;
Copy link
Member

Choose a reason for hiding this comment

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

폰트 예뻐요 😁

@@ -2,8 +2,9 @@ import React, { useCallback, useEffect, useState, useRef } from 'react';
import AddForm from './AddForm';
import TodoText from './TodoText';
import styled from 'styled-components';
import { v4 as uuidv4 } from 'uuid';
Copy link
Member

@YooSeonHo YooSeonHo Mar 25, 2023

Choose a reason for hiding this comment

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

key 값을 위해 uuid를 사용하셨네요! 좋아용~~ Date.now() 같은 방법도 추천 드릴게요!

@@ -0,0 +1,65 @@
import React, { useEffect, useState, useRef } from 'react';

Choose a reason for hiding this comment

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

저도 이렇게 사용했었는데 React를 적어주지 않아도 되는 걸 이번 코드 리뷰 하면서 처음 알게 됐어요!!
예린님 과제에서 문기님이 코드 리뷰 해주신 부분 참고하시면 도움 되실 것 같아요!!! 코드 리뷰

Comment on lines +53 to +57
&::-webkit-scrollbar {
background: transparent;
width: 0;
}
`;

Choose a reason for hiding this comment

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

오오~ 스크롤 바를 아예 안 보이게 해주는 것도 깔끔하고 보기 좋은 것 같아요!!!👏🏻👏🏻👏🏻

Comment on lines +72 to +77
function TodoList() {
const [todoList, setTodoList] = useState([]);
const [todoId, setTodoId] = useState(0);
const [doneList, setDoneList] = useState([]);
const [doneId, setDoneId] = useState(0);
const isMount = useRef(true);

Choose a reason for hiding this comment

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

수진님께서 작성하신 addTodo 함수에 있는 isChecked 상태를 활용하셔서 list를 todo와 done으로 따로 만들지 않고 한 번에 관리하시면 전반적으로 중복되는 코드들을 줄일 수 있을 것 같아요~!! 개인적인 생각입니다ㅎㅎ!!💪🏻

Copy link

@hyosin-Jang hyosin-Jang left a comment

Choose a reason for hiding this comment

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

수진님 안녕하세요~~
전체적으로 ref랑 useCallback을 잘 활용하시는거 같아요
수진님 코드 보면서 많이 배웠습니다!
이번 주도 과제하느라 고생하셨고 스터디 때 뵐게요! ☺️

overflow: auto;
&::-webkit-scrollbar {
background: transparent;
width: 0;

Choose a reason for hiding this comment

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

스크롤바 안나타나게 한거 좋아요~~ 깔끔하네요 👍

border: none;
width: 75%;
height: 2vw;
background-color: rgb(255, 225, 170);

Choose a reason for hiding this comment

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

vw랑 vh를 잘 사용하시는거 같아요! 👍


useEffect(() => {
input.current.focus();
setValue('');

Choose a reason for hiding this comment

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

input에 ref 달아서 초기화할 때 focus 준거 좋은 방법인거 같아요! 👍

cursor: pointer;
`;

const SectionCount = styled.p`

Choose a reason for hiding this comment

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

시멘틱 태그를 적절히 잘 쓰시는거 같아요!

const isMount = useRef(true);

useEffect(() => {
if (!isMount.current) {

Choose a reason for hiding this comment

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

ref를 state처럼 사용하신게 인상 깊었어요 리렌더링이 필요하지 않을 때는 ref를 사용하는게 좋은 방법인거 같네요!!

(id) => {
const index = doneList.findIndex((doneInfo) => doneInfo.id === id);
const newTodoList = [...todoList];
newTodoList.push(doneList[index]);

Choose a reason for hiding this comment

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

const newTodoList = [...todoList, doneList[index]] 처럼 한번에 적어줄 수 있을거 같아요!

const newDoneList = doneList.filter((doneInfo) => doneInfo.id !== id);
setDoneList(newDoneList);
setDoneId((newDoneId) => newDoneId - 1);
},

Choose a reason for hiding this comment

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

state를 업데이트하실 때 이전 상태를 참조해서 잘하신거 같아요!

Copy link

@westofsky westofsky left a comment

Choose a reason for hiding this comment

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

대체로 react를 잘 활용하는게 느껴지는 코드였어요 .. 저는 useCallback을 잘 사용하지 않았던 것 같은데 잘 사용하신 것 같아 배워갑니다.. 약간의 참고할만한 것들 적어보았어요 과제 수고했습니다~~~

Comment on lines +59 to +62
const List = styled.ul`
font-size: 1vw;
cursor: pointer;
`;

Choose a reason for hiding this comment

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

한글은 아무리 길어도 줄바꿈되는데 영어나 숫자는 줄바꿈이 안되어서 저는 이부분
word-break : break-all; 로 처리했는데 한번 참고만 하셔요!

Comment on lines +128 to +144
const deleteTodo = useCallback(
(id) => () => {
const newTodoList = todoList.filter((todoInfo) => todoInfo.id !== id);
setTodoList(newTodoList);
setTodoId((newTodoId) => newTodoId - 1);
},
[todoList]
);

const deleteDone = useCallback(
(id) => () => {
const newDoneList = doneList.filter((doneInfo) => doneInfo.id !== id);
setDoneList(newDoneList);
setDoneId((newDoneId) => newDoneId - 1);
},
[doneList]
);

Choose a reason for hiding this comment

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

todoId랑 doneId가 중복이 될 때 삭제를 하면
image
와 같은 상황에 'ㅁㅁ'을 제거하기 위해 누르면 같은 id(0)값을 가진 4번index('ㅁㅁㅁㅇㄹㄴ')가 삭제되는 것 같아요
id값을 한번 Date.now()와 같이 중복되지 않도록 설정해두시는 건 어떨까요 ?

Comment on lines +201 to +246
<All>
<Container>
<Title>Things to do</Title>
<AddForm addTodo={addTodo} />
<SectionLine />
<SectionName>
<SubTitle>📒to do</SubTitle>
<SectionCount>items: {todoId}</SectionCount>
<List type="none">
{todoList.map((todoInfo) => {
return (
<TodoText
key={uuidv4()}
id={todoInfo.id}
todo={todoInfo.todo}
isChecked={todoInfo.isChecked}
deleteTodo={deleteTodo}
move={moveToDone}
moveList={moveDoneList}
/>
);
})}
</List>
</SectionName>
<SectionLine />
<SectionName>
<SubTitle>📂done</SubTitle>
<SectionCount>items: {doneId}</SectionCount>
<List type="none">
{doneList.map((doneInfo) => {
return (
<TodoText
key={uuidv4()}
id={doneInfo.id}
todo={doneInfo.todo}
isChecked={doneInfo.isChecked}
deleteTodo={deleteDone}
move={moveToTodo}
moveList={moveTodoList}
/>
);
})}
</List>
</SectionName>
</Container>
</All>

Choose a reason for hiding this comment

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

Tag명들을 보고 이해하기 쉽게 잘 사용하신 것 같아요

Comment on lines +162 to +164
newDoneList[index].isChecked = newDoneList[index].isChecked
? false
: true;

Choose a reason for hiding this comment

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

이부분은 newDoneList[index].isChecked = !newDoneList[index.isChecked; 혹은 가독성이 그렇게 좋진 않지만 .. newDoneList[index].isChecked ^= true; 도 쓸 수 있을 것 같아요

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

Successfully merging this pull request may close these issues.

5 participants