I aim to create a custom MUI accordion which should look like this: Accordion aim look

现在,我已经try 使用这些代码 struct 创建这个自定义MUI Accordion(此Accordion还使用了一些自定义搜索框功能和自定义Accordion数据)

手风琴源代码:

import * as React from "react";
import { useState } from "react";
import AccordionMUI 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 "./globals.css";
import { accordionData } from "./accordionData.js";
import AddCircleIcon from "@mui/icons-material/AddCircle";
import RemoveCircleIcon from "@mui/icons-material/RemoveCircle";


export default function SimpleAccordion() {
  const [search, setSearch] = useState("");
  return (
    <div>
      <input
        onChange={(e) => setSearch(e.target.value)}
        type="text"
        placeholder="Search"
      />

      {accordionData
        .filter((item) => {
          return search.toLowerCase() === ""
            ? item
            : item.sectionTitle.toLowerCase().includes(search);
        })
        .map((item) => (
          <AccordionMUI key={item.id} className="accordionMui">
            <AccordionSummary
              expandIcon={<AddCircleIcon sx={{ color: "#384558" }} />}
              aria-controls="panel1a-content"
              id="panel1a-header"
            >
              <Typography>
                <b>{item.sectionTitle}</b>
              </Typography>
            </AccordionSummary>
            <AccordionDetails>
              <Typography>{item.sectionContent}</Typography>
            </AccordionDetails>
          </AccordionMUI>
        ))}
    </div>
  );
}

CSS样式源代码:

.accordionMui {
  background-color: rgba(242, 242, 242, 0.1);
  box-shadow: none;
  color: #384558;
}

#panel1a-header {
  padding-top: 5%;
  padding-bottom: 5%;
}

完整的工作演示在这里CodeSandbox.

It currently looks like this: current look accordion

我的问题是,我的手风琴的最后一条分隔线没有显示出来,不像它之前的部分,在它们下面有一条分隔线.我还想覆盖手风琴分隔线的样式并使其更粗.

我还想将折叠图标更改为它们各自的状态(未展开的Accordion将显示AddCircleIcon,展开的Accordion将显示RemoveCircleIcon),但出现了一个问题,当我使用这个三元条件expanded={expanded === 'panel1'}时显示Cannot find name 'expanded',就像这个堆栈接受的问题(How to change icon when accordion summary is expanded?)一样.因此,我不确定如何更改基于展开或未展开状态的折叠图标.

我仍然很困惑,也不确定我应该在Accordion API of MUI上使用哪些类,获得一些关于正确定制和覆盖MUI中的手风琴组件的指南将会有很大的帮助,因为我还在学习MUI.

在这个问题上,你的回答确实会对我有很大帮助.非常感谢.

推荐答案

您可以这样做:

  1. 展开时更改为其他图标:

就像这个堆栈接受的问题(展开手风琴摘要时如何更改图标?)因此,我不确定如何更改基于展开或未展开状态的折叠图标.

->;根据the mui accordion documentation和堆栈中的问题做的方式几乎相同:

您需要将状态设置为处理AccordionMUI,并使用icons进行控制.

...
  const [expanded, setExpanded] = React.useState(false);
  const handleChange = (panel) => (event, newExpanded) => {
    setExpanded(newExpanded ? panel : false);
  };
...
  <AccordionMUI
     key={item.id}
    //set unique item id for each accordion
     expanded={expanded === item.id}
     onChange={handleChange(item.id)}
     className="accordionMui"
  >
  <AccordionSummary
     expandIcon={
     expanded === item.id ? <RemoveCircleIcon /> : 
     <AddCircleIcon />
     } 
  >
  ...
...
  1. 使分隔线更粗(&I)缺少分隔线(&I)

-->;您需要删除此选项:(以显示背景色而不是box-shadow)

box-shadow: none;

Updated demo:

Edit BasicAccordion demo — Material UI (forked)

我希望这能帮到你!

Reactjs相关问答推荐

sourceBuffer. appendBuffer成功,但h5视频播放器卡住了

cypress 不能点击SPAN

REACTION 18功能组件正在开发中的S

在Reaction中的第一次装载时,Use Effect返回空数组

悬停轴时重新绘制自定义参照线

在 React 中使用forwardRef时无法声明自定义属性

使用reactrouterdom时显示"对象无效作为React子组件"错误

无法使axiosmockadapter正常工作

在 CrafterCMS Studio 中拖动字段

无法访问 usefocusEffect 中 const 的更新状态

如何初始化 redux 全局存储 preloadedState

使用 MuiCssBaseline 在所有 MUI v5 标签上设置边距 0

改变输入的默认值时出现问题:number react-hook-form

如何使用 React 更改 Material UI 中 ButtonGroup 的 colored颜色 ?

将props 传递给 NextJS 布局组件

@react-three/postprocessing 没有匹配的从 three.module.js 导出以导入WebGLMultisampleRenderTarget

如何避免在 react useEffect 上滚动时出现小的延迟?

React CSSTransition 两次创建新页面并在这两个相同的页面上运行转换

用 scss 覆盖 MUI

单击当前子div时如何更改p标签的图像和样式?react