You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React使用useState做列表卡片切换时全项同步触发,如何仅切换点击项?

问题原因

你所有列表项共用同一个布尔类型的secondCard状态,没有区分具体点击的列表项,因此状态变更后所有项的显隐逻辑会同步执行。

实现方案

将状态改为存储当前激活项的唯一标识(这里直接复用你已用的user.index作为唯一值即可),点击时传入当前项的标识做匹配判断,只有标识匹配的项才展示卡片。

修改后的完整代码如下:

import { useState, useEffect } from 'react'

export default function AdminsComponent() {
  // 状态改为存储激活项的index,初始值为null代表无激活项
  const [activeCardIndex, setActiveCardIndex] = useState(null)

  // 接收当前点击项的index作为参数
  const toggleCard = (currentIndex) => {
    // 如果点击的是当前已激活的项,则关闭,否则切换为当前点击项
    setActiveCardIndex(activeCardIndex === currentIndex ? null : currentIndex)
  }

  const adminsComponent = adminData.map((user) => (
    // 这里用Fragment包裹li和div,避免map返回多个并列元素报错
    <>
      <li
        key={user.index}
        className="px-4 my-1 lg:pl-8 w-full scale-95 transform transition duration-500 hover:scale-100 text-left"
        onClick={() => toggleCard(user.index)}
      >
       // codehere
      </li>
      
      {/* 只有当前项的index和激活状态匹配时才展示卡片 */}
      {activeCardIndex === user.index && (
        <div className="px-4 border-l-4 p-2 bg-accent-0 text-accent-8 pb-4 shadow-lg border-blue">
          // ... codehere
        </div>
      )}
    </>
  ))

  return <ul>{adminsComponent}</ul>
}

补充说明

  • 如果你的user数据有单独的唯一id字段,优先用id替代index作为唯一标识,避免列表排序/增删时出现显隐异常
  • 原代码中map直接返回li和div两个并列元素属于语法错误,新增的<></>(React Fragment)用于包裹并列元素避免报错

内容的提问来源于stack exchange,提问作者Henrique Monteiro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:48:01