【问题标题】:Warning findDomNode警告 findDomNode
【发布时间】:2020-07-03 23:33:30
【问题描述】:

我试图用 material-ui 和 React 制作一个选择菜单

const SelectLevelButton = forwardRef((props, ref) => {
  const [stateLevel, setStateLevel] = useState({
    level: "Easy"
  });

  const [stateMenu, setStateMenu] = useState({
    isOpen: false
  });

  const openMenuHandler = () => {
    setStateMenu({
      isOpen: true
    });
  };

  const closeMenuHandler = () => {
    setStateMenu({
      isOpen: false
    });
  };

  const buttonRef = useRef();

  console.log(buttonRef.current);

  return (
    <>
      <Menu open={stateMenu.isOpen} anchorEl={buttonRef.current} onClose={closeMenuHandler}>
        <MenuItem>Easy</MenuItem>
        <MenuItem>Normal</MenuItem>
        <MenuItem>Hard</MenuItem>
      </Menu>
      <div ref={buttonRef}>
        <Button onClick={openMenuHandler} color="inherit">{`Level: ${stateLevel.level}`}</Button>
      </div>
    </>
  );
});

export default SelectLevelButton;

但是当我单击按钮在控制台中打开菜单时,我收到以下警告: 警告:在 StrictMode 中不推荐使用 findDOMNode。 findDOMNode 被传递了一个在 StrictMode 中的 Transition 实例。相反,直接向要引用的元素添加 ref。

我该如何解决?

【问题讨论】:

标签: javascript reactjs material-ui react-hooks use-ref


【解决方案1】:

Menu 中的anchorEl 引用未定义,因为您从 buttonRef.current 开始时未定义。所以它使用 findDOMNode 代替。 请参阅 Material-UI 文档如何在打开菜单之前获取参考。

您需要像这样更改您的代码,(未经测试):

const SelectLevelButton = forwardRef((props, ref) => {
  const [anchorEl, setAnchorEl] = React.useState(null);
  const [stateLevel, setStateLevel] = useState({
    level: "Easy"
  });

  const [stateMenu, setStateMenu] = useState({
    isOpen: false
  });

  const openMenuHandler = event => {
    setAnchorEl(event.currentTarget);
    setStateMenu({
      isOpen: true
    });
  };

  const closeMenuHandler = () => {
    setStateMenu({
      isOpen: false
    });
  };

  const buttonRef = useRef(); // No need for that

  console.log(buttonRef.current);

  return (
    <>
      <Menu open={stateMenu.isOpen} anchorEl={anchorEl} onClose={closeMenuHandler}>
        <MenuItem>Easy</MenuItem>
        <MenuItem>Normal</MenuItem>
        <MenuItem>Hard</MenuItem>
      </Menu>
      <div ref={buttonRef}>
        <Button onClick={openMenuHandler} color="inherit">{`Level: ${stateLevel.level}`}</Button>
      </div>
    </>
  );
});

export default SelectLevelButton;

【讨论】:

    猜你喜欢
    • 2020-07-11
    • 2021-02-09
    • 2021-04-08
    • 2020-09-26
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 2017-05-31
    相关资源
    最近更新 更多