Предупреждение findDomNode
Я пытался создать меню выбора с помощью 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;
но когда я нажимаю кнопку, чтобы открыть меню в консоли, я получаю это предупреждение: Предупреждение: findDOMNode устарел в StrictMode. findDOMNode был передан экземпляр Transition, который находится внутри StrictMode. Вместо этого добавьте ссылку непосредственно к элементу, на который вы хотите ссылаться.
Как я могу это решить?
1 ответ
Ссылка anchorEl в Меню не определена, поскольку вы получаете ее из buttonRef.current undefined при запуске. Поэтому вместо этого он использует 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;