Material-UI:仅通过单击图标来展开手风琴

Ais*_*ya 10 css accordion modern-ui reactjs material-ui

我为我的项目创建了一个手风琴。但我希望仅在单击展开图标时才展开面板。目前,它正在通过单击面板上的任意位置进行扩展。我们可以定制它的扩展行为吗?

代码:

import React from "react";
import ExpandMoreIcon from "@material-ui/icons/ExpandMore";
import Accordion from "@material-ui/core/Accordion";
import AccordionDetails from "@material-ui/core/AccordionDetails";
import Typography from "@material-ui/core/Typography";
import AccordionSummary from "@material-ui/core/AccordionSummary";

export default function App() {
return (
    <div style={{}}>
    <h4>How to create Accordion in ReactJS?</h4>
    <Accordion style={{ width: 400}}>
        <AccordionSummary 
         expandIcon={<ExpandMoreIcon />}
         aria-controls="panel1a-content"
        >   
          <div>Click to Expand</div>
        </AccordionSummary>
        <AccordionDetails>
        <Typography>Greetings of the day :)</Typography>
        </AccordionDetails>
    </Accordion>
    </div>
);
}
Run Code Online (Sandbox Code Playgroud)

Abd*_*min 11

是的,我们可以这样做

1-使用处理程序创建我们自己的状态:

  const [expand, setExpand] = React.useState(false);
  const toggleAcordion = () => {
    setExpand((prev) => !prev);
  };
Run Code Online (Sandbox Code Playgroud)

2- 将我们的状态添加到 Accordion 中:

<Accordion expanded={expand} style={{ width: 400 }}>

3-添加onClick图标:

    <AccordionSummary
      expandIcon={<ExpandMoreIcon />}
      aria-controls="panel1a-content"
      IconButtonProps={{
        onClick: toggleAcordion
      }}
    >
Run Code Online (Sandbox Code Playgroud)

完整代码:

Codesandbox 演示

编辑:解释: Material-UI Accordion 有自己的状态(打开或关闭)和自己的单击处理程序,我们上面所做的是创建自己的状态并通过 prop 覆盖 Material-UI Accordion 状态,expanded并将事件侦听器添加onClick到icon 按钮通过 prop IconButtonProps,我们的事件监听器将通过更改我们的状态来打开或关闭手风琴。

注意:上面的代码不会改变光标指针的样式。

  • 对于 v5,请参阅我的回答 (2认同)

Nea*_*arl 8

没有公共 API 可以开箱即用地执行您想要的操作,但您可以使用以下CSS 技巧

V5

<AccordionSummary
  sx={{
    pointerEvents: "none"
  }}
  expandIcon={
    <ExpandMoreIcon
      sx={{
        pointerEvents: "auto"
      }}
    />
  }
>
Run Code Online (Sandbox Code Playgroud)

V4

const useStyles = makeStyles({
  summary: {
    pointerEvents: 'none',
  },
  icon: {
    pointerEvents: 'auto',
  },
});
Run Code Online (Sandbox Code Playgroud)
<AccordionSummary
  className={classes.summary}
  expandIcon={<ExpandMoreIcon className={classes.icon} />}
>
  <Typography>Accordion 1</Typography>
</AccordionSummary>
Run Code Online (Sandbox Code Playgroud)

现场演示

Codesandbox 演示


use*_*930 6

对于 v5,并正确设置鼠标光标:

1-使用处理程序创建我们自己的状态:

const [accordionOpen, setAccordionOpen] = React.useState(false);
Run Code Online (Sandbox Code Playgroud)

2- 将我们的状态添加到手风琴并点击切换:

<Accordion expanded={accordionOpen}>
    <AccordionSummary
      expandIcon={
        <ExpandMoreIcon
          style={{ cursor: 'pointer' }}
          onClick={() => setAccordionOpen(!accordionOpen)} />
      }
      sx={{ cursor: 'unset !important' }}
    >
Run Code Online (Sandbox Code Playgroud)