Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 인증처리
- 빌드 및 배포
- ui탬플릿
- 로그인
- 마이페이지
- Typesciprt
- register
- 로그인 로직
- 관리자페이지
- 배포
- stock option
- 밸류즈 홈페이지
- MRC
- react
- 달력 라이브러리
- mypage
- Token
- 이미지 업로드
- 스프링시큐리티
- jsonwebtoken
- RCPS
- 캘린더 라이브러리
- 파생상품평가
- 밸류즈
- Update
- Ajax
- Styled Components
- 회원가입로직
- userManagement
- 공통메서드
Archives
- Today
- Total
I T H
[React_Basic 9] TODO 리스트 만들기 8 - localStorage(데이터저장) 본문
보통의 웹 프로젝트에서 프론트의 ui 작업과 이벤트 처리작업이 끝나면 axios를 사용해서 백앤드의 Spring or Node.js등을 이용해서 DB와 연결시키면 된다.
이번챕터는 간단하게 locaStorage를 사용해서 페이지 새로고침(refresh)시 데이터가 없어지지 않고 유지되도록만 해보겠다.
- 아래와 같이 todoData가 변경되는 부분들 아래에 다 넣어준다.
localStorage.setItem("todoData", JSON.stringify(newTodoData));
[App.js]
import React, { useCallback } from "react";
import "./App.css";
import { useState } from "react";
import Lists from "./components/Lists";
import Form from "./components/Form";
export default function App() {
console.log("/App Component");
const [todoData, setTodoData] = useState([]);
const [value, setValue] = useState("");
const handleClick = useCallback(
(id) => {
let newTodoData = todoData.filter((data) => data.id !== id); //클릭하지 않은 key값 데이터만 뜨게 됨.
console.log("newTodoData", newTodoData);
setTodoData(newTodoData);
localStorage.setItem("todoData", JSON.stringify(newTodoData));
},
[todoData]
);
const handleSubmit = (e) => {
//form 안에 input을 전송할때 페이지 리로드 되는 걸 막아줌
e.preventDefault();
//새로운 할일 데이터
let newTodo = {
id: Date.now(),
title: value,
completed: false,
};
//원래 있던 할 일에 새로운 할일 더해주기
setTodoData((prev) => [...prev, newTodo]);
localStorage.setItem("todoData", JSON.stringify([...todoData, newTodo]));
setValue("");
};
const handleRemoveClick = () => {
setTodoData([]);
localStorage.setItem("todoData", JSON.stringify([]));
};
return (
<div className="flex items-center justify-center w-screen h-screen bg-blue-100">
<div className="w-full p-6 m-4 bg-white rounded shadow lg:w-3/4 lg:max-w-lg">
<div className="flex justify-between mb-3">
<h1>Today Plan</h1>
<button onClick={handleRemoveClick}>DeleteList</button>
</div>
<Lists
handleClick={handleClick}
todoData={todoData}
setTodoData={setTodoData}
/>
<Form handleSubmit={handleSubmit} value={value} setValue={setValue} />
</div>
</div>
);
}
[Lists.js]
import React from "react";
import { DragDropContext, Draggable, Droppable } from "react-beautiful-dnd";
import List from "./List";
const Lists = React.memo(({ todoData, setTodoData, handleClick }) => {
console.log("Lists component");
const handleEnd = (result) => {
console.log("result", result);
if (!result.destination) return;
const newTodoData = todoData;
//1. 변경시키는 아이템을 배열에서 지워줌.
//2. return 값으로 지워진 아이템을 잡아줌.
const [reorderedItem] = newTodoData.splice(result.source.index, 1);
//원하는 자리에 reorderedItem을 insert 해줍니다.
newTodoData.splice(result.destination.index, 0, reorderedItem);
setTodoData(newTodoData);
localStorage.setItem("todoData", JSON.stringify(newTodoData));
};
return (
<div>
<DragDropContext onDragEnd={handleEnd}>
<Droppable droppableId="todo">
{(provided) => (
<div {...provided.droppableProps} ref={provided.innerRef}>
{todoData.map((data, index) => (
<Draggable
key={data.id}
draggableId={data.id.toString()}
index={index}
>
{(provided, snapshot) => (
<List
handleClick={handleClick}
key={data.id}
id={data.id}
title={data.title}
completeted={data.completeted}
todoData={todoData}
setTodoData={setTodoData}
provided={provided}
snapshot={snapshot}
/>
)}
</Draggable>
))}
{provided.placeholder}
</div>
)}
</Droppable>
</DragDropContext>
</div>
);
});
export default Lists;
[List.js]
import React, { useState } from "react";
const List = React.memo(
({
id,
title,
completed,
todoData,
setTodoData,
provided,
snapshot,
handleClick,
}) => {
//console.log("List component");
const [isEditing, setIsEditing] = useState(false);
const [updateTitle, setUpdateTitle] = useState(title);
const handleCompleteChange = (id) => {
let newTodoData = todoData.map((data) => {
if (data.id === id) {
data.completed = !data.completed;
}
return data;
});
setTodoData(newTodoData);
localStorage.setItem("todoData", JSON.stringify(newTodoData));
};
const handleEditChange = (event) => {
setUpdateTitle(event.target.value);
};
const handleSubmit = (event) => {
event.preventDefault();
let newTodoData = todoData.map((data) => {
if (data.id === id) {
data.title = updateTitle;
}
return data;
});
setTodoData(newTodoData);
localStorage.setItem("todoData", JSON.stringify(newTodoData));
setIsEditing(false);
};
if (isEditing) {
return (
<div
className={`flex items-center justify-between w-full px-4 py-1 my-2 bg-gray-100 text-gray-600 border rounded`}
>
<div className="items-center">
<form onSubmit={handleSubmit}>
<input
value={updateTitle}
onChange={handleEditChange}
className="w-full px-3 py-2 mr-4 text-gray-500 rounded"
/>
</form>
</div>
<div className="items-center">
<button
className="px-4 py-2 float-right"
onClick={() => setIsEditing(false)}
>
X
</button>
<button
className="px-4 py-2 float-right"
type="submit"
onClick={handleSubmit}
>
save
</button>
</div>
</div>
);
} else {
return (
<div
key={id}
{...provided.draggableProps}
ref={provided.innerRef}
{...provided.dragHandleProps}
className={`${
snapshot.isDragging ? "bg-gray-400" : "bg-gray-100"
} flex items-center justify-between w-full px-4 py-1 my-2 text-gray-600 bg-gray-100 border rounded`}
>
<div className="items-center">
<input
type="checkbox"
defaultChecked={false}
onChange={() => handleCompleteChange(id)}
/>
<span className={completed ? "line-through" : undefined}>
{title}
</span>
</div>
<div className="items-center">
<button
className="px-4 py-2 float-right"
onClick={() => handleClick(id)}
>
X
</button>
<button
className="px-4 py-2 float-right"
onClick={() => setIsEditing(true)}
>
UPDATE
</button>
</div>
</div>
);
}
}
);
export default List;
- localStorage에 저장된 데이터 불러오기
[App.js]에 아래 코드를 넣어주고, useState에 lccalStorage에 있는 데이터를 넣은 변수를 넣어준다.
const initialTodoData = localStorage.getItem("todoData")
? JSON.parse(localStorage.getItem("todoData"))
: [];
export default function App() {
console.log("/App Component");
const [todoData, setTodoData] = useState(initialTodoData);
const [value, setValue] = useState("");
[결과화면]
- 새로 고침(refresh)를 해도 데이터를 잘 불러온다.
'React Basic' 카테고리의 다른 글
[ React ] useState에서 배열의 값이 제대로 전달 안되는 경우 (0) | 2024.02.14 |
---|---|
[ React ] .env 사용하기 (1) | 2024.01.29 |
[React_Basic 8] TODO 리스트 만들기 7 - 삭제, 수정 (0) | 2024.01.25 |
[React_Basic 7] TODO 리스트 만들기 6 - useCallback(함수최적화) (0) | 2024.01.25 |
[React_Basic 6] TODO 리스트 만들기 5 - React.memo(렌더링최적화) (0) | 2024.01.25 |