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;

Untitled