首页 > 解决方案 > 如何使用 MUI 以编程方式显示“涟漪效应”?

问题描述

基本上是标题。我想在我的 MUI 按钮集合上手动显示涟漪效果 - 当我单击按钮时,涟漪效果会起作用,但我找不到以编程方式显示涟漪效果的方法。

我是否需要禁用 MUI 的涟漪效果,然后制作我自己的涟漪效果功能,我可以附加到onClick

{this.buttons.map((button) => (
    <React.Fragment key={button.name}>
        {button.render ? (
                <div className="col-3">
                    <Button
                        autoFocus={true}
                        className="w-100 p-3"
                        variant="contained"
                        color="primary"
                        classes={{root: classes.button}}
                        disableElevation
                        onClick={() => {updateState(button.onClick(text))}}
                    >
                        {button.keyCode}
                    </Button>                               
                </div>
        ) : (<></>)}
    </React.Fragment>
))}

标签: reactjsmaterial-uiripple

解决方案


Button在引擎盖下使用的ButtonBase用途。TouchRipple这是ButtonBase定义的片段:

function ButtonBase(props) {
  // ...

  return (
    <ButtonBaseRoot>
      {children}
      <TouchRipple ref={rippleRef} center={centerRipple} {...TouchRippleProps} />
    </ButtonBaseRoot>
  )
}

没有 API 可以手动触发波纹。它是在按钮内部处理的,所以为了做到这一点,您需要创建和控制您自己的 MUI 提供的波纹组件:

import TouchRipple from '@mui/material/ButtonBase/TouchRipple';
const rippleRef = React.useRef(null);
const buttonRef = React.useRef(null);
const triggerRipple = () => {
  const container = buttonRef.current;
  const rect = container.getBoundingClientRect();

  rippleRef.current.start(
    {
      clientX: rect.left + rect.width / 2,
      clientY: rect.top + rect.height / 2,
    },
    // when center is true, the ripple doesn't travel to the border of the container
    { center: false },
  );

  setTimeout(() => rippleRef.current.stop({}), 320);
};

return (
  <div>
    <Button onClick={triggerRipple}>start ripple</Button>
    <Box display="flex" justifyContent="center" m={10}>
      <Button
        variant="contained"
        color="primary"
        ref={buttonRef}
        sx={{ display: 'relative' }}
      >
        My little ripple
        <TouchRipple ref={rippleRef} center />
      </Button>
    </Box>
  </div>
);

现场演示

Codesandbox 演示

相关答案


推荐阅读