我想根据用户将要 Select 的方式 Select 多个心形.换句话说,当用户点击多个心形时,应该 Select 多个心形,或者背景 colored颜色 应该是绿色.然而,它是一次只 Select 一个.

live demo

我知道,如果要 Select 多个红心,则需要将它们存储在一个数组中并通过它进行映射,那么嵌套 map 将随着用户的点击而增加更多的红心.

有没有办法解决这个问题?我被困了好几个小时:

推荐答案

当涉及到判断状态时,您应该只需要关心项的索引.

<EachHeart
  checked={heartsClicked[index]}
  onClick={handleClick}
  index={index}
/>
const handleClick = (index) => {
  setHeartsClicked((existing) => {
    const copy = [...existing];
    copy[index] = !copy[index];
    return copy;
  });
};

此外,这些状态毫无意义:

const [isLike, setIsLike] = useState(false);
const [heartIndexClicked, setHeartIndexClicked] = useState();

工作示例

try 以下操作:

我把first10改成了visibleData.这是一个比昨天我already suggested更好的名字.我还将大小从10改为15.您应该使用变量,而不是硬编码幻数.

import { useCallback, useMemo, useState } from "react";
import InfiniteScroll from "react-infinite-scroll-component";
import { TbHeart } from "react-icons/tb";
import { arr } from "./utils";

export function EachHeart({ checked, index, onClick }) {
  return (
    <>
      <TbHeart
        key={index}
        onClick={() => onClick(index)}
        className={` mt-9 ${
          checked &&
          "fill-green-500 transition-colors ease-in delay-150 hover:scale-[1.20]"
        } stroke-green-500 ml-5 w-5 h-5 cursor-pointer`}
      />
    </>
  );
}

const pageSize = 15;

export default function App() {
  const [visibleData, setVisibleData] = useState(arr.slice(0, pageSize));
  const [page, setPage] = useState(1);
  const [heartsClicked, setHeartsClicked] = useState([]);

  const fetchMoreData = useCallback(() => {
    setTimeout(() => {
      setVisibleData((prev) => [
        ...prev,
        ...arr.slice(page * pageSize, page * pageSize + pageSize),
      ]);
      setPage((prev) => (prev += 1));
    }, 2000);
  }, []);

  const handleClick = useCallback((index) => {
    setHeartsClicked((existing) => {
      const copy = [...existing];
      copy[index] = !copy[index]; // Invert true/false
      return copy;
    });
  }, []);

  const isDone = useMemo(() => visibleData.length < arr.length, [visibleData]);

  return (
    <>
      <div className="mt-24"></div>
      <InfiniteScroll
        dataLength={visibleData.length}
        next={fetchMoreData}
        hasMore={isDone}
        loader={<h3 className="font-bold text-center text-xl">Loading...</h3>}
        endMessage={
          <p className="text-base my-4 font-medium text-center">
            <b>Yay! You have seen it all</b>
          </p>
        }
      >
        {visibleData.map((t, index) => {
          return (
            <>
              <div className="flex ">
                <li key={index} className="mx-4 mt-8">
                  {t.name.concat(` ${t.id}`)}
                </li>
                <EachHeart
                  checked={heartsClicked[index]}
                  onClick={handleClick}
                  index={index}
                />
              </div>
            </>
          );
        })}
      </InfiniteScroll>
    </>
  );
}

Reactjs相关问答推荐

使用`Link`包装`tr`标记会在Next.js中产生水合错误14

获取更改后的状态值

无法使用Reaction日期选取器和Next.js设置初始日期

有没有可能在next.js和ssr中使用tsps?

试图从Amazon-Cogito-Identity-js模拟CogitoUser.authateUser,并将其获取为未定义的S

使用VITE的Reaction应用程序的配置是否正确?

状态更改是否卸载功能组件

我在Route组件上使用元素属性,这样就不需要ID了吗?

如果我使用 formik,如何在嵌套对象中写入正确的值?

我可以同时使用 Gatsby 和 NEXT.JS 吗?

如何在 React Hook Form 中使用嵌套对象处理错误验证消息

从 redux 调用UPDATE_DATA操作时状态变得未定义

显示我是否加入聊天应用程序时出现问题

如何到达类组件中的状态?

在 React 中使用复选框管理状态

如何不旋转 mui 自动完成弹出图标?

React Hooks 表单在日志(log)中显示未定义的用户名

React - useParams() 不会失败 null / undefined 判断

bootstrap 导航栏切换器在 reactjs 中不起作用

在 Nextjs 中使用 useEffect 随机化一个数组