'In React Like Button Count is not Updating

Here, I'm getting data from API in array of objects format. i'm showing each object data in a section, for that each section i need to add a like button. Default the like will be 0, when i press like button it has to increase by 1.

import { useEffect, useState } from "react";
import "./styles.css";
import { FaThumbsUp } from "react-icons/fa";
export default function App() {
  const [userData, setUserData] = useState();
  const [like, setLike] = useState(0);
  const getData = async () => {
    let response = await fetch("https://jsonplaceholder.typicode.com/users");
    let result = await response.json();
    setUserData(result);
  };
  useEffect(() => {
    getData();
  });
  const likeHandler = (i) => {
    userData.find((data, index) => {
      if (index !== i) {
        setLike(0);
      } else {
        setLike(1);
        console.log("hello", like, i);
      }
    });
  };
  return <div className="App"> {userData.map((val, i) => (
    <div key={i} style={{ backgroundColor: "red" }}>
      <p>{val.name}</p>
      <p>{val.username}</p>
      <p>{val.email}</p>

      <div>
        <FaThumbsUp onClick={() => likeHandler(i)} />
        {like}
      </div>
    </div>
  ))}</div>;
}



Solution 1:[1]

So I assume each user has their individual like count. Because in your original code you only have 1 like state, so even if you managed to pull it off you will have a total like count instead.

What you can do is merge the like into the userData.

High-level overview:

import { useState } from "react";
import { FaThumbsUp } from "react-icons/fa";

export default function App() {
  const [userData, setUserData] = useState();

  // ... code omitted, assume userData is correctly fetch

  const handleLike = index => () => {    
    setUserData(prevUserData => {
      const newUserData = prevUserData.slice(); // shallow copy array
      newUserData[index] = {
        ...newUserData[index],
        like: (newUserData[index]?.like ?? 0) + 1
      };

      return newUserData;
    });
  };

  return <div className="App"> {userData.map((val, i) => (
    <div key={i} style={{ backgroundColor: "red" }}>
      <p>{val.name}</p>
      <p>{val.username}</p>
      <p>{val.email}</p>

      <div>
        <FaThumbsUp onClick={handleLike(i)} />
        {val.like}
      </div>
    </div>
  ))}</div>;
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Drew Reese