일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- deploy
- 슬라이더
- HTTP
- 리액트배포
- dnd-kit
- 배너 슬라이더
- Github Pages
- 배포
- github
- react
- array
- 자바스크립트 배열
- 웹스토리지
- 배너
- IndexedDB
- js
- 웹사이트
- 렌더링
- 웹
- 비동기 함수
- React.js
- 자바스크립트
- vite
- javascript
- 배열
- 인덱스된 데이터베이스
- banner
- 리액트
- 슬라이드
- slide
Archives
- Today
- Total
Somedding
[Toy Projects] 'TODOoO' project (6) 본문
다음은 삭제 기능이다.
삭제 버튼을 누르면 삭제의 여부를 묻도록 했다.
// component/Category.js
<p onClick={()=>{
if(window.confirm("'" + todo[i].desc + "'을(를) 삭제하시겠습니까?")){
onDelete(todo[i].id);
}
}}>🗑</p>
onDelete는 App 컴포넌트로 부터 받은 props이며, onDelete를 통해 해당 key를 todo 객체에서 탐색하여 삭제할 수 있도록 했다.
// App.js
onDelete={(id)=>{
let changeTodo = Array.from(todo);
for(let i = 0; i < todo.length; i++){
if(changeTodo[i].id === id){
changeTodo.splice(i,1);
break;
}
}
setTodo(changeTodo);
}}
todo 객체를 changeTodo에 복제한 다음, 해당 id랑 같은 id를 탐색한 후, splice를 통해 삭제하고 todo 객체를 변경시켰다.
결과 화면
삭제 기능을 만들고 보니 오류가 있어서 고치게 됐다.
// App.js
onCreate={(data) => {
let _id = todo[todo.length - 1].id;
setTodo([...todo, {
id:_id + 1,
category: category[i],
desc: data
}]);
}}
onUpdate={(id, data)=>{
let changeTodo = Array.from(todo);
for(let i = 0; i < todo.length; i++){
if(changeTodo[i].id === id){
changeTodo[i].desc = data;
break;
}
}
setTodo(changeTodo);
}}
우선, onCreate에서 추가되는 todo 객체의 id값을 객체 내의 마지막 id값보다 1 큰 수로 설정하기 위해 length를 사용했지만, 삭제 기능으로 length와 마지막 id값이 달라질 수도 있기 때문이다.
그래서 마지막값의 id를 찾아서 1 증가한 값으로 추가시켰다.
두 번째로, onUpdate에서도 마찬가지로 length를 이용하여 값을 수정했지만, 역시 삭제 기능으로 lengh와 마지막 id값이 달라질 수도 있기 때문에 id 값으로 탐색한 다음 수정을 진행하였다.
전체 App.js
// App.js
import './App.css';
import Nav from './component/Nav';
import Category from './component/Category';
import { useEffect, useState } from 'react';
function App() {
const [todo, setTodo] = useState([{
id:0,
category:'일반',
desc:'할일1'
},{
id:1,
category:'일반',
desc:'할일2'
},{
id:2,
category:'카테고리2',
desc:'할일1'
}]);
const [category, setCategory] = useState(['일반','카테고리2']);
const [cateForm, setCateForm] = useState([]);
const [isOpen, setIsOpen] = useState('');
useEffect(()=>{
let _cateform = [];
for(let i = 0; i < category.length; i++){
let _todo = [];
for(let j = 0; j < todo.length; j++){
if(category[i] === todo[j].category){
_todo.push({id:todo[j].id, desc:todo[j].desc});
}
}
_cateform.push(
<Category
key={i}
category={category[i]}
todo={_todo}
onCreate={(data) => {
let _id = todo[todo.length - 1].id;
setTodo([...todo, {
id:_id + 1,
category: category[i],
desc: data
}]);
}}
onUpdate={(id, data)=>{
let changeTodo = Array.from(todo);
for(let i = 0; i < todo.length; i++){
if(changeTodo[i].id === id){
changeTodo[i].desc = data;
break;
}
}
setTodo(changeTodo);
}}
onDelete={(id)=>{
let changeTodo = Array.from(todo);
for(let i = 0; i < todo.length; i++){
if(changeTodo[i].id === id){
changeTodo.splice(i,1);
break;
}
}
setTodo(changeTodo);
}}
isOpen={isOpen}
setIsOpen={setIsOpen}
></Category>
);
}
setCateForm(_cateform);
},[category, todo, isOpen])
return (
<div className="app">
<Nav
category={category}
setCategory={setCategory}
></Nav>
{cateForm}
</div>
);
}
export default App;
전체 Category.js
// component/Category.js
import { useState, useEffect } from "react";
import Form from "./Form";
function Category(props) {
const { category, todo, onCreate, onUpdate, onDelete, isOpen, setIsOpen } =
props;
const [isAdd, setIsAdd] = useState(false);
const [todoForm, setTodoForm] = useState([]);
const [isUpdate, setIsUpdate] = useState(-1);
useEffect(() => {
if (isOpen !== "" && isOpen !== category && (isAdd || isUpdate !== -1)) {
setIsAdd(false);
setIsUpdate(-1);
}
}, [isOpen]);
useEffect(() => {
isAdd && setIsOpen(category);
isAdd && setIsUpdate(-1);
}, [isAdd]);
useEffect(() => {
isUpdate !== -1 && setIsAdd(false);
isUpdate !== -1 && setIsOpen(category);
}, [isUpdate]);
useEffect(() => {
let _form = [];
for (let i = 0; i < todo.length; i++) {
_form.push(
<div key={i}>
<p>{todo[i].desc}</p>
{isUpdate === i ? (
<p
onClick={() => {
setIsUpdate(-1);
}}
>
×
</p>
) : (
<p
onClick={() => {
setIsUpdate(i);
}}
>
✎
</p>
)}
<p
onClick={() => {
if (
window.confirm("'" + todo[i].desc + "'을(를) 삭제하시겠습니까?")
) {
onDelete(todo[i].id);
}
}}
>
🗑
</p>
{isUpdate === i ? (
<Form
type={2}
setForm={setIsUpdate}
onWrite={(data) => {
onUpdate(todo[i].id, data);
}}
data={todo[i].desc}
></Form>
) : null}
</div>
);
}
setTodoForm(_form);
}, [todo, isUpdate]);
return (
<div className="category">
<div></div>
<p>{category}</p>
<p
onClick={() => {
setIsAdd(!isAdd);
}}
>
{isAdd ? "×" : "+"}
</p>
<div>{todoForm}</div>
{isAdd ? (
<Form
type={1}
setForm={setIsAdd}
onWrite={(data) => {
onCreate(data);
}}
data={null}
></Form>
) : null}
</div>
);
}
export default Category;
글 내용 중, 잘못됐거나 더 알아야 하는 지식이 있다면 댓글로 남겨주시면 감사하겠습니다!
모두 좋은 하루 보내세요:)
'Toy Projects' 카테고리의 다른 글
[Toy Projects] 'TODOoO' project (8) (0) | 2023.03.13 |
---|---|
[Toy Projects] 'TODOoO' project (7) (0) | 2023.03.09 |
[Toy Projects] 'TODOoO' project (5) (0) | 2023.03.07 |
[Toy Projects] 'TODOoO' project (4) (0) | 2023.03.06 |
[Toy Projects] 'TODOoO' project (3) (0) | 2023.03.03 |
Comments