news 2026/9/3 9:18:45

5分钟掌握 Material-UI Accordion 折叠面板:从最小示例到嵌套实战完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
5分钟掌握 Material-UI Accordion 折叠面板:从最小示例到嵌套实战完整指南

5分钟掌握 Material-UI Accordion 折叠面板:从最小示例到嵌套实战完整指南

【免费下载链接】material-uiMaterial UI: Comprehensive React component library that implements Google's Material Design. Free forever.项目地址: https://gitcode.com/GitHub_Trending/ma/material-ui

Material-UI 的 Accordion 折叠面板把长内容收进可点击的标题条里,按需展开、收起,避免页面信息过载。读完本文,你能直接写出可运行的面板,并处理默认展开、受控、嵌套这几类高频配置问题。

它适合放在哪里 📍

  • FAQ 页:问题列表很长,逐条展开能保持首屏干净,配合受控模式还能做到同时只开一个。
  • 设置分区:把"常规 / 账户 / 高级"这类多组选项收进不同面板,页面短、层次清楚。
  • 文档分节:接口或教程文档按章节折叠,读者按需查看,不用整页滚动。

四个核心组件速览 🧩

名称职责是否必需
Accordion面板容器,管理展开状态与过渡必需
AccordionSummary标题区,可点击,承载展开图标必需
AccordionDetails内容区,放正文、表单等必需
AccordionActions底部操作条,放按钮等控件可选

源码目录在packages/mui-material/src/,其中Accordion负责状态逻辑,AccordionSummaryAccordionDetailsAccordionActions各自独立成目录,改样式前建议先看一遍。

30 秒跑通最小示例 ⚡

先引入四个组件。expandIcon只是可选的展开指示图标,不传也能工作。

import * as React from 'react'; import Accordion from '@mui/material/Accordion'; import AccordionSummary from '@mui/material/AccordionSummary'; import AccordionDetails from '@mui/material/AccordionDetails'; import Typography from '@mui/material/Typography'; import ExpandMoreIcon from '@mui/icons-material/ExpandMore';

下面是一个最小的可运行面板:

export default function MyAccordion() { return ( <Accordion> <AccordionSummary expandIcon={<ExpandMoreIcon />}> <Typography>面板标题</Typography> </AccordionSummary> <AccordionDetails> <Typography>面板正文,可以放任意内容。</Typography> </AccordionDetails> </Accordion> ); }

运行后你会看到一个带标题条的面板,点击标题可展开正文,图标随之旋转 180 度。

参数速查表 🛠️

属性作用何时用
defaultExpanded首次渲染即展开,之后自管理只想要初始状态、不接管后续点击
expanded受控展开状态需要"同时只开一个"等外部逻辑
onChange状态变化回调,签名(event, isExpanded)受控模式下必须配合使用
expandIcon(在AccordionSummary上)自定义展开指示图标换图标或调整指示器样式
disabled锁定面板为收起且不可点击前置条件未满足时占位
disableGutters去掉展开时的上下间距面板紧贴排列,不要留白
square去掉圆角与相邻卡片拼接成直角块
slotProps.transition给内部Collapse过渡组件传参需要unmountOnExit等精细控制

解决 3 个高频问题 🎯

怎么让面板默认展开

加一个布尔属性即可,首次渲染就处于展开态。

<Accordion defaultExpanded> {/* 子组件结构不变 */} </Accordion>

页面加载后该面板直接展示正文,用户仍可点击标题收起。

怎么换成自己的图标

expandIcon换成任意图标组件,旋转动画由组件自动处理。

import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'; <AccordionSummary expandIcon={<ArrowDropDownIcon />}> <Typography>自定义图标</Typography> </AccordionSummary>

展开、收起时图标会平滑旋转,不需要你写任何过渡代码。

怎么做到同时只展开一个

用一个字符串记录当前展开项,每次变化时覆盖它,而不是各自维护布尔值。

const [open, setOpen] = React.useState('p1'); const handleChange = (panel) => (event, isExpanded) => setOpen(isExpanded ? panel : false); <div> <Accordion expanded={open === 'p1'} onChange={handleChange('p1')}> {/* 面板 1 */} </Accordion> <Accordion expanded={open === 'p2'} onChange={handleChange('p2')}> {/* 面板 2 */} </Accordion> </div>

点开面板 2 时面板 1 自动收起,再点当前面板则全部收起,就是 FAQ 的经典行为。

进阶:性能与无障碍 ⚙️

收起即卸载

什么时候需要:面板里嵌了图表、数据表格等重组件,收起后还挂在内存里。默认内容只是隐藏,DOM 仍在。

<Accordion slotProps={{ transition: { unmountOnExit: true } }}> {/* 子组件结构不变 */} </Accordion>

收起时子树被真正销毁,展开时重新挂载。注意输入框里的未保存数据会随之丢失。

屏幕阅读器支持

什么时候需要:产品要做无障碍验收时。组件已内置aria-expandedrole="region"和标题关联,你只需保留默认结构。

<AccordionSummary id="panel1-header" aria-controls="panel1-content"> <Typography>标题</Typography> </AccordionSummary> <AccordionDetails id="panel1-content" />

AccordionSummary会自动把id传给标题、把aria-controls传给内容区,两者互相引用后读屏体验最顺。

