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

React手风琴组件标题点击切换图标功能实现求助

React手风琴组件实现点击标题切换对应图标

核心思路

通过手风琴项的展开状态条件渲染activeIcon和inactiveIcon,确保点击仅触发当前项的状态切换,进而切换对应图标。

单个手风琴项实现

如果是单个独立的手风琴组件,直接在内部维护展开状态:

import { useState } from 'react';

const Accordion = ({ title, inactiveIcon, activeIcon, children }) => {
  // 维护当前手风琴的展开状态
  const [isExpanded, setIsExpanded] = useState(false);

  // 点击标题切换状态
  const toggleAccordion = () => {
    setIsExpanded(prevState => !prevState);
  };

  return (
    <div>
      {/* 标题区域,绑定点击事件 */}
      <div onClick={toggleAccordion}>
        <span>{title}</span>
        {/* 根据状态切换图标 */}
        {isExpanded ? activeIcon : inactiveIcon}
      </div>
      {/* 根据状态控制内容显示 */}
      {isExpanded && <div>{children}</div>}
    </div>
  );
};

export default Accordion;

多手风琴项(仅展开一个)实现

如果需要点击一个展开、其他收起的效果,将状态提升到父组件统一管理:

import { useState } from 'react';

const AccordionGroup = ({ items }) => {
  // 记录当前展开的项索引,null表示全部收起
  const [expandedIndex, setExpandedIndex] = useState(null);

  const toggleAccordion = (index) => {
    // 点击已展开的项则收起,否则展开该项
    setExpandedIndex(prevIndex => prevIndex === index ? null : index);
  };

  return (
    <div>
      {items.map((item, index) => (
        <div key={index}>
          <div onClick={() => toggleAccordion(index)}>
            <span>{item.title}</span>
            {/* 匹配当前索引切换图标 */}
            {expandedIndex === index ? item.activeIcon : item.inactiveIcon}
          </div>
          {expandedIndex === index && <div>{item.children}</div>}
        </div>
      ))}
    </div>
  );
};

// 使用示例
const App = () => {
  const accordionItems = [
    {
      title: "标题1",
      inactiveIcon: <span>↓</span>, // 替换成你的图标组件/元素
      activeIcon: <span>↑</span>,
      children: <p>手风琴内容1</p>
    },
    {
      title: "标题2",
      inactiveIcon: <span>↓</span>,
      activeIcon: <span>↑</span>,
      children: <p>手风琴内容2</p>
    }
  ];

  return <AccordionGroup items={accordionItems} />;
};

关键注意点

  • 单个手风琴项自行维护状态,多个项通过索引区分,确保点击事件仅影响当前项
  • 图标支持任意JSX元素(SVG组件、图标库组件、普通标签均可),直接传入即可
  • 状态切换逻辑简洁:单个项取反状态,多个项判断索引是否匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:05:59