news 2026/8/29 7:47:22

Material-UI 折叠面板实战:3 个场景搭好 FAQ、目录与层级内容

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Material-UI 折叠面板实战:3 个场景搭好 FAQ、目录与层级内容

Material-UI 折叠面板实战:3 个场景搭好 FAQ、目录与层级内容

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

一个订单详情页动辄十几段说明、十几条 FAQ,全部平铺会把用户直接劝退。Material-UI 的折叠面板(Accordion)就是干这件事的:内容默认收起,用户点击才展开,把"内容墙"变成可自主浏览的层级结构。它由 4 个小组件协作完成,下面按真实使用场景逐个拆开讲。

3 分钟搭出基础折叠面板 ⚡

四个组件各管一段,分工很清楚:

  • Accordion:最外层容器,管理"开合"状态,并通过 Context 把状态和切换函数下发给子组件(见 Accordion 源码)。
  • AccordionSummary:可点击的标题行,本质是个带aria-expanded的按钮。
  • AccordionDetails:正文区域,内部套在Collapse过渡容器里,所以展开收起自带高度动画。
  • AccordionActions:可选,在面板底部放一排操作按钮,比如"取消/同意"。

导入和最小用法一次看完:

import Accordion from '@mui/material/Accordion'; import AccordionSummary from '@mui/material/AccordionSummary'; import AccordionDetails from '@mui/material/AccordionDetails'; import AccordionActions from '@mui/material/AccordionActions'; import Typography from '@mui/material/Typography'; import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; <Accordion> <AccordionSummary expandIcon={<ExpandMoreIcon />}> <Typography>配送说明</Typography> </AccordionSummary> <AccordionDetails> <Typography>正文区域,可放任意 React 组件</Typography> </AccordionDetails> </Accordion>

记住一条约束:Accordion 的第一个子元素必须是 AccordionSummary,源码里会校验。不需要按钮的话,AccordionActions 整块删掉即可。

受控模式实现:一次只展开一个折叠面板

FAQ 页最常见的诉求是:打开第二个问题面板时,第一个自动收起来。这要用受控模式——不写defaultExpanded,改用expanded+onChange,状态上提到父组件。

核心是存"当前打开的面板 id"而不是布尔值:

const [expanded, setExpanded] = useState(false); const handleChange = (panel) => (event, isExpanded) => setExpanded(isExpanded ? panel : false); <Accordion expanded={expanded === 'faq1'} onChange={handleChange('faq1')}> <AccordionSummary expandIcon={<ExpandMoreIcon />}> <Typography>如何修改收货地址?</Typography> </AccordionSummary> <AccordionDetails> <Typography>……</Typography> </AccordionDetails> </Accordion> // 其余面板同构,只替换 id 与文案

handleChange('faq1')这种柯里化写法避免给每个面板单独定义事件函数。官方仓库里有一份完整实现可对照:ControlledAccordions 示例。反过来,如果业务允许多个面板同时展开(如"全部展开"按钮),就不必受控,每个面板各管各的状态即可。

嵌套折叠面板示例:文档目录与设置中心的层级结构

文档目录、设置中心这类"大类套小类"的结构,直接往 AccordionDetails 里再嵌一层 Accordion 就行,没有任何特殊 API:

<Accordion defaultExpanded> {/* 外层主面板 */} <AccordionSummary> <Typography>订单管理</Typography> </AccordionSummary> <AccordionDetails> <Accordion> {/* 直接再嵌一个 Accordion */} <AccordionSummary> <Typography>物流追踪</Typography> </AccordionSummary> <AccordionDetails> <Typography>子面板正文</Typography> </AccordionDetails> </Accordion> </AccordionDetails> </Accordion>

嵌套面板的间距靠外层margin撑开,层级一多会显得松散,给子级面板加disableGutters可以收紧间距。另外注意标题默认渲染成h3,嵌套时用slotProps={{ heading: { component: 'h4' } }}调整层级,避免文档里出现两个同级标题。

细节打磨:defaultExpanded、disabled 与 unmountOnExit 性能优化

