홈 화면에서 다이얼로그를 클릭한 후 북마크 버튼을 클릭하면 북마크 페이지에서 해당 데이터를 조회하도록 localstorage를 활용한 로직을 구현했다.
북마크 페이지에서 선택모드를 통해 여러 항목을 선택하고 삭제할 수 있는 기능을 구현하는 과정을 기록하려고 한다
function index() {
const [data, setData] = useState([]); // 로컬 스토리지에서 가져온 데이터를 저장
const getData = () => {
const getLocalStorage = JSON.parse(localStorage.getItem("bookmark"));
// 데이터가 있거나 null이 아니면 조회하기
if (getLocalStorage || getLocalStorage !== null) setData(getLocalStorage);
else setData([]); // 기본이 빈 배열이지만 안정성을 위해서 작성
};
useEffect(() => {
getData();
}, []);
}
index.tsx
function index() {
const [selectMode, setSelectMode] = useState(false); // 선택 모드 상태
const [selectedItems, setSelectedItems] = useState([]); // 선택된 카드 ID 저장
const handleSelectMode = () => setSelectMode(true); // 선택하기
const CancelSelectMode = () => {
// 선택모드 취소
setSelectMode(false);
setSelectedItems([]); // 선택된 항목들을 해제
};
}
index.tsx
function index() {
const handleSelectItems = (id: string) => {
setSelectedItems((prev) => {
if (prev.includes(id)) {
// 이미 항목 id가 있을 때
return prev.filter((itemId) => itemId !== id); // 같을 때는 배열에서 제거하고 반환
} else {
return [...prev, id];
}
});
};
return(
<main className={styles.page__contents}>
{data.map((item: CardDTO) => {
return (
<Card
prop={item}
key={item.id}
selectMode={selectMode}
isSelected={selectedItems.includes(item.id)} // 선택 상태 여부를 확인(selectedItem에 해당 id를 포함하고 있는지)
onSelect={() => {
handleSelectItems(item.id);
}}
/>
);
})}
</main>
)
}
Card.tsx
interface Props {
prop: CardDTO;
selectMode: boolean; // 선택모드
isSelected: boolean; // 선택 여부 확인
onSelect: () => void; // id를 매개변수로 받아 처리하고 있음
}
function Card({ prop, selectMode, isSelected, onSelect }: Props) {
return (
<div className={styles.card}>
{selectMode && (
<input
type="checkbox"
defaultChecked={isSelected}
onChange={onSelect}
/>
)}
// 중략
</div>
)
}
index.tsx
// 선택한 항목 삭제 후 선택모드 종료
const deleteSelectedItems = () => {
const updatedData = data.filter((item) => !selectedItems.includes(item.id)); // 선택된 항목을 제외한 항목만 남김
setData(updatedData);
localStorage.setItem("bookmark", JSON.stringify(updatedData));
CancelSelectMode(); // 삭제 후 선택 모드 종료
};