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

如何使用React实现点击NavDropdown.Item切换Accordion内容

React实现下拉菜单切换手风琴内容方案

核心逻辑为通过共享状态绑定下拉菜单选中项和手风琴激活项,全程不需要弹窗类组件参与,仅靠状态驱动视图更新即可实现效果。


实现步骤

原生React手写实现

  • 第一步:在父组件定义共享状态,存储当前选中的菜单项唯一标识,默认值可设为第一个激活项的标识
import { useState } from 'react';

// 下拉菜单和手风琴共用的数据源,保持id一一对应即可
const menuList = [
  { id: 'item1', label: '菜单选项1', accordionContent: '手风琴模块1的展示内容' },
  { id: 'item2', label: '菜单选项2', accordionContent: '手风琴模块2的展示内容' },
  { id: 'item3', label: '菜单选项3', accordionContent: '手风琴模块3的展示内容' },
];

function Page() {
  // 共享状态:存储当前激活的项id
  const [activeId, setActiveId] = useState('item1');
  • 第二步:给下拉菜单项绑定点击事件,点击时将状态更新为当前项的id
return (
    <div className="page-wrapper">
      {/* 导航下拉菜单区域 */}
      <div className="nav-dropdown">
        <button className="dropdown-trigger">展开导航</button>
        <div className="dropdown-list">
          {menuList.map(item => (
            <div 
              key={item.id}
              className={`dropdown-item ${activeId === item.id ? 'active-item' : ''}`}
              onClick={() => setActiveId(item.id)}
            >
              {item.label}
            </div>
          ))}
        </div>
      </div>

      {/* 手风琴展示区域 */}
      <div className="accordion-wrapper">
        {menuList.map(item => (
          <div key={item.id} className="accordion-item">
            <h3 className="accordion-title">{item.label}</h3>
            {/* 只有id匹配时才展示当前项的内容 */}
            {activeId === item.id && (
              <div className="accordion-content">
                {item.accordionContent}
              </div>
            )}
          </div>
        ))}
      </div>
    </div>
  )
}
export default Page;

基于UI组件库实现

如果你使用Ant Design、MUI等带手风琴组件的UI库,可直接将共享状态传给手风琴的受控激活属性即可,不需要手动控制内容显隐,以下是Ant Design示例:

import { useState } from 'react';
import { Dropdown, Menu, Collapse } from 'antd';

const menuList = [
  { key: '1', label: '菜单选项1', children: '手风琴模块1的展示内容' },
  { key: '2', label: '菜单选项2', children: '手风琴模块2的展示内容' },
  { key: '3', label: '菜单选项3', children: '手风琴模块3的展示内容' },
];

function Page() {
  const [activeKey, setActiveKey] = useState('1');

  // 下拉菜单配置
  const dropdownMenu = (
    <Menu
      items={menuList.map(item => ({
        key: item.key,
        label: item.label,
        onClick: () => setActiveKey(item.key)
      }))}
    />
  );

  return (
    <div>
      <Dropdown overlay={dropdownMenu}>
        <a onClick={e => e.preventDefault()}>展开导航</a>
      </Dropdown>
      {/* 手风琴直接绑定共享状态即可同步切换 */}
      <Collapse activeKey={activeKey} onChange={setActiveKey} items={menuList} />
    </div>
  )
}

注意事项

  • 如果下拉菜单和手风琴不在同一个父组件层级,可以通过状态提升、Context或者轻量状态管理库(Zustand、Jotai等)共享这个激活状态即可
  • 不需要引入react-modal这类弹窗组件,整个逻辑仅依赖状态驱动视图更新即可实现无弹窗的直接切换

内容的提问来源于stack exchange,提问作者shashi kant kasera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:15:05