簡體   English   中英

如何從本地存儲中刪除書簽元素

[英]How to remove bookmarked element from local storage

我正在制作一個用於為字符添加書簽的應用程序。 我必須將書簽字符存儲在本地存儲中,因此當我刷新頁面時,我可以看到我的書簽元素。

我的元素已正確保存到本地存儲中,但是當我刷新頁面時,書簽圖標的 state 未保存(盡管元素仍在本地存儲中,但它被放回未填充的圖標上)

第二個問題是我不知道如何實現從本地存儲中刪除書簽元素 我想取消標記特定元素並從本地存儲中刪除該元素。 您可以在我的 handleBookmarking function 中看到我是如何添加書簽的,但我不知道如何使用雙向 function 來添加書簽和取消書簽。 有什么想法嗎?

這是代碼:

CharactersList.js

import React, { useState } from "react";
import "./CharactersList.css";
import { RiBookmarkLine } from "react-icons/ri";
import { RiBookmarkFill } from "react-icons/ri";

const CharactersList = (props) => {
  const [isLiked, setIsLiked] = useState([]);
  const [favourites, setFavourites] = useState([]);

  const saveToLocalStorage = (data) => {
    localStorage.setItem("react-bookmarked-characters", JSON.stringify(data));
  };

  const handleBookmarking = (character) => {
    if (isLiked.includes(character.id)) {
      const newIsLiked = [...isLiked];
      setIsLiked(newIsLiked);
    } else {
      setIsLiked([...isLiked, character.id]);
      const newBookmarkedList = [...favourites, character];
      setFavourites(newBookmarkedList);
      saveToLocalStorage(newBookmarkedList);
      
    }
  };

  const Bookmarked = ({ id }) => {
    return isLiked.includes(id) ? <RiBookmarkFill /> : <RiBookmarkLine />;
  };
  
  return (
    <>
      {props.characters.map((character, index) => (
        <div className="card-container" key={index}>
          <img
            src={`${character.thumbnail.path}/standard_fantastic.${character.thumbnail.extension}`}
            alt="character"
            className="image"
          />
          <div className="info-container">
            <p className="name">{character.name}</p>
            <div
              className="icon"
              onClick={() => {
                handleBookmarking(character);
              }}
            >
              <Bookmarked id={character.id} />
            </div>
          </div>
        </div>
      ))}
    </>
  );
};

export default CharactersList;

App.js所以在 app.js 中我調用了兩個字符列表,一個是當搜索輸入為空時(顯示所有書簽元素),第二個是在搜索中(顯示所有元素)。

const App = () => {
  const [characters, setCharacters] = useState([]);
  const [search, setSearch] = useState("");
  const [favourites, setFavourites] = useState([]);
  const [currentPage, setCurrentPage] = useState(1);
  const [characterPerPage] = useState(20);

  const getCharactersRequest = async () => {
    const url = `https://gateway.marvel.com/v1/public/characters?nameStartsWith=${search}&ts=1&apikey=&hash=`; 
    const response = await fetch(url);
    const responseJSON = await response.json();

    if (responseJSON.data) {
      setCharacters(responseJSON.data.results);
    }
  };

  useEffect(() => {
    getCharactersRequest(search);
  }, [search]);

  useEffect(() => {
    const bookMarkedData = JSON.parse(
      localStorage.getItem("react-bookmarked-characters")
    );
    if (bookMarkedData) {
      setFavourites(bookMarkedData);
    }
  }, [search]);

  // Get 20 posts
  const indexOfLastCharacter = currentPage * characterPerPage;
  const indexOfFirstCharacter = indexOfLastCharacter - characterPerPage;
  const slicedFavourites = favourites.slice(
    indexOfFirstCharacter,
    indexOfLastCharacter
  );

  return (
    <div>
      <div className="heading-container">
        <SearchBarHeading heading={"MARVEL CHARACTERS"} />
        <SearchBar search={search} setSearch={setSearch} />
      </div>

      <div className="cards-container">
        {search === "" ? (
          <CharactersList characters={slicedFavourites} />
        ) : (
          <CharactersList characters={characters} />
        )}
      </div>
    </div>
  );
};

export default App;

如果要從本地存儲中刪除特定項目,步驟 1:從本地存儲中獲取數據步驟 2:根據需要修改數據步驟 3:將數據存儲回本地存儲

前任:-

data = [1, 2, 3, 4, 5]
 
 localStorage.setItem("react-bookmarked-characters", JSON.Stringify(data)) // [1,2,3,4,5]

 data = JSON.parse(localStorage.getItem("react-bookmarked-characters"))

 newData = data.splice(1,1)

 localStorage.setItem("react-bookmarked-characters", JSON.Stringify(newData)) // [1,3,4,5]

要刪除完整的本地存儲,您可以這樣做

localStorage.removeItem("react-bookmarked-characters")

這是我將如何解決它。

首先要做的是讀取保存的書簽並將它們設置為組件的初始 state。

然后,我會使用 React.useEffect 來保存書簽 state,只要 state 發生變化。

最后,我會稍微清理一下您的 onClick 處理程序,以處理書簽 ID 的切換。

import React, { useState } from 'react';
import './CharactersList.css';
import { RiBookmarkLine } from 'react-icons/ri';
import { RiBookmarkFill } from 'react-icons/ri';

const StorageKey = 'react-bookmarked-characters';

const CharactersList = (props) => {
  const initialState = JSON.parse(window.localStorage.getItem(StorageKey)) ?? [];
  const [bookmarks, setBookmarks] = useState(initialState);

  React.useEffect(() => {
    window.localStorage.setItem(StorageKey, JSON.stringify(bookmarks));
  }, [bookmarks]);

  const handleLikeChange = (character) => {
    setBookmarks((prevBookmarks) => {
      if (prevBookmarks.includes.character.id) {
        return prevBookmarks.filter((id) => id === character.id);
      }
      return [...prevBookmarks, character.id];
    });
  };

  return props.characters.map((character) => (
    <Character
      key={character.index}
      character={character}
      bookmarked={bookmarks.includes(character.id)}
      onToggleBookmark={handleLikeChange}
    />
  ));
};

const Character = ({ character, bookmarked, onToggleBookmark }) => {
  const handleClick = () => onToggleBookmark(character);

  return (
    <div className="card-container" key={character.index}>
      <img
        src={`${character.thumbnail.path}/standard_fantastic.${character.thumbnail.extension}`}
        alt="character"
        className="image"
      />
      <div className="info-container">
        <p className="name">{character.name}</p>
        <div className="icon" onClick={handleClick}>
          {bookmarked ? <RiBookmarkFill /> : <RiBookmarkLine />}
        </div>
      </div>
    </div>
  );
};

export default CharactersList;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM