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

Chakra UI Accordion allowMultiple={false}失效问题修复咨询

Chakra UI Accordion 多面板无法自动关闭的解决方法

你当前代码的核心问题是:每个用户都被包裹在独立的<Accordion>组件中,这些折叠面板属于完全独立的实例。allowMultiple={false}的作用范围仅局限于当前<Accordion>内部的面板,因此点击不同用户的面板时,它们不会互相触发关闭逻辑。

修正后的代码

export const ComponentName = ({ Users }: any) => {
  return (
    <Box>
      {/* 仅保留一个外层 Accordion 容器 */}
      <Accordion className="accordion" allowToggle allowMultiple={false}>
        {/* 循环渲染 AccordionItem 而非独立的 Accordion */}
        {Users.map((user: any) => (
          <AccordionItem key={user.imageUrl}>
            <AccordionButton className="accordionButton">
              <Text className="userName">{user.name}</Text>
              <Avatar src={user.img} />
            </AccordionButton>
            <AccordionPanel>
              {user.topics.map((topic: any) => (
                <Tag key={topic} className="topic">{topic}</Tag>
              ))}
            </AccordionPanel>
          </AccordionItem>
        ))}
      </Accordion>
    </Box>
  );
};

关键调整说明

  • 将所有用户对应的折叠项统一放入同一个<Accordion>容器中,让allowMultiple={false}能全局控制所有面板,确保同一时间仅一个面板展开
  • 循环体从渲染<Accordion>改为渲染<AccordionItem>,每个用户对应一个折叠项
  • 给内部的<Tag>添加唯一key,避免React列表渲染警告

可选:手动控制展开状态

如果需要自定义初始展开项或手动控制状态,可以结合useState管理activeIndex:

import { useState } from 'react';

export const ComponentName = ({ Users }: any) => {
  // 初始展开第一个面板,设为null则全部关闭
  const [activeIndex, setActiveIndex] = useState<number | null>(0);

  return (
    <Box>
      <Accordion
        className="accordion"
        allowToggle
        allowMultiple={false}
        index={activeIndex}
        onChange={setActiveIndex}
      >
        {Users.map((user: any) => (
          <AccordionItem key={user.imageUrl}>
            {/* 按钮和面板内容保持不变 */}
            <AccordionButton className="accordionButton">
              <Text className="userName">{user.name}</Text>
              <Avatar src={user.img} />
            </AccordionButton>
            <AccordionPanel>
              {user.topics.map((topic: any) => (
                <Tag key={topic} className="topic">{topic}</Tag>
              ))}
            </AccordionPanel>
          </AccordionItem>
        ))}
      </Accordion>
    </Box>
  );
};

内容的提问来源于stack exchange,提问作者Nick Rock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:33:19