reactjs 是否可以在ButtonGroup中禁用的MUI按钮上呈现工具提示而不破坏布局?

bejyjqdl  于 2023-02-15  发布在  React
关注(0)|答案(4)|浏览(158)

我正在尝试创建一个带有禁用按钮和工具提示的MUI ButtonGroup
以下代码块正确显示了按钮,但如此处所述(https://material-ui.com/components/tooltips/#disabled-elements),禁用的元素无法提供工具提示。

<ButtonGroup>
    <Tooltip title={"This is button A"}>
        <Button>{"Button A"}</Button>
    </Tooltip>
    <Tooltip title={"This is button B"}>
        <Button disabled>{"Button B"}</Button>
    </Tooltip>
</ButtonGroup>

但如果我在禁用按钮周围添加span,组布局将被破坏。

<ButtonGroup>
    <Tooltip title={"This is button A"}>
        <Button>{"Button A"}</Button>
    </Tooltip>
    <Tooltip title={"This is button B"}>
        <span>
            <Button disabled>{"Button B"}</Button>
        </span>
    </Tooltip>
</ButtonGroup>
zour9fqk

zour9fqk1#

是的,这是可能的.你需要把你的按钮 Package 在span标签示例中

<Tooltip title={YOUR_MESSAGE_HERE}>
   <span>
     <Button disabled>my button is disabled</Button>
   </span>
</Tooltip>
iyzzxitl

iyzzxitl2#

禁用按钮有两个方面会妨碍工具提示行为:
1.如您参考的文档中所述,禁用的<button>元素(独立于Material-UI)不会以支持工具提示正确行为的方式激发事件。
1.禁用时,材料UI专门禁用材料UI的ButtonBase组件(由Button利用)中的指针事件。
第二个问题可以通过覆盖Material-UI的禁用样式以允许指针事件来解决:

import MuiButton from "@material-ui/core/Button";
import { withStyles } from "@material-ui/core/styles";

const Button = withStyles({
  root: {
    "&.Mui-disabled": {
      pointerEvents: "auto"
    }
  }
})(MuiButton);

第一个问题可以通过使用Button的component prop来使用<div>元素而不是<button>元素来解决。禁用的Button元素不接收单击事件,因此为了使Button仍然以禁用方式运行,此代码在禁用onClick prop时将其删除。

const ButtonWithTooltip = ({ tooltipText, disabled, onClick, ...other }) => {
    const adjustedButtonProps = {
      disabled: disabled,
      component: disabled ? "div" : undefined,
      onClick: disabled ? undefined : onClick
    };
    return (
      <Tooltip title={tooltipText}>
        <Button {...other} {...adjustedButtonProps} />
      </Tooltip>
    );
  };

下面是同时禁用按钮B和C的工作演示。按钮A和B使用上述方法,按钮C是一个常规的物料UI按钮,没有用于比较的工具提示。它们下面的附加按钮用于切换B和C的禁用状态。

import React from "react";
import Tooltip from "@material-ui/core/Tooltip";
import MuiButton from "@material-ui/core/Button";
import { withStyles } from "@material-ui/core/styles";
import ButtonGroup from "@material-ui/core/ButtonGroup";

const Button = withStyles({
  root: {
    "&.Mui-disabled": {
      pointerEvents: "auto"
    }
  }
})(MuiButton);

const ButtonWithTooltip = ({ tooltipText, disabled, onClick, ...other }) => {
  const adjustedButtonProps = {
    disabled: disabled,
    component: disabled ? "div" : undefined,
    onClick: disabled ? undefined : onClick
  };
  return (
    <Tooltip title={tooltipText}>
      <Button {...other} {...adjustedButtonProps} />
    </Tooltip>
  );
};

export default function App() {
  const [bAndCDisabled, setBAndCDisabled] = React.useState(true);

  return (
    <>
      <ButtonGroup>
        <ButtonWithTooltip
          tooltipText="This is Button A"
          onClick={() => console.log("A")}
        >
          {"Button A"}
        </ButtonWithTooltip>
        <ButtonWithTooltip
          tooltipText="This is Button B"
          onClick={() => console.log("B")}
          disabled={bAndCDisabled}
        >
          {"Button B"}
        </ButtonWithTooltip>
        <MuiButton onClick={() => console.log("C")} disabled={bAndCDisabled}>
          {"Button C"}
        </MuiButton>
      </ButtonGroup>
      <br />
      <br />
      <MuiButton
        variant="contained"
        onClick={() => setBAndCDisabled(!bAndCDisabled)}
      >
        Toggle disabled for B and C
      </MuiButton>
    </>
  );
}

jgwigjjp

jgwigjjp3#

在按钮周围添加div/span有时会扰乱按钮的样式。因此,我们最好使用<><React.Fragment>。但是,工具提示不适用于react片段,因此我们可以使用问题中提到的<span>。但是,在这种情况下,由于此处使用ButtonGroup,并且ButtonGroup通过克隆子按钮元素并传递样式属性来工作,在这种情况下,我们必须将样式 prop 发送到“按钮B”。

import React from "react";
import "./styles.css";
import { Tooltip, Button } from "@material-ui/core";
import ButtonGroup from "@material-ui/core/ButtonGroup";

export default function App() {
  const ButtonDemo = (props) => {
    return (
      <Tooltip title={"This is button B"}>
        <span>
          <Button {...props} disabled>
            {"Button B"}
          </Button>
        </span>
      </Tooltip>
    );
  };

  return (
    <ButtonGroup>
      <Tooltip title={"This is button A"}>
        <Button>{"Button A"}</Button>
      </Tooltip>
      <ButtonDemo />
    </ButtonGroup>
  );
}

pokxtpni

pokxtpni4#

对于mui〉v5,使用此选项

<Tooltip title={YOUR_MESSAGE_HERE}>
  <Button disabled>
    <span>
     my button is disabled
    </span>
  </Button>
</Tooltip>

相关问题