-
Notifications
You must be signed in to change notification settings - Fork 10
[2주차] 김현민 미션 제출합니다. #6
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
base: master
Are you sure you want to change the base?
Changes from all commits
887f296
33d89f9
a02c979
ab1f73e
c32e1fe
9b063dd
38edd1b
ab16714
ad68963
620d477
76aaad6
fbc80d1
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,9 +1,13 @@ | ||
| import { Route, Routes, Navigate } from "react-router-dom"; | ||
| import Todo from "./pages/Todo"; | ||
|
|
||
| function App() { | ||
| return ( | ||
| <div> | ||
| <h1>18기 프론트 화이팅~ 푸하항ㅋ</h1> | ||
| </div> | ||
| ); | ||
| return ( | ||
| <Routes> | ||
| <Route path="/" element={<Todo />} /> | ||
| <Route path="/*" element={<Navigate to="/" />} /> | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 메인 페이지 이외의 접근을 막는 디테일 좋은 것 같아요~~
Comment on lines
+5
to
+8
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이렇게 메인페이지 이외 접근을 막을 수도 있었군요 ㅎㅎ 디테일 감탄했습니다 |
||
| </Routes> | ||
| ); | ||
| } | ||
|
|
||
| export default App; | ||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,70 @@ | ||||||||||||||||||||||||||||||||
| import React, { useEffect, useState } from "react"; | ||||||||||||||||||||||||||||||||
| import styled from "styled-components"; | ||||||||||||||||||||||||||||||||
| import { setTodo } from "../hooks/setTodo"; | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| function EachTodo({ index, todo, todoLists, setTodoLists }) { | ||||||||||||||||||||||||||||||||
| const [checkState, setCheckState] = useState(todo.checked); | ||||||||||||||||||||||||||||||||
| const checkboxChanged = (e) => { | ||||||||||||||||||||||||||||||||
| const updatedTodoLists = [...todoLists]; | ||||||||||||||||||||||||||||||||
| updatedTodoLists[index] = { | ||||||||||||||||||||||||||||||||
| ...updatedTodoLists[index], | ||||||||||||||||||||||||||||||||
| checked: !updatedTodoLists[index].checked, | ||||||||||||||||||||||||||||||||
| }; | ||||||||||||||||||||||||||||||||
| setTodoLists(updatedTodoLists); | ||||||||||||||||||||||||||||||||
| setCheckState((prev) => !prev); | ||||||||||||||||||||||||||||||||
| }; | ||||||||||||||||||||||||||||||||
|
Comment on lines
+6
to
+15
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
어차피 setTodoLists로 다시 받아온다면 checked도 바뀐 채로 넘어와서 checkState는 따로 관리하지 않아도 될 것 같습니다! 또한 todoLists가 바뀌면서 rendering이 되고 checkState가 바뀌면서 다시 rendering이 될 것 같아 불필요하게 두번 렌더링이 될 것 같아요
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 최적화에 더 신경쓰도록 하겠습니다!! 감사합니다 ㅎㅎ |
||||||||||||||||||||||||||||||||
| const deleteTodo = () => { | ||||||||||||||||||||||||||||||||
| const updatedTodoLists = [...todoLists]; | ||||||||||||||||||||||||||||||||
| updatedTodoLists.splice(index, 1); | ||||||||||||||||||||||||||||||||
|
Comment on lines
+17
to
+18
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이부분은 filter함수를 이용해서
Suggested change
처럼 사용할 수 있을 것 같아요
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 좋은 의견 감사드립니다~!! |
||||||||||||||||||||||||||||||||
| setTodoLists(updatedTodoLists); | ||||||||||||||||||||||||||||||||
| }; | ||||||||||||||||||||||||||||||||
| useEffect(() => { | ||||||||||||||||||||||||||||||||
| setTodo(todoLists); | ||||||||||||||||||||||||||||||||
| }, [todoLists]); | ||||||||||||||||||||||||||||||||
|
Comment on lines
+22
to
+23
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 저는 localStorage에 데이터 업데이트 해주는 logic을 add, delete 함수 안에 포함했는데, 이렇게 useEffect를 사용하면 훨씬 직관적이고 편리할 것 같네요!
Comment on lines
+6
to
+23
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 지금은 logic이 별루 없는데, logic 복잡해지면 디버깅을 위해 view와 분리하여 다른 파일에서 작성해봐도 가독성에 좋을 것 같아요~~
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 확실히 view 와 controller 는 분리하는게 나을 것 같네요!! 피드백 감사합니다~!!! |
||||||||||||||||||||||||||||||||
| return ( | ||||||||||||||||||||||||||||||||
| <EachTodoWrapper> | ||||||||||||||||||||||||||||||||
| <CheckBox | ||||||||||||||||||||||||||||||||
| type="checkbox" | ||||||||||||||||||||||||||||||||
| checked={checkState} | ||||||||||||||||||||||||||||||||
| onChange={checkboxChanged} | ||||||||||||||||||||||||||||||||
| /> | ||||||||||||||||||||||||||||||||
| <TodoText $checked={todo.checked}> | ||||||||||||||||||||||||||||||||
| <span>{todo.todoText}</span> | ||||||||||||||||||||||||||||||||
| </TodoText> | ||||||||||||||||||||||||||||||||
| <DeleteBtn onClick={deleteTodo}>X</DeleteBtn> | ||||||||||||||||||||||||||||||||
| </EachTodoWrapper> | ||||||||||||||||||||||||||||||||
| ); | ||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| const EachTodoWrapper = styled.div` | ||||||||||||||||||||||||||||||||
| display: flex; | ||||||||||||||||||||||||||||||||
| align-items: center; | ||||||||||||||||||||||||||||||||
| margin-bottom: 3rem; | ||||||||||||||||||||||||||||||||
| `; | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| const CheckBox = styled.input` | ||||||||||||||||||||||||||||||||
| margin-right: 1.2rem; | ||||||||||||||||||||||||||||||||
| width: 3rem; | ||||||||||||||||||||||||||||||||
| height: 3rem; | ||||||||||||||||||||||||||||||||
| `; | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| const TodoText = styled.div` | ||||||||||||||||||||||||||||||||
| span { | ||||||||||||||||||||||||||||||||
| font-size: 6rem; | ||||||||||||||||||||||||||||||||
| font-family: "GangwonState"; | ||||||||||||||||||||||||||||||||
| text-decoration: ${(props) => (props.$checked ? "line-through" : null)}; | ||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. TodoText 컴포넌트에 대해서 스타일링을 props에 따라 다르게 하셨네요! 스타일 컴포넌트 활용을 잘 하시는 것 같습니다 ㅎㅎ |
||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||
| `; | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| const DeleteBtn = styled.div` | ||||||||||||||||||||||||||||||||
| background-color: transparent; | ||||||||||||||||||||||||||||||||
| display: flex; | ||||||||||||||||||||||||||||||||
| justify-content: center; | ||||||||||||||||||||||||||||||||
| align-items: center; | ||||||||||||||||||||||||||||||||
| margin-left: 1rem; | ||||||||||||||||||||||||||||||||
| border: none; | ||||||||||||||||||||||||||||||||
| font-size: 4rem; | ||||||||||||||||||||||||||||||||
| color: gray; | ||||||||||||||||||||||||||||||||
| `; | ||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
| export default React.memo(EachTodo); | ||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,29 @@ | ||
| import styled from "styled-components"; | ||
|
|
||
| export default function TodoCountBtn({ btnState, addClass, todoLists }) { | ||
| return ( | ||
| <BtnWrapper $bgColor={btnState.bgColor} $addClass={addClass}> | ||
| <span> | ||
| {btnState.text}: {btnState.getBtnNum(todoLists)} | ||
| </span> | ||
| </BtnWrapper> | ||
| ); | ||
| } | ||
|
|
||
| const BtnWrapper = styled.div` | ||
| width: 22rem; | ||
| height: 9rem; | ||
| padding: 2rem; | ||
| display: flex; | ||
| justify-content: center; | ||
| align-items: center; | ||
| border-radius: 1rem; | ||
|
Comment on lines
+14
to
+20
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. rem단위를 자유자재로 사용하시다니 너무 부러워요 |
||
| background-color: ${(props) => props.$bgColor}; | ||
| ${(props) => props.$addClass} | ||
| span { | ||
| font-size: 3.5rem; | ||
| font-weight: 500; | ||
| font-weight: 600; | ||
| font-family: "Giants-Inline"; | ||
| } | ||
| `; | ||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,11 @@ | ||||||||||||||||||||||||||||||||||
| export const getTotalTodos = (todoLists) => { | ||||||||||||||||||||||||||||||||||
| return todoLists.length; | ||||||||||||||||||||||||||||||||||
| }; | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| export const getCheckedTodos = (todoLists) => { | ||||||||||||||||||||||||||||||||||
| return todoLists.filter((todoList) => todoList.checked).length; | ||||||||||||||||||||||||||||||||||
| }; | ||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||
| export const getProceedingTodos = (todoLists) => { | ||||||||||||||||||||||||||||||||||
| return getTotalTodos(todoLists) - getCheckedTodos(todoLists); | ||||||||||||||||||||||||||||||||||
| }; | ||||||||||||||||||||||||||||||||||
|
Comment on lines
+1
to
+11
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 사람마다 다르지만 하나의 return 만 있을때에는 중괄호와 return 키워드를 생략할 수도 있습니다!
Suggested change
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 피드백 감사합니다😄 |
||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| export const getTodo = () => { | ||
| return JSON.parse(localStorage.getItem("todoList")) || []; | ||
| }; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| export const setTodo = (todoList) => { | ||
| localStorage.setItem("todoList", JSON.stringify(todoList)); | ||
| }; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,10 +1,19 @@ | ||
| import React from 'react'; | ||
| import ReactDOM from 'react-dom'; | ||
| import App from './App'; | ||
| import React from "react"; | ||
| import ReactDOM from "react-dom"; | ||
| import App from "./App"; | ||
| import { ThemeProvider } from "styled-components"; | ||
| import theme from "./styles/theme"; | ||
| import GlobalStyles from "./styles/GlobalStyle"; | ||
| import { BrowserRouter } from "react-router-dom"; | ||
|
|
||
| ReactDOM.render( | ||
| <React.StrictMode> | ||
| <App /> | ||
| <ThemeProvider theme={theme}> | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ThemeProvider로 스타일을 적용한 부분 저도 배워야 겠습니다..👍 |
||
| <GlobalStyles /> | ||
| <BrowserRouter> | ||
| <App /> | ||
| </BrowserRouter> | ||
| </ThemeProvider> | ||
| </React.StrictMode>, | ||
| document.getElementById('root') | ||
| ); | ||
| document.getElementById("root") | ||
| ); | ||
| Original file line number | Diff line number | Diff line change | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,151 @@ | ||||||||||
| import styled from "styled-components"; | ||||||||||
| import TodoCountBtn from "../components/TodoCountBtn"; | ||||||||||
| import { useEffect, useState } from "react"; | ||||||||||
| import { headerBtnState } from "../state/headerBtnState"; | ||||||||||
| import EachTodo from "../components/EachTodo"; | ||||||||||
| import { getTodo } from "../hooks/getTodo"; | ||||||||||
| import { setTodo } from "../hooks/setTodo"; | ||||||||||
|
|
||||||||||
| export default function Todo() { | ||||||||||
| const [todoText, setTodoText] = useState(""); | ||||||||||
| const [todoLists, setTodoLists] = useState(getTodo()); | ||||||||||
| const todoInputChanged = (e) => { | ||||||||||
| setTodoText(e.target.value); | ||||||||||
| }; | ||||||||||
| const enterPressed = (e) => { | ||||||||||
| if (e.key === "Enter") { | ||||||||||
| addTodoClicked(); | ||||||||||
| } | ||||||||||
| }; | ||||||||||
| const addTodoClicked = () => { | ||||||||||
| if (todoText.trim() === "") { | ||||||||||
| alert("todo를 입력하세요"); | ||||||||||
| setTodoText(""); | ||||||||||
| return; | ||||||||||
| } | ||||||||||
| setTodoLists((prev) => [ | ||||||||||
| ...prev, | ||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 저는 기존의 배열을 props 으로 받아 spread 연산자를 통해 상태를 업데이트 했었는데, 상태 업데이트 함수를 쓸 때, (prev) 를 매개변수를 받아 이전의 상태를 불러올 수 있었군요... 현민님께서 하신 방법이 더 실용적일 것 같습니다! |
||||||||||
| { todoText: todoText.trim(), checked: false }, | ||||||||||
| ]); | ||||||||||
| setTodoText(""); | ||||||||||
| }; | ||||||||||
| useEffect(() => { | ||||||||||
| setTodo(todoLists); | ||||||||||
| }, [todoLists]); | ||||||||||
| return ( | ||||||||||
| <TodoWrapper> | ||||||||||
| <TodoHeader> | ||||||||||
| <HeaderTitle> | ||||||||||
| <span>TO-DO LIST</span> | ||||||||||
| </HeaderTitle> | ||||||||||
| <HeaderBtnWrapper> | ||||||||||
| {headerBtnState.map((btnState) => ( | ||||||||||
| <TodoCountBtn | ||||||||||
| key={btnState.text} | ||||||||||
| btnState={btnState} | ||||||||||
| addClass="margin:0 1.5rem;" | ||||||||||
| todoLists={todoLists} | ||||||||||
| /> | ||||||||||
| ))} | ||||||||||
| </HeaderBtnWrapper> | ||||||||||
| </TodoHeader> | ||||||||||
| <TodoMainBoard> | ||||||||||
| <AddTodoWrapper> | ||||||||||
| <AddTodoInput | ||||||||||
| placeholder="입력하세요" | ||||||||||
| value={todoText} | ||||||||||
| onChange={todoInputChanged} | ||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. onChange 이벤트마다 state를 변경하게 하면 컴포넌트가 계속 리렌더링이 되는데, todo Input state와 관련이 없는 부분은 새로운 컴포넌트로 분리하는게 효율적일 것 같아요! 저는 react의 memo와 useCallback을 사용해서 렌더링 최적화를 구현했는데 한 번 시도해보면 좋을 것 같습니다~~
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 시간이 부족하여 분리를 못했는데 대균님처럼 memo와 useCallback 사용해서 꼭 분리해보도록 하겠습니다 감사합니다 ㅎㅎ |
||||||||||
| onKeyDown={enterPressed} | ||||||||||
| /> | ||||||||||
| <AddTodoBtn onClick={addTodoClicked}> | ||||||||||
| <span>+</span> | ||||||||||
| </AddTodoBtn> | ||||||||||
| </AddTodoWrapper> | ||||||||||
| <TodoListWrapper> | ||||||||||
| {todoLists.map((todo, index) => ( | ||||||||||
| <EachTodo | ||||||||||
| key={todo.todoText + index} | ||||||||||
| index={index} | ||||||||||
| todo={todo} | ||||||||||
| todoLists={todoLists} | ||||||||||
| setTodoLists={setTodoLists} | ||||||||||
| /> | ||||||||||
| ))} | ||||||||||
| </TodoListWrapper> | ||||||||||
| </TodoMainBoard> | ||||||||||
| </TodoWrapper> | ||||||||||
| ); | ||||||||||
| } | ||||||||||
|
Comment on lines
+10
to
+78
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Header, Input, ListView가 한 페이지에 있어서 리스트 관련한 동작을 할 때 Header와, Input 모두 렌더링이 되는 것 같아요 좀 더 컴포넌트 단위를 쪼개면 좋을 것 같습니다! 또한 이렇게 되면 Input을 입력할때마다 전체가 렌더링이 돼요
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 작업 후 추가적으로 분리 할 생각이였는데 시간상 그냥 제출하게 되었네요 ㅠ 담에는 꼭 분리하도록 하겠습니다!! |
||||||||||
|
|
||||||||||
| const TodoWrapper = styled.div` | ||||||||||
| padding-top: 6rem; | ||||||||||
| min-width: 370px; | ||||||||||
| min-height: 100vh; | ||||||||||
| background: linear-gradient(to right, #dddddd, #ffffff, #dddddd); | ||||||||||
| `; | ||||||||||
|
|
||||||||||
| const TodoHeader = styled.header` | ||||||||||
| display: flex; | ||||||||||
| flex-direction: column; | ||||||||||
| align-items: center; | ||||||||||
| position: relative; | ||||||||||
| padding: 5rem; | ||||||||||
| `; | ||||||||||
|
|
||||||||||
| const HeaderTitle = styled.header` | ||||||||||
| margin-bottom: 4rem; | ||||||||||
| span { | ||||||||||
| font-size: 10rem; | ||||||||||
| font-weight: 500; | ||||||||||
| font-weight: 600; | ||||||||||
| font-family: "Giants-Inline"; | ||||||||||
| } | ||||||||||
| `; | ||||||||||
|
|
||||||||||
| const HeaderBtnWrapper = styled.div` | ||||||||||
| display: flex; | ||||||||||
| align-items: center; | ||||||||||
| margin: 2rem 0; | ||||||||||
| `; | ||||||||||
|
|
||||||||||
| const TodoMainBoard = styled.div` | ||||||||||
| width: 100%; | ||||||||||
| padding: 5rem 0; | ||||||||||
| display: flex; | ||||||||||
| flex-direction: column; | ||||||||||
| align-items: center; | ||||||||||
| `; | ||||||||||
|
|
||||||||||
| const AddTodoWrapper = styled.div` | ||||||||||
| display: flex; | ||||||||||
| align-items: center; | ||||||||||
| margin-bottom: 5rem; | ||||||||||
| `; | ||||||||||
|
|
||||||||||
| const AddTodoInput = styled.input` | ||||||||||
| width: 60rem; | ||||||||||
| padding: 1rem; | ||||||||||
| margin-right: 2rem; | ||||||||||
| font-size: 3.5rem; | ||||||||||
| border: none; | ||||||||||
| border-bottom: 1px solid transparent; | ||||||||||
| border-image: linear-gradient(to left, white, black); | ||||||||||
| border-image-slice: 1; | ||||||||||
| background-color: transparent; | ||||||||||
| `; | ||||||||||
|
|
||||||||||
| const AddTodoBtn = styled.button` | ||||||||||
| width: 8rem; | ||||||||||
| height: 7rem; | ||||||||||
| padding: 1rem; | ||||||||||
|
Comment on lines
+138
to
+140
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 반응형을 고려하여 rem 단위로 작업하신 점이 되게 인상적입니다 😊 |
||||||||||
| display: flex; | ||||||||||
| justify-content: center; | ||||||||||
| align-items: center; | ||||||||||
| border: none; | ||||||||||
| background-color: transparent; | ||||||||||
| span { | ||||||||||
| font-size: 8rem; | ||||||||||
| } | ||||||||||
| `; | ||||||||||
|
|
||||||||||
| const TodoListWrapper = styled.div``; | ||||||||||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 영어를 길게 입력한 경우 자동 줄바꿈이 되지 않아
Suggested change
속성을 추가하는 건 어떨까요 ??
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 오 생각하지 못했네요 ㅎㅎ 감사합니다!! |
||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,24 @@ | ||
| import { | ||
| getCheckedTodos, | ||
| getProceedingTodos, | ||
| getTotalTodos, | ||
| } from "../hooks/calculateTodo"; | ||
| import theme from "../styles/theme"; | ||
|
|
||
| export const headerBtnState = [ | ||
| { | ||
| text: "할 일", | ||
| bgColor: `${theme.colors.allBtn}`, | ||
| getBtnNum: getTotalTodos, | ||
| }, | ||
| { | ||
| text: "진행 중", | ||
| bgColor: `${theme.colors.doingBtn}`, | ||
| getBtnNum: getProceedingTodos, | ||
| }, | ||
| { | ||
| text: "완료", | ||
| bgColor: `${theme.colors.doneBtn}`, | ||
| getBtnNum: getCheckedTodos, | ||
| }, | ||
| ]; |
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.
이런 디테일 너무 좋아요