实战:嵌套结构 🚀

<Accordion> <AccordionSummary expandIcon={<ExpandMoreIcon />}> <Typography>主面板</Typography> </AccordionSummary> <AccordionDetails> <Accordion defaultExpanded> <AccordionSummary expandIcon={<ExpandMoreIcon />}> <Typography>子面板 1</Typography> </AccordionSummary> <AccordionDetails> <Typography>子面板 1 的内容。</Typography> </AccordionDetails> </Accordion> <Accordion> <AccordionSummary expandIcon={<ExpandMoreIcon />}> <Typography>子面板 2</Typography> </AccordionSummary> <AccordionDetails> <Typography>子面板 2 的内容。</Typography> </AccordionDetails> </Accordion> </AccordionDetails> </Accordion>

外层收起时,里面的子面板会一起隐藏。这种结构适合文档目录树和多层筛选器。嵌套面板共享主题样式,但展开状态互不联动,各管各的。

常见问题 ❓

图标不旋转是怎么回事

旋转由AccordionSummary内部的图标包装层完成,展开时加expanded类名触发过渡。如果你的图标没转,多半是全局 CSS 或主题覆盖了旋转样式,检查一下expandIconWrapper相关的样式即可。

受控模式不生效

同时提供expandeddefaultExpanded时以expanded为准。受控面板完全由你传入的expanded决定,点击不会自己变化。必须配合onChange更新外部状态,缺了它点击就"没反应"。

收起后内容为什么不卸载

内部Collapse过渡默认收起后仍保留 DOM 节点。想让节点销毁,通过slotProps.transition.unmountOnExit开启即可;不加这个参数,"卸载"永远不会发生。

Accordion 的状态、受控、卸载和嵌套就靠上面这些 API 全部覆盖。官方文档在docs/data/material/components/accordion/accordion.md,源码在packages/mui-material/src/Accordion/,受控示例可直接参考docs/data/material/components/accordion/ControlledAccordions.tsx。现在就可以在你的项目里搭一个试试。

【免费下载链接】material-uiMaterial UI: Comprehensive React component library that implements Google's Material Design. Free forever.项目地址: https://gitcode.com/GitHub_Trending/ma/material-ui

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 22:03:09

Unity益智游戏逻辑骨架:模块化架构与Job System路径优化

简介&#xff1a;益智游戏开发核心在于可复用、低耦合的逻辑架构设计。其本质是将网格管理、消除判定、状态机行为等关键能力抽象为独立模块&#xff0c;依托C#面向对象特性与事件驱动机制实现高内聚低耦合。Unity中采用Job System进行路径预计算&#xff0c;通过分块查表轻量D…

作者头像 李华
网站建设 2026/8/31 11:29:50

蓝桥杯嵌入式竞赛实战指南:从模块化设计到高效调试

1. 项目概述&#xff1a;从一场竞赛到一次系统性的能力重塑第十二届蓝桥杯嵌入式设计与开发大赛已经落幕&#xff0c;但对我而言&#xff0c;这远不止是一场为期数小时的比赛。它更像是一次对个人嵌入式知识体系、工程实践能力和临场心态的极限压力测试。很多朋友在赛后交流时&…

作者头像 李华
网站建设 2026/8/31 11:42:59

完美世界2017校招技术综合A卷全解析:C++/网络/系统设计一网打尽

“完美世界2017校招技术综合A卷”&#xff0c;说实话&#xff0c;看到这个标题我就想起当年刷题刷到头秃的日子。这套卷子在游戏行业校招里算是挺有代表性的&#xff0c;它不是单纯考算法&#xff0c;而是把计算机基础、工程能力、游戏开发思维全揉在一起。很多同学拿着这套题来…

作者头像 李华
网站建设 2026/9/2 10:41:46

酒店管理系统毕业设计实战:从需求到部署的完整开发指南

简介&#xff1a;在软件开发领域&#xff0c;毕业设计是检验学生综合运用所学知识解决实际问题能力的关键环节。一个典型的毕业设计项目&#xff0c;如酒店管理系统&#xff0c;其核心在于理解并实现清晰的业务逻辑与完整的技术栈整合。从概念上讲&#xff0c;这类系统遵循经典…

作者头像 李华
网站建设 2026/9/2 10:30:34

基于Flask与YOLO的RTSP视频流AI分析服务:从架构设计到性能优化实战

简介&#xff1a;实时视频流分析是计算机视觉与AIoT领域的核心应用&#xff0c;其原理在于对连续图像帧进行实时处理与智能识别。通过目标检测等深度学习技术&#xff0c;系统能自动识别画面中的人、车等目标&#xff0c;为安防、交通管理等场景提供关键数据支撑。其技术价值在…

作者头像 李华
网站建设 2026/9/2 9:44:32

JavaScript对象创建的五种核心方式:从工厂模式到ES6类语法

1. 从“new Object()”说起&#xff1a;为什么我们需要五种创建方式&#xff1f;在JavaScript的世界里&#xff0c;对象是构建一切的基石。无论是前端页面的DOM操作&#xff0c;还是后端的Node.js服务&#xff0c;都离不开对象的创建与操作。很多刚入门的开发者&#xff0c;可能…

作者头像 李华