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

如何为Material UI Accordion手风琴组件添加更多操作图标?

Material UI Accordion 头部添加编辑/删除操作图标实现方案

效果示例图
核心注意点:操作按钮的点击事件必须阻止冒泡,否则点击图标时会同步触发Accordion的展开/折叠逻辑,和预期交互不符。

实现步骤

  • 引入需要的操作图标:从@mui/icons-material引入编辑、删除对应的图标组件
  • 在AccordionSummary的标题节点和默认展开箭头之间,插入操作图标容器
  • 给操作图标容器绑定点击事件,调用e.stopPropagation()阻止事件冒泡
  • 微调样式保证图标和标题、展开箭头对齐,间距合理

完整实现代码

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';
import EditIcon from '@mui/icons-material/Edit';
import DeleteIcon from '@mui/icons-material/Delete';
import IconButton from '@mui/material/IconButton';
import Box from '@mui/material/Box';

export default function SimpleAccordion() {
  // 编辑操作逻辑
  const handleEdit = (e, accordionId) => {
    e.stopPropagation();
    console.log('编辑当前项:', accordionId);
    // 替换为实际编辑业务逻辑
  };

  // 删除操作逻辑
  const handleDelete = (e, accordionId) => {
    e.stopPropagation();
    console.log('删除当前项:', accordionId);
    // 替换为实际删除业务逻辑
  };

  return (
    <div>
      <Accordion>
        <AccordionSummary
          expandIcon={<ExpandMoreIcon />}
          aria-controls="panel1a-content"
          id="panel1a-header"
        >
          <Typography sx={{ flex: 1 }}>Accordion 1</Typography>
          {/* 操作图标区域 */}
          <Box sx={{ mr: 2, display: 'flex', gap: 1 }}>
            <IconButton 
              size="small" 
              onClick={(e) => handleEdit(e, 'panel1')}
            >
              <EditIcon fontSize="small" />
            </IconButton>
            <IconButton 
              size="small" 
              color="error"
              onClick={(e) => handleDelete(e, 'panel1')}
            >
              <DeleteIcon fontSize="small" />
            </IconButton>
          </Box>
        </AccordionSummary>
        <AccordionDetails>
          <Typography>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse
            malesuada lacus ex, sit amet blandit leo lobortis eget.
          </Typography>
        </AccordionDetails>
      </Accordion>
      <Accordion>
        <AccordionSummary
          expandIcon={<ExpandMoreIcon />}
          aria-controls="panel2a-content"
          id="panel2a-header"
        >
          <Typography sx={{ flex: 1 }}>Accordion 2</Typography>
          <Box sx={{ mr: 2, display: 'flex', gap: 1 }}>
            <IconButton 
              size="small" 
              onClick={(e) => handleEdit(e, 'panel2')}
            >
              <EditIcon fontSize="small" />
            </IconButton>
            <IconButton 
              size="small" 
              color="error"
              onClick={(e) => handleDelete(e, 'panel2')}
            >
              <DeleteIcon fontSize="small" />
            </IconButton>
          </Box>
        </AccordionSummary>
        <AccordionDetails>
          <Typography>
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse
            malesuada lacus ex, sit amet blandit leo lobortis eget.
          </Typography>
        </AccordionDetails>
      </Accordion>
      <Accordion disabled>
        <AccordionSummary
          expandIcon={<ExpandMoreIcon />}
          aria-controls="panel3a-content"
          id="panel3a-header"
        >
          <Typography sx={{ flex: 1 }}>Disabled Accordion</Typography>
          <Box sx={{ mr: 2, display: 'flex', gap: 1, opacity: 0.5 }}>
            <IconButton size="small" disabled>
              <EditIcon fontSize="small" />
            </IconButton>
            <IconButton size="small" color="error" disabled>
              <DeleteIcon fontSize="small" />
            </IconButton>
          </Box>
        </AccordionSummary>
      </Accordion>
    </div>
  );
}

关键样式说明

  • 给标题Typography加sx={{ flex: 1 }},让标题自动占满剩余可用宽度,把操作图标挤到靠近展开箭头的位置
  • 操作图标容器加mr: 2,和右侧的展开箭头留出足够间距,避免重叠
  • 用IconButton包裹图标,自带点击热区和hover效果,交互体验更好
  • 禁用状态的Accordion同步给操作按钮加disabled属性,和组件整体状态保持一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:18:20