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

React Collapsible组件实现单开手风琴功能的技术求助

实现手风琴单开逻辑方案

要让react-collapsible组件实现「点击新项自动关闭已打开项」的单开手风琴效果,核心是在父组件中统一管理打开状态,具体修改如下:

1. 修改子组件(Accordion)

添加onTriggerClick属性,将点击事件透传给底层的Collapsible组件:

import Collapsible from 'react-collapsible';

const Accordion = ({
  open,
  trigger,
  triggerWhenOpen,
  children,
  onTriggerClick
}) => {
  return (
    <Collapsible
      open={open}
      lazyRender={true}
      triggerTagName="div"
      trigger={trigger}
      triggerWhenOpen={triggerWhenOpen}
      className="mb-[30px]"
      onTriggerClick={onTriggerClick}
    >
      {children}
    </Collapsible>
  );
};

export default Accordion;

2. 修改父组件

在父组件中维护当前打开项的状态,控制每个手风琴的开闭:

import { useState } from 'react';
import Accordion from './Accordion';
import AccordionContent from './AccordionContent';

// 父组件内部逻辑
const [activeAccordionId, setActiveAccordionId] = useState(null);

// 处理手风琴点击事件
const handleAccordionToggle = (itemId) => {
  // 点击已打开的项则关闭,否则打开该项并关闭其他
  setActiveAccordionId(prevId => prevId === itemId ? null : itemId);
};

// 渲染手风琴列表
{accordionArray.map((accItem) => (
  <Accordion
    open={activeAccordionId === accItem.id}
    trigger={accItem.trigger}
    triggerWhenOpen={accItem.triggerWhenOpen}
    key={accItem.id} // 用项的唯一ID作为key,避免Math.random()导致的渲染问题
    onTriggerClick={() => handleAccordionToggle(accItem.id)}
  >
    <AccordionContent
      imgSrc={'/' + accItem.imgSrc}
      imgAlt={accItem.imgAlt}
    />
  </Accordion>
))}

关键说明

  • 确保accordionArray中的每个项拥有唯一id字段,如果没有可以手动添加(比如{id: 1, ...}),不要用索引或随机数作为key
  • activeAccordionId状态记录当前打开项的ID,通过对比这个ID来控制每个Accordion的open属性,实现单开效果
  • 点击已打开的项时会自动关闭,若不需要这个功能,可将handleAccordionToggle改为setActiveAccordionId(itemId)

内容的提问来源于stack exchange,提问作者Goran Kukic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:15:21