Here in this example of material-ui https://material-ui.com/utils/popover/#mouse-over-interaction
Follow these steps for the example  material-ui https://material-ui.com/utils/popover/#mouse-over-interaction
In the above example keep the mouse on the text Hover with a Popover.
--- you see the popover
Try to move your mouse near the popover --- popover disappears right?
But I wanna show the popover even if I hover on  popover
And make popover disappear only if the user is not hovering on either popover or the Hover with a Popover. (basically anchorEl)
I am copying code from their demo
  import React from 'react';
    import PropTypes from 'prop-types';
    import Popover from '@material-ui/core/Popover';
    import Typography from '@material-ui/core/Typography';
    import { withStyles } from '@material-ui/core/styles';
    const styles = theme => ({
      popover: {
        pointerEvents: 'none',
      },
      paper: {
        padding: theme.spacing.unit,
      },
    });
    class MouseOverPopover extends React.Component {
      state = {
        anchorEl: null,
      };
      handlePopoverOpen = event => {
        this.setState({ anchorEl: event.currentTarget });
      };
      handlePopoverClose = () => {
        this.setState({ anchorEl: null });
      };
      render() {
        const { classes } = this.props;
        const { anchorEl } = this.state;
        const open = Boolean(anchorEl);
        return (
          <div>
            <Typography
              aria-owns={open ? 'mouse-over-popover' : undefined}
              aria-haspopup="true"
              onMouseEnter={this.handlePopoverOpen}
              onMouseLeave={this.handlePopoverClose}
            >
              Hover with a Popover.
            </Typography>
            <Popover
              id="mouse-over-popover"
              className={classes.popover}
              classes={{
                paper: classes.paper,
              }}
              open={open}
              anchorEl={anchorEl}
              anchorOrigin={{
                vertical: 'bottom',
                horizontal: 'left',
              }}
              transformOrigin={{
                vertical: 'top',
                horizontal: 'left',
              }}
              onClose={this.handlePopoverClose}
              disableRestoreFocus
            >
              <Typography>I use Popover.</Typography>
            </Popover>
          </div>
        );
      }
    }
    MouseOverPopover.propTypes = {
      classes: PropTypes.object.isRequired,
    };
    export default withStyles(styles)(MouseOverPopover);
What code change I need to make here? You may experiment https://codesandbox.io/s/6l3wk6kv3
I had the same problem, didn't find any answer and I took a while to understand how to fix it.
Actually the problem comes from the pointerEvents: none that you need on the popover to prevent your onMouseEnter/onMouseLeave to be triggered at the same time.
But you can set for the content of your popover pointerEvents: auto.
Then you can add a onMouseEnter and a onMouseLeave on the content of your popover.
Here is an exemple to make it more explicit :
import React, { useState, useRef } from 'react';
import { makeStyles } from '@material-ui/core/styles';
import { Popover } from '@material-ui/core';
const useStyles = makeStyles(theme => ({
  popover: {
    pointerEvents: 'none',
  },
  popoverContent: {
    pointerEvents: 'auto',
  },
}));
const MyComponent = ({ loading, login, wrong, clearWrongLogin }: Props) => {
  const [openedPopover, setOpenedPopover] = useState(false)
  const popoverAnchor = useRef(null);
  const popoverEnter = ({ currentTarget }) => {
    setOpenedPopover(true)
  };
  const popoverLeave = ({ currentTarget }) => {
    setOpenedPopover(false)
  };
  const classes = useStyles();
return (
    <div>
         <span
          ref={popoverAnchor}
          aria-owns="mouse-over-popover"
          aria-haspopup="true"
          onMouseEnter={popoverEnter}
          onMouseLeave={popoverLeave}
        >Hover this el !
        </span>
        <Popover
        id="mouse-over-popover"
        className={classes.popover}
        classes={{
          paper: classes.popoverContent,
        }}
        open={openedPopover}
        anchorEl={popoverAnchor.current}
        anchorOrigin={{
          vertical: 'bottom',
          horizontal: 'right',
        }}
        transformOrigin={{
          vertical: 'top',
          horizontal: 'left',
        }}
        PaperProps={{onMouseEnter: popoverEnter, onMouseLeave: popoverLeave}}
      >
        <div>
          My popover content...
        </div>
      </Popover>
    </div>
  );
};
export default MyComponent
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With