From a2310a05930d846d296b4a3aa7796eaf832fa62b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=8B=A0=EC=9E=AC=ED=9B=88?= Date: Sat, 13 May 2023 01:11:47 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=EC=A0=9C=EA=B1=B0=20?= =?UTF-8?q?=EB=B0=8F=20=EC=99=84=EB=A3=8C=20=EB=B2=84=ED=8A=BC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ToDoItem.js | 224 ++++++++++++++++++------------------- 1 file changed, 109 insertions(+), 115 deletions(-) diff --git a/src/components/ToDoItem.js b/src/components/ToDoItem.js index 3f9fb68..14407f4 100644 --- a/src/components/ToDoItem.js +++ b/src/components/ToDoItem.js @@ -1,138 +1,132 @@ -import React, { useEffect, useRef, useState } from 'react'; -import PropTypes from 'prop-types'; +import React, { useEffect, useRef, useState } from "react"; +import PropTypes from "prop-types"; const ToDoItem = ({ todoItem, todoList, setTodoList }) => { - const [edited, setEdited] = useState(false); - const [newText, setNewTest] = useState(todoItem.text); + const [edited, setEdited] = useState(false); + const [newText, setNewText] = useState(todoItem.text); - const editInputRef = useRef(null); + const editInputRef = useRef(null); - useEffect(() => { - // edit 모드일때 포커싱을 한다. - if (edited) { - editInputRef.current.focus(); - } - }, [edited]); + useEffect(() => { + // edit 모드일때 포커싱을 한다. + if (edited) { + editInputRef.current.focus(); + } + }, [edited]); - const onChangeCheckbox = () => { - const nextTodoList = todoList.map((item) => ({ - ...item, - // id 값이 같은 항목의 checked 값을 Toggle 함 - checked: item.id === todoItem.id ? !item.checked : item.checked, - })); - - setTodoList(nextTodoList); - }; + const updateTodoList = (update) => { + setTodoList( + todoList.map((item) => + item.id === todoItem.id ? { ...item, ...update(item) } : item + ) + ); + }; - const onClickEditButton = () => { - setEdited(true); - }; + const onChangeCheckbox = () => { + updateTodoList((item) => ({ checked: !item.checked })); + }; - const onChangeEditInput = (e) => { - setNewTest(e.target.value); - }; + const onClickEditButton = () => { + setEdited(true); + }; - const onClickSubmitButton = (e) => { - if (e.key === 'Enter') { - const nextTodoList = todoList.map((item) => ({ - ...item, - text: item.id === todoItem.id ? newText : item.text, // 새로운 아이템 내용을 넣어줌 - })); - setTodoList(nextTodoList); + const onChangeEditInput = (e) => { + setNewText(e.target.value); + }; - setEdited(false); - } - }; + const onClickSubmitButton = (e) => { + if (e.type === "keypress" && e.key !== "Enter") { + return; + } - const onClickDeleteButton = () => { - if (window.confirm('정말로 지우실건가요?')) { - const nextTodoList = todoList.map((item) => ({ - ...item, - deleted: item.id === todoItem.id ? true : item.deleted, - })); + updateTodoList(() => ({ text: newText })); + setEdited(false); + }; - setTodoList(nextTodoList); - } - }; + const onClickDeleteButton = () => { + if (window.confirm("정말로 지우실건가요?")) { + updateTodoList(() => ({ deleted: true })); + } + }; - return ( -
  • - {/* 아이템 완료 체크 / 체크 해제를 위한 체크박스 */} - - { - // 아이템 내용 - edited ? ( - - ) : ( - + return ( +
  • + {/* 아이템 완료 체크 / 체크 해제를 위한 체크박스 */} + + { + // 아이템 내용 + edited ? ( + + ) : ( + {todoItem.text} - ) - } - { - // 수정 버튼 - // 완료한 일인 경우에는 null을 반환하여 보이지 않도록 함 - !todoItem.checked ? ( - edited ? ( - - ) : ( - - ) - ) : null - } - - {/* 삭제 버튼 */} + ) + } + { + // 수정 버튼 + // 완료한 일인 경우에는 null을 반환하여 보이지 않도록 함 + !todoItem.checked ? ( + edited ? ( -
  • - ); + ) : ( + + ) + ) : null + } + + {/* 삭제 버튼 */} + + + ); }; ToDoItem.propTypes = { - todoItem: PropTypes.shape({ - id: PropTypes.number, - text: PropTypes.string.isRequired, - }), - todoList: PropTypes.arrayOf( - PropTypes.shape({ - id: PropTypes.number.isRequired, - text: PropTypes.string.isRequired, - }) - ), - setTodoList: PropTypes.func.isRequired, + todoItem: PropTypes.shape({ + id: PropTypes.number, + text: PropTypes.string.isRequired, + }), + todoList: PropTypes.arrayOf( + PropTypes.shape({ + id: PropTypes.number.isRequired, + text: PropTypes.string.isRequired, + }) + ), + setTodoList: PropTypes.func.isRequired, }; export default ToDoItem;