按"解决什么问题"来记这几个属性:

  • defaultExpanded:首屏就该露出的关键信息(如重要提示)不必让用户多点一次。注意它只定初始值,之后面板不受控,和expanded二选一。
  • disabled:面板置灰且不可聚焦,适合"该功能未开通"这类占位项。
  • expandIcon:换个箭头图标,旋转动画组件自动处理,不用自己写 transform。
  • unmountOnExit:这是唯一值得专门说的性能项。默认情况下内容即使收起也挂载在 DOM 里——这是有意为之,利于 SSR 和 SEO。但当你一屏放十几个面板、或正文里塞了重量级组件(图表、数据网格)时,首屏渲染成本会明显上升。把过渡容器换成收起即卸载:
<Accordion slotProps={{ transition: { unmountOnExit: true } }} />

代价是展开时重新执行挂载逻辑,纯文本面板保持默认即可。

最后是 ARIA:WAI-ARIA 规范要求标题和内容互相指向。只需在 AccordionSummary 上补一对属性,Accordion 会自动推导其余链接关系:

<AccordionSummary id="faq-1-header" aria-controls="faq-1-content">

id 建议用React.useId()生成,保证动态渲染下唯一。

折叠面板资源索引

Accordion 的四个组件都很薄,开合逻辑、过渡和 ARIA 推导都集中在容器组件里,读源码不费力。

  • Accordion 组件源码目录
  • 官方文档 accordion.md
  • 受控模式官方示例 ControlledAccordions

【免费下载链接】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/8/29 7:46:15

LX4056工业级线性充电IC深度解析:30V耐压与NTC温控实战指南

1. 为什么LX4056在30V输入场景下成了“隐形刚需”——从充电IC选型盲区说起 我第一次在客户现场看到LX4056&#xff0c;是在一台工业手持终端的维修板上。那台设备用的是12V铅酸电池供电&#xff0c;但内部锂电池组标称电压才7.4V&#xff08;2串&#xff09;&#xff0c;而前端…

作者头像 李华
网站建设 2026/8/29 7:43:43

2026零基础AI数字人平台:可视化简易操作,解决学习门槛过高问题

2026年AI数字人应用愈发广泛&#xff0c;却有不少零基础用户被复杂操作拦住脚步。很多人疑惑&#xff1a;零基础能快速上手AI数字人平台吗&#xff1f;可视化操作真能降低学习门槛&#xff1f;哪些平台适配新手且实用性强&#xff1f;本文围绕这些核心问题&#xff0c;结合2026…

作者头像 李华
网站建设 2026/8/29 7:43:40

C++ STL面试八股:从vector扩容到红黑树,底层原理全拆解

说实话&#xff0c;牛客上C岗位的面经刷了一圈&#xff0c;你会发现一个特别有意思的现象&#xff1a;不管你是面腾讯、字节、阿里还是美团&#xff0c;不管是校招还是社招&#xff0c;STL永远像幽灵一样出现在每一轮技术面里。有人觉得STL不就是一堆现成的容器和算法嘛&#x…

作者头像 李华
网站建设 2026/8/29 7:43:06

LLM的“跳跃”能力拆解:上下文切换、任务切换与工具调用实操指南

LLM can “jump”&#xff0c;这句话不是在讲物理&#xff0c;而是在讲能力越级。一个已经训练好的大语言模型&#xff0c;不重新训练、不换模型文件&#xff0c;就能在完全不同的上下文、任务和工具之间快速切换&#xff1a;上一秒还在给你解释法律条款&#xff0c;下一秒输出…

作者头像 李华
网站建设 2026/8/29 7:42:51

股价崩盘风险:从理论到Stata实现的完整实证指南

1. 项目概述&#xff1a;从“股价崩盘风险”到可操作的财会论文变量 如果你正在为你的会计、金融或公司治理方向的硕士或博士论文寻找一个既有理论深度又有实证可操作性的核心变量&#xff0c;“股价崩盘风险”绝对是一个绕不开的经典选题。我第一次接触这个概念是在十年前写硕…

作者头像 李华
网站建设 2026/8/29 7:41:36

基于LIS2DH12超低功耗MEMS加速度计的地下管网泄漏监测方案

今年在做地下管网渗漏监测方案时&#xff0c;我选了ST的LIS2DH12这颗MEMS加速度计&#xff0c;起因是想找一颗真正意义上“超低功耗、数字输出、体积小”的三轴传感器来做人手一台的低成本泄漏预判设备。踩了几轮坑后&#xff0c;越来越觉得这颗“nano”加速度计在特定场景里非…

作者头像 李华