728x90
1. onDelete > onRemove로 변수명 변경
2. DiaryItem.js에 수정하기 버튼 추가
DiaryItem.js
- 수정하기 버튼 추가
- 삭제하기 버튼 onClick 함수를 handleRemove로 빼서 정리
- state 생성
- 토글함수 생성 : isEdit이 true면 수정중이라고 간주 > content부분에 수정폼 띄우기
- 토글 상태(T/F)에 따른 버튼 기능 수정
- 수정 취소 후 다시 수정클릭 시 내용 원본 복구
- 수정완료 후 기능 추가
import { useRef, useState } from "react";
const DiaryItem = ({
author,
content,
emotion,
created_date,
id,
onRemove,
onEdit,
}) => {
const [isEdit, setIsEdit] = useState(false);
const togleIsEdit = () => setIsEdit(!isEdit);
const [localContent, setLocalContent] = useState(content);
const localContentInput = useRef();
const handleRemove = () => {
if (window.confirm(`${id}번째 일기를 삭제하시겠습니까?`)) {
onRemove(id);
}
};
const handleQuitEdit = () => {
setIsEdit(false);
setLocalContent(content);
};
const handleEdit = () => {
if (localContent.length < 5) {
localContentInput.current.focus();
return;
}
if (window.confirm(`${id}번째 일기를 수정하시겠습니까?`)) {
onEdit(id, localContent);
togleIsEdit();
}
};
return (
<div className="DiaryItem">
<div className="info">
<span>
작성자 : {author} | 감정점수 : {emotion}
</span>
<br />
<span className="date">{new Date(created_date).toLocaleString()}</span>
</div>
<div className="content">
{isEdit ? (
<>
<textarea
ref={localContentInput}
value={localContent}
onChange={(e) => setLocalContent(e.target.value)}
/>
</>
) : (
<>{content}</>
)}
</div>
{isEdit ? (
<>
<button onClick={handleQuitEdit}>수정 취소</button>
<button onClick={handleEdit}>수정 완료</button>
</>
) : (
<>
<button onClick={handleRemove}>삭제하기</button>
<button onClick={togleIsEdit}>수정하기</button>
</>
)}
</div>
);
};
export default DiaryItem;
App.js
- 수정하기 기능 추가 onEdit
import { useState, useRef } from "react";
import "./App.css";
import DiaryEditor from "./DiaryEditor";
import DiaryList from "./DiaryList";
// const dummyList = [...
function App() {
const [data, setData] = useState([]);
const dataId = useRef(0);
const onCreate = (author, content, emotion) => {
const created_date = new Date().getTime();
const newItem = {
author,
content,
emotion,
created_date,
id: dataId.current,
};
dataId.current += 1;
setData([newItem, ...data]);
};
const onRemove = (targetId) => {
console.log(`${targetId}가 삭제되었습니다.`);
const newDiaryList = data.filter((it) => it.id !== targetId);
setData(newDiaryList);
};
const onEdit = (targetId, newContent) => {
setData(
data.map((it) =>
it.id === targetId ? { ...it, content: newContent } : it
)
);
};
return (
<div className="App">
<DiaryEditor onCreate={onCreate} />
<DiaryList onRemove={onRemove} diaryList={data} onEdit={onEdit} />
</div>
);
}
export default App;
DiaryList.js
- onEdit 함수 props로 전달
import DiaryItem from "./DiaryItem";
const DiaryList = ({ diaryList, onRemove, onEdit }) => {
return (
<div className="DiaryList">
<div>{diaryList.length}개의 일기가 있습니다.</div>
<div>
{diaryList.map((it) => (
<DiaryItem key={it.id} {...it} onRemove={onRemove} onEdit={onEdit} />
))}
</div>
</div>
);
};
DiaryList.defaultProps = {
diaryList: [],
};
export default DiaryList;
728x90
'🤯TIL > React' 카테고리의 다른 글
[한입 크기로 잘라 먹는 리액트] React에서 API 호출하기 (0) | 2023.11.19 |
---|---|
[한입 크기로 잘라 먹는 리액트] React Lifecycle 제어하기 - useEffect (1) | 2023.11.19 |
[한입 크기로 잘라 먹는 리액트] React에서 배열 사용하기 3 - 데이터 삭제하기 (0) | 2023.11.19 |
[한입 크기로 잘라 먹는 리액트] React에서 배열 사용하기 2 - 데이터 추가하기 (0) | 2023.11.19 |
[한입 크기로 잘라 먹는 리액트] React에서 배열 사용하기 1 - 리스트 렌더링 (조회) (2) | 2023.11.19 |