App.js
삭제 버튼 누른 곳에 컴포넌트에서 대상 id를 인자로 담아 onDelete 함수를 호출한 후 filter를 통해 해당 targetId가 아닌 녀석들을 배열로 가져와 그 객체 배열을 다시 setData에 설정하면 삭제가 된다.
import { useRef, useState } from 'react';
import './App.css';
import DiaryEditor from './DiaryEditor';
import DiaryList from './DiaryList';
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
}
console.log("newItem : ", newItem);
dataId.current += 1;
setData([newItem, ...data,]) //원래 데이터 를 가져오고 새로운 item은 최상단에 나오도록 함
}
const onDelete = (targetId)=>{
console.log(`${targetId}가 삭제되었습니다.`);
// filter 이용해서 삭제할 Id에 대한 일기 빼고 해당 객체 리스트 가져옴
const newDiaryList = data.filter((it) => it.id !== targetId);
setData(newDiaryList);
}
return (
<div className="App">
<DiaryEditor onCreate={onCreate}/>
<DiaryList onDelete={onDelete} diaryList={data}/>
</div>
);
}
export default App;
DiaryList.js
드릴링 방식으로 최상단 루트 부모에서 부터 차례로 연결해서 보내는 것
import DiaryItem from "./DiaryItem";
const DiaryList = ({ onDelete, diaryList }) => {
return (
<div className="DiaryList">
<h2>일기 리스트</h2>
<h4>{diaryList.length}개의 일기가 있습니다.</h4>
<div>
{diaryList.map((it, idx) => (
<DiaryItem key={it.id} {...it} onDelete={onDelete}/>
))}
</div>
</div>
);
};
DiaryList.defaultProps = {
diaryList: [],
}
export default DiaryList;
DiaryItem.js
const DiaryItem = ({ onDelete, author, content, created_date, emotion, id }) => {
const handleRemove = ()=>{
if(window.confirm(`${id}번째 일기를 정말 삭제하시겠습니까?`)){
onDelete(id);
}
}
return <div className="DiaryItem">
<div className="info">
<span>
작성자 : {author} | 감정점수 : {emotion}
</span>
<br />
<span className="date">{new Date(created_date).toLocaleDateString()}</span>
</div>
<div className="content">{content}</div>
<button onClick={handleRemove}>삭제하기</button>
</div>
};
export default DiaryItem;
