일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- autosize
- 호이스팅
- RTK Query
- 무한 스크롤
- 반공변성
- 투포인터
- 공변성
- CI/CD
- 리터럴 타입
- tailwind
- async/await
- 인터섹션
- CORS
- TS
- Promise
- React
- SSR
- 태그된 유니온
- recoil
- 타입 좁히기
- ESlint
- webpack
- Jest
- Cypress
- useAppDispatch
- map
- 이분 검색
- dfs
- app router
- 결정 알고리즘
Archives
- Today
- Total
짧은코딩
EDIT 구현 본문
반응형
App.js
<Route path="/edit/:id" element={<Edit />} />
우선 App.js에서 경로를 수정한다. path="/edit/:id"로 해야 /1이 붙어도 잘 나온다.
Edit.js
import { useContext, useEffect, useState } from "react";
import { useNavigate, useParams } from "react-router-dom";
import { DiaryStateContext } from "../App";
import DiaryEditor from "../components/DiaryEditor";
const Edit = () => {
const navigate = useNavigate();
// id 불러오기 위한 useParanms
const { id } = useParams();
// targetDiary를 저장할 state
const [originData, setOriginData] = useState();
// useContext를 이용해서 일기를 받아온다.
const diaryList = useContext(DiaryStateContext);
// id와 일치하는 값을 Edit 컴포넌트가 마운트됐을 때 사용한다.
// id나 diaryList가 변할 때, 꺼내온다.
useEffect(() => {
if (diaryList.length >= 1) {
const targetDiary = diaryList.find(
(it) => parseInt(it.id) === parseInt(id)
);
if (targetDiary) {
// targetDiary가 존재할 때
setOriginData(targetDiary);
} else {
// 만약 그 id 번호가 없으면 저장하지 않고 홈으로 보낸다.
navigate("/", { replace: true });
}
}
}, [id, diaryList]);
return (
<div>
{/* originData가 있으면 DiaryEditor 나오도록한다. */}
{/* isEdit을 true로 만들어 수정으로 변환 */}
{originData && <DiaryEditor isEdit={true} originData={originData} />}
</div>
);
};
export default Edit;
id에 따라서 일기 정보를 불러오고 수정 상태로 변환해주고 지금 수정 할 일기의 정보를 가진 OriginData를 보내준다.
DiaryEditor.js
-props 받기
// isEdit, originData는 Edit.js에서 왔다.
const DiaryEditor = ({ isEdit, originData }) => {
isEdit, originData를 받아준다.
-날짜, 감정, 내용
// Edit때 사용
useEffect(() => {
if (isEdit) {
// 변경되는 일기에 맞게 날짜, 감정, 내용을 바꿔준다.
setDate(getStringDate(new Date(parseInt(originData.date))));
setEmotion(originData.emotion);
setContent(originData.content);
}
}, [isEdit, originData]);
받아 온 데이터에 맞게 날짜, 감정, 내용을 바꿔준다. isEdit, originData가 바뀔 때 달라지도록 했다.
-헤더
headText={isEdit ? "일기 수정하기" : "새 일기쓰기"}
헤더 부분의 글자도 isEdit에 따라 다르게 나오도록 표시했다.
-작성 완료 버튼
const { onCreate, onEdit } = useContext(DiaryDispatchContext);
작성 완료 버튼은 수정을 완료하는 거니까 onEdit도 받아와준다.
const handleSubmit = () => {
if (content.length < 1) {
contentRef.current.focus();
return;
}
// 일기 생성 or 일기 수정
if (
window.confirm(
isEdit ? "일기를 수정하시겠습니까?" : "새로운 일기를 작성하시겠습니까?"
)
) {
if (!isEdit) {
onCreate(date, content, emotion);
} else {
onEdit(originData.id, date, content, emotion);
}
}
// 일기 데이터 저장하면 홈으로 돌아간다.
// 그래서 일기 작성하는 페이지를 뒤로가게해서 못도록하게 한다.
navigate("/", { replace: true });
};
handleSubmit에 가서 일기 생성과 수정을 isEdit에 따라 각각 다르게 나오도록 수정해준다.
이렇게 수정이 가능해진다.
반응형
'인프런, 유데미 > 한입 크기로 잘라 먹는 리액트' 카테고리의 다른 글
흔한 버그 수정하기 (0) | 2022.06.24 |
---|---|
DAIRY 구현 (0) | 2022.06.23 |
일기 쓰기 구현 (0) | 2022.06.22 |
HOME 구현하기 (0) | 2022.06.21 |
프로젝트 기초 공사 2 (0) | 2022.06.20 |
Comments