arr.filter(callback(element[, index[, array]])[, thisArg])
테스트를 통과한 요소로 이루어진 새로운 배열. 어떤 요소도 테스트를 통과하지 못했으면 빈 배열을 반환합니다.
일기리스트를 추가하는것을 했는데, 이제 일기를 삭제하고싶다.
일기리스트에 삭제버튼을 생성하고 누르면 리스트(배열)이 삭제되는 방법을 배우겠다.
const DiaryItem = ({onRemove, author, content, created_date, emotion, id}) => {
return <div className="DiaryItem">
<div className="info">
<span>
작 성 자 : {author} | 감 정 점 수 : {emotion}
</span>
<br />
<span className="date">
시 간 : {new Date(created_date).toLocaleString()}
</span>
<div className="content">
내 용 : {content}
</div>
//삭제버튼
<button onClick={() => {
if (window.confirm(`${id+1}번째 일기를 삭제하시겠습니까?`)){
onRemove(id);
}
}}>삭 제 하 기
</button>
</div>
</div>
};
export default DiaryItem;
1)const DiaryItem = ({onRemove, author, content, created_date, emotion, id})
= App.js부모컴퍼런트로부터 받은 onRemove props를 추가해준다.
2) <button onClick={() => {
if (window.confirm(
${id+1}번째 일기를 삭제하시겠습니까?)){
onRemove(id);
}
}}>삭 제 하 기
</button>
= 삭제버튼을 생성하고, onClick이벤트로 confirm창을 띄워 확인버튼을 누를 경우 onRemove함수에 해당id를 전달하여 삭제를 실행한다.
(*이때, confirm창에 있는것은 사용자가 볼 화면으로, 0번째보단 1번째로 인식해서 id+1로 보여주는것이 맞다고 생각한다.)
import { useRef, useState } from 'react';
import './App.css';
import DiaryEditor from "./DiaryEditor";
import DiaryList from "./DiaryList"
const 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) => {
const newDiaryList = data.filter((it) => it.id !== targetId);
setData(newDiaryList);
}
return (
<div className="App">
<DiaryEditor onCreate={onCreate} />
<DiaryList onRemove={onRemove} diaryList={data} />
</div>
);
}
export default App;
1) const onRemove = (targetId) => {
const newDiaryList = data.filter((it) => it.id !== targetId);
setData(newDiaryList);
}
= App.js부모컴퍼넌트에서 onRemove함수를 정의한다.
targetId는 DiaryItem.js자식컴퍼넌트에서 함수수행 id를 전달받는다
그후 newDiaryList를 targetId를 제외하고 필터하여 재정의하고 setData상태변화함수로 newDiaryList를 전달한다.
2) <DiaryList onRemove={onRemove} diaryList={data} />
=DiaryItem삭제버튼이 App의 onDelete함수를 호출할 수 있어야하므로 App부모가 DiaryItem자식에게 props로 onRemove함수를 내려줌
import DiaryItem from "./DiaryItem.js"
const DiaryList=({onRemove, diaryList}) => {
return (
<div className="DiaryList">
<h2>일기리스트</h2>
<h4>{diaryList.length}개의 일기가 있습니다.</h4>
<div>
{diaryList.map((it) => (
<DiaryItem key={it.id} {...it} onRemove={onRemove}/>
))}
</div>
</div>
);
};
export default DiaryList;
1)const DiaryList=({onRemove, diaryList})
= App.js부모로부터 받은 onRemove props를 사용할것이므로 추가한다.
2)<DiaryItem key = {it.id} {...it} onRemove={onRemove}/>
= App부모가 DiaryList자식에게도 props로 onRemove함수를 내려줌
(➡️ DiaryList는 onRemove를 사용하지는 않지만 내려줘야한다. 이를 props drilling이라고한다.)
(made.hyun👩🏻💻)
삭제하기 버튼이 뜬 화면
두번째 일기에 삭제하기 버튼을 클릭한 화면
두번째 일기가 삭제된 화면