我试图实现一种逻辑,根据点击的项目,arrow down个图标变为arrow-up,如果用户第二次点击同一行,则应该再次更改
我try 根据单击项目的索引触发它,但无法正常工作

const handleClick = () => {
    setOpen(!open);
  };

但这种方法会更改状态中所有图标的状态.

这是代码和sandbox link.

import React, { useState } from "react";
import { ListGroup } from "react-bootstrap";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faAngleUp, faAngleDown } from "@fortawesome/free-solid-svg-icons";

export const defaultListData = [
  {
    name: "Dapibus ac facilisis in"
  },
  {
    name: "Morbi leo risus"
  },
  {
    name: "Porta ac consectetur ac"
  },
  {
    name: "Porta ac doesfvsaard  asdas"
  }
];

function UserSettings() {
  const [open, setOpen] = useState(false);
  const [selectedIndex, setSelectedIndex] = useState(0);

  const handleClick = () => {
    setOpen(!open);
  };

  function handleTests(index) {
    setSelectedIndex(index);
  }

  return (
    <div>
      {defaultListData.map((category, i) => (
        <ListGroup key={category.name} variant="flush">
          <ListGroup.Item
            onClick={(e) => handleTests(i)}
            style={{ display: "flex", gap: "50px" }}
          >
            {category.name}

            <FontAwesomeIcon
              style={{ color: "green", cursor: "pointer" }}
              icon={selectedIndex === i ? faAngleDown : faAngleUp}
            />
          </ListGroup.Item>
        </ListGroup>
      ))}
    </div>
  );
}

export default UserSettings;

任何帮助都将不胜感激

推荐答案

您想根据单击的项目是否已打开来切换更改selectedIndex.更好的方法是将Item移动到具有自己open状态的单独组件:


const Item = (props) => {
  const [open, setOpen] = useState(false);

  const handleClick = () => {
    setOpen((prev) => !prev);
  };

  return (
    <ListGroup.Item
      onClick={(e) => handleClick()}
      style={{ display: "flex", gap: "50px" }}
    >
      {props.category.name}

      <FontAwesomeIcon
        style={{ color: "green", cursor: "pointer" }}
        icon={open ? faAngleDown : faAngleUp}
      />
    </ListGroup.Item>
  );
};

function UserSettings() {
  return (
    <div>
      {defaultListData.map((category, i) => (
        <ListGroup key={category.name} variant="flush">
          <Item category={category} />
        </ListGroup>
      ))}
    </div>
  );
}

Javascript相关问答推荐

如何添加绘图条形图图例单击角形事件

为什么按钮会随浮动属性一起移动?

为什么Mutations 观察器用微任务队列而不是macrotask队列处理?

JSDoc创建并从另一个文件导入类型

保持物品顺序的可变大小物品分配到平衡组的算法

从包含数百行的表中获取更改后的值(以表单形式发送到后端)的正确方法是什么?

如何强制Sphinx中的自定义js/css文件始终加载更改而不缓存?

在使用REACT更改了CSS类之后,无法更改CSS样式

使用带有HostBinding的Angular 信号来更新样式?

为什么JPG图像不能在VITE中导入以进行react ?

邮箱密码重置链接不适用于已部署的React应用程序

获取';无法解决导入和导入";slick-carousel/slick/slick-theme.css";';错误

使用Ace编辑器对子组件实例的native-element 进行Angular 获取时面临的问题

JS Animate()方法未按预期工作

是否可以将异步调用与useState(UnctionName)一起使用

在Java脚本中录制视频后看不到曲目

如何将字符串拆分成单词并跟踪每个单词的索引(在原始字符串中)?

是否有静态版本的`instanceof`?

为什么我的InDesign Java脚本不能完全工作?

元素类型无效:应为字符串(对于内置组件)或类/函数(对于复合组件),但GET:Object.在Reaction项目中