Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

121
Visualizações
Changing all bookmark states instead specific one

I am creating app for bookmarking marvel characters (heroes), so when I click on specific bookmark icon it should change into filled bookmark icon and vice-versa. Unfortunately when I click on single one all icons change. I guess the problem is in the state. Please help!

As a prop I am receiving all data about characters (image, name) Here is the code:

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

const CharactersList = (props) => {
  const [isLiked, setisLiked] = useState(false);
  const [toggle, setToggle] = useState(false);
  const [favourites, setFavourites] = useState([]);

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

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

  const handleBookmarking = (character) => {
    if (toggle === true) {
      const newBookmarkedList = [...favourites, character];
      setFavourites(newBookmarkedList);
      saveToLocalStorage(newBookmarkedList);
      setisLiked(true);
    } else {
      const newBookmarkedList = favourites.filter(
        (favourites) => favourites.id !== character.id
      );
      setFavourites(newBookmarkedList);
      saveToLocalStorage(newBookmarkedList);
      setisLiked(false);
    }
  };

  const toggleLike = () => {
    setisLiked(!isLiked);
    Bookmarked(isLiked);
  };

  const Bookmarked = () => {
    return isLiked ? <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={() => {
                setToggle(!toggle);
                handleBookmarking(character);
              }}
            >
              <Bookmarked />
            </div>
          </div>
        </div>
      ))}
    </>
  );
};

export default CharactersList;
about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Problem is in the state you are right. You are storing one boolean value for all your heroes. You should change the state value to an array of ids instead of one boolean and in this array, you store ids of bookmarked characters. So your handleBookmarking function should be something like this:

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

With this implementation, you no longer need toggle state. If your character's id is in the array, it's bookmarked and if it's not, it's not bookmarked. If your character doesn't have an id, you can use name or any other prop that is unique. You will also have to change your BookMarked component implementation to something like this:

//implementation of BookMarked
const Bookmarked = ({id}) => {
   return isLiked.includes(id) ? <RiBookmarkFill /> : <RiBookmarkLine />;
};

And also change it in return statement:

//from this:
<Bookmarked />

//to this: 
<Bookmarked id={character.id} />
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda