Reactjs 使用材质UI关联菜单对表进行反应

Reactjs 使用材质UI关联菜单对表进行反应,reactjs,material-ui,react-table,Reactjs,Material Ui,React Table,我在使用物料界面菜单时遇到问题Table@v6 我希望能够右键单击表中的任意位置(行,td)并显示上下文菜单。此部件正在工作。 但我也希望能够连续右键单击表中的其他位置,并始终显示上下文菜单中的光标位置。这是行不通的。当前,您必须单击“离开”以关闭菜单,然后再次右键单击以重新打开菜单。 在Material UI演示中,这工作正常: 我采用了上面的示例来处理React表,但它并没有像预期的那样工作 我的示例采用: 您知道如何使其像示例中那样工作吗?这是因为您在Td中添加了onContextMe

我在使用
物料界面菜单
时遇到问题Table@v6

我希望能够右键单击表中的任意位置(行,td)并显示上下文菜单。此部件正在工作。
但我也希望能够连续右键单击表中的其他位置,并始终显示上下文菜单中的光标位置。这是行不通的。当前,您必须单击“离开”以关闭菜单,然后再次右键单击以重新打开菜单。
在Material UI演示中,这工作正常:

我采用了上面的示例来处理React表,但它并没有像预期的那样工作

我的示例采用:


您知道如何使其像示例中那样工作吗?

这是因为您在Td中添加了onContextMenu道具,而不是表容器

将onContext菜单移动到container div,如下所示:

<div onContextMenu={(e) => {
        e.preventDefault();
        console.log("context menu");
        this.setState({
          mouseX: e.clientX - 2,
          mouseY: e.clientY - 4
        });
      }}>
{
e、 预防默认值();
日志(“上下文菜单”);
这是我的国家({
mouseX:e.clientX-2,
穆西:e.clientY-4
});
}}>
它应该会起作用


享受吧

我最终创建了一个popper上下文菜单来复制菜单的所有材质ui行为

import React from "react";
import Popper from "@material-ui/core/Popper";
import Typography from "@material-ui/core/Typography";
import MenuList from "@material-ui/core/MenuList";
import MenuItem from "@material-ui/core/MenuItem";
import Paper from "@material-ui/core/Paper";
import { makeStyles } from "@material-ui/core/styles";
import { ClickAwayListener, Fade } from "@material-ui/core";

/* copied from https://github.com/mui-org/material-ui/blob/v4.3.2/packages/material-ui/src/Menu/Menu.js#L21 */
const useMenuStyles = makeStyles({
  /* Styles applied to the `Paper` component. */
  paper: {
    // specZ: The maximum height of a simple menu should be one or more rows less than the view
    // height. This ensures a tapable area outside of the simple menu with which to dismiss
    // the menu.
    maxHeight: "calc(100% - 96px)",
    // Add iOS momentum scrolling.
    WebkitOverflowScrolling: "touch"
  },
  /* Styles applied to the `List` component via `MenuList`. */
  list: {
    // We disable the focus ring for mouse, touch and keyboard users.
    outline: 0
  }
});

export default function FakedReferencePopper() {
  const [open, setOpen] = React.useState(false);
  const [anchorEl, setAnchorEl] = React.useState<null | any>(null);

  const handleClose = () => {
    setOpen(false);
  };

  const handleContextMenu = (e) => {
    e.preventDefault();
    const { clientX, clientY } = e;
    setOpen(true);
    const virtualElement = {
      getBoundingClientRect: () => ({
        width: 0,
        height: 0,
        top: clientY,
        right: clientX,
        bottom: clientY,
        left: clientX
      })
    };
    setAnchorEl(virtualElement);
  };

  const id = open ? "faked-reference-popper" : undefined;
  const menuClasses = useMenuStyles();
  return (
    <div>
      <div onContextMenu={handleContextMenu}>
        <Typography aria-describedby={id}>
          Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ipsum
          purus, bibendum sit amet vulputate eget, porta semper ligula. Donec
          bibendum vulputate erat, ac fringilla mi finibus nec. Donec ac dolor
          sed dolor porttitor blandit vel vel purus. Fusce vel malesuada ligula.
          Nam quis vehicula ante, eu finibus est. Proin ullamcorper fermentum
          orci, quis finibus massa. Nunc lobortis, massa ut rutrum ultrices,
          metus metus finibus ex, sit amet facilisis neque enim sed neque.
          Quisque accumsan metus vel maximus consequat. Suspendisse lacinia
          tellus a libero volutpat maximus. Lorem ipsum dolor sit amet,
          consectetur adipiscing elit. Nullam ipsum purus, bibendum sit amet
          vulputate eget, porta semper ligula. Donec bibendum vulputate erat, ac
          fringilla mi finibus nec. Donec ac dolor sed dolor porttitor blandit
          vel vel purus. Fusce vel malesuada ligula. Nam quis vehicula ante, eu
          finibus est. Proin ullamcorper fermentum orci, quis finibus massa.
          Nunc lobortis, massa ut rutrum ultrices, metus metus finibus ex, sit
          amet facilisis neque enim sed neque. Quisque accumsan metus vel
          maximus consequat. Suspendisse lacinia tellus a libero volutpat
          maximus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
          Nullam ipsum purus, bibendum sit amet vulputate eget, porta semper
          ligula. Donec bibendum vulputate erat, ac fringilla mi finibus nec.
          Donec ac dolor sed dolor porttitor blandit vel vel purus. Fusce vel
          malesuada ligula. Nam quis vehicula ante, eu finibus est. Proin
          ullamcorper fermentum orci, quis finibus massa. Nunc lobortis, massa
          ut rutrum ultrices, metus metus finibus ex, sit amet facilisis neque
          enim sed neque. Quisque accumsan metus vel maximus consequat.
          Suspendisse lacinia tellus a libero volutpat maximus. Lorem ipsum
          dolor sit amet, consectetur adipiscing elit. Nullam ipsum purus,
          bibendum sit amet vulputate eget, porta semper ligula. Donec bibendum
          vulputate erat, ac fringilla mi finibus nec. Donec ac dolor sed dolor
          porttitor blandit vel vel purus. Fusce vel malesuada ligula. Nam quis
          vehicula ante, eu finibus est. Proin ullamcorper fermentum orci, quis
          finibus massa. Nunc lobortis, massa ut rutrum ultrices, metus metus
          finibus ex, sit amet facilisis neque enim sed neque. Quisque accumsan
          metus vel maximus consequat. Suspendisse lacinia tellus a libero
          volutpat maximus. Lorem ipsum dolor sit amet, consectetur adipiscing
          elit. Nullam ipsum purus, bibendum sit amet vulputate eget, porta
          semper ligula. Donec bibendum vulputate erat, ac fringilla mi finibus
          nec. Donec ac dolor sed dolor porttitor blandit vel vel purus. Fusce
          vel malesuada ligula. Nam quis vehicula ante, eu finibus est. Proin
          ullamcorper fermentum orci, quis finibus massa. Nunc lobortis, massa
          ut rutrum ultrices, metus metus finibus ex, sit amet facilisis neque
          enim sed neque. Quisque accumsan metus vel maximus consequat.
          Suspendisse lacinia tellus a libero volutpat maximus. Lorem ipsum
          dolor sit amet, consectetur adipiscing elit. Nullam ipsum purus,
          bibendum sit amet vulputate eget, porta semper ligula. Donec bibendum
          vulputate erat, ac fringilla mi finibus nec. Donec ac dolor sed dolor
          porttitor blandit vel vel purus. Fusce vel malesuada ligula. Nam quis
          vehicula ante, eu finibus est. Proin ullamcorper fermentum orci, quis
          finibus massa. Nunc lobortis, massa ut rutrum ultrices, metus metus
          finibus ex, sit amet facilisis neque enim sed neque. Quisque accumsan
          metus vel maximus consequat. Suspendisse lacinia tellus a libero
          volutpat maximus.
        </Typography>
      </div>

      <Popper
        id={id}
        open={open}
        anchorEl={anchorEl}
        transition
        placement="bottom-start"
      >
        {({ TransitionProps }) => (
          <ClickAwayListener onClickAway={handleClose}>
            <Fade {...TransitionProps}>
              <Paper className={menuClasses.paper}>
                <MenuList className={menuClasses.list} autoFocus>
                  <MenuItem onClick={handleClose}>Profile</MenuItem>
                  <MenuItem onClick={handleClose}>My account</MenuItem>
                  <MenuItem onClick={handleClose}>Logout</MenuItem>
                </MenuList>
              </Paper>
            </Fade>
          </ClickAwayListener>
        )}
      </Popper>
    </div>
  );
}

从“React”导入React;
从“@material ui/core/Popper”导入Popper;
从“@material ui/core/Typography”导入排版;
从“@material ui/core/MenuList”导入菜单列表;
从“@material ui/core/MenuItem”导入菜单项;
从“@material ui/core/Paper”导入纸张;
从“@material ui/core/styles”导入{makeStyles}”;
从“@material ui/core”导入{ClickAwayListener,Fade}”;
/*抄袭https://github.com/mui-org/material-ui/blob/v4.3.2/packages/material-ui/src/Menu/Menu.js#L21 */
const useMenuStyles=makeStyles({
/*应用于“纸张”组件的样式*/
论文:{
//specZ:简单菜单的最大高度应比视图小一行或多行
//高度。这确保了在简单菜单之外有一个可点击的区域,可以用它来关闭
//菜单。
最大高度:“计算(100%-96px)”,
//添加iOS动量滚动。
WebKit浏览:“触摸”
},
/*通过“菜单列表”应用于“列表”组件的样式*/
名单:{
//我们为鼠标、触摸屏和键盘用户禁用聚焦环。
大纲:0
}
});
导出默认函数FakedReferencePopper(){
const[open,setOpen]=React.useState(false);
常量[anchorEl,setAnchorEl]=React.useState(null);
常量handleClose=()=>{
setOpen(假);
};
const handleContextMenu=(e)=>{
e、 预防默认值();
常数{clientX,clientY}=e;
setOpen(真);
常量虚拟元素={
getBoundingClientRect:()=>({
宽度:0,
高度:0,,
上图:clientY,
右:clientX,
底部:clientY,
左:clientX
})
};
setAnchorEl(虚拟设备);
};
常量id=打开?“伪造参考提升阀”:未定义;
const menuClasses=useMenuStyles();
返回(
公共知识是一种美德,是一种美德
purus,bibendum坐在一个地方,在一个地方
这是一个非常复杂的问题,它是一个非常复杂的问题
这是一种温和的语言,是一种温和的语言。
Nam quis vehicula ante,eu finibus est.Proin ullamcorper发酵液
奥奇,我是菲尼布斯·马萨,努克·洛博蒂斯,马萨·乌特鲁姆·尤里塞斯,
完成任务前,坐在设备旁边。
拉西尼亚悬钩子
告诉我们一个自由的人,帕特·马克西姆斯,洛雷姆·伊普斯姆·多尔·西特,
献身于社会精英。不为他人所用,不为他人所用
这是一个非常复杂的问题,需要解决
我是菲尼布,我是布朗迪特
平底。马勒苏阿达舌苔。南奎斯交通工具,欧盟
finibus est.Proin ullamcorper酵母菌orci,quis finibus massa。
努克·洛博蒂斯,尤特丽斯之路,最后一站
这是一个很好的方法
马克西姆斯·康塞奎特。拉齐尼亚·特鲁斯自由女神
最大限度地尊重他人,尊重他人。
无同侧腹,无同侧腹,无同侧腹,无同侧腹
这是一个很好的例子。
请不要把它放在温和的地方
马莱苏阿达·利古拉。南奎斯交通工具,欧盟终点站
马萨菲尼布斯奥奇发酵酒。马萨洛博蒂斯修女酒店
乌特丽斯酒店,豪华酒店,设施齐全
这是一个很好的例子。
大蜗牛悬钩子
多洛·希特·阿梅特,一位杰出的献身者。无我之名,
比班杜姆坐在我的座位上,在我的门上
这是一个很好的例子
布朗迪特·维勒·普鲁斯·维勒·维勒·马莱苏达·利古拉·纳姆·奎斯
前车辆,eu finibus est.Proin ullamcorper酵母菌orci,quis
菲尼布斯·马萨,努克·洛博蒂斯,乌尔特里斯,梅特斯·梅特斯
完成后,坐在一个设备上,不需要任何设备
这是一个自由的人
大蜗牛
第二,第二,第二,第三,第三,第三
这是一个很好的选择,因为它是一个很好的选择
必须在温和的环境下进行交流。