Упомянутое вами сообщение об ошибке «Компонентам функции меню пользовательского интерфейса материала не могут быть присвоены ссылки. Попытки получить доступ к этой ссылке завершится неудачей», обычно возникает при использовании компонента меню пользовательского интерфейса материала с компонентами на основе функций в React. Функциональные компоненты в React по умолчанию не поддерживают атрибут ref, поэтому вы сталкиваетесь с этой ошибкой.
Чтобы решить эту проблему, вы можете попробовать несколько способов:
- Используйте компонент класса: преобразуйте компонент-функцию в компонент класса. Компоненты класса поддерживают атрибут ref, позволяющий получить доступ к ссылке на компонент меню. Вот пример того, как это можно сделать:
import React, { Component } from 'react';
import Menu from '@material-ui/core/Menu';
class MyComponent extends Component {
constructor(props) {
super(props);
this.menuRef = React.createRef();
}
render() {
return (
<div>
<button onClick={() => this.menuRef.current.open()}>
Open Menu
</button>
<Menu ref={this.menuRef}>
{/* Menu items */}
</Menu>
</div>
);
}
}
- Используйте функцию frontRef. Если вы хотите сохранить свой компонент как функциональный компонент, вы можете использовать функцию
forwardRefиз React для пересылки ссылки на базовый элемент DOM. Вот пример:
import React, { useRef } from 'react';
import Menu from '@material-ui/core/Menu';
const MyComponent = React.forwardRef((props, ref) => {
const menuRef = useRef(null);
React.useImperativeHandle(ref, () => ({
open: () => {
menuRef.current.open();
},
close: () => {
menuRef.current.close();
},
// Other methods you want to expose
}));
return (
<div>
<button onClick={() => menuRef.current.open()}>
Open Menu
</button>
<Menu ref={menuRef}>
{/* Menu items */}
</Menu>
</div>
);
});
- Используйте компонент высшего порядка (HOC). Вы можете создать компонент более высокого порядка, который обертывает компонент меню и обрабатывает ссылку за вас. Этот подход позволяет использовать компонент «Меню» с функциональными компонентами без изменения исходного компонента. Вот пример:
import React, { useRef } from 'react';
import Menu from '@material-ui/core/Menu';
const withMenuRef = (WrappedComponent) => {
const WithMenuRef = (props) => {
const menuRef = useRef(null);
return (
<WrappedComponent
{...props}
menuRef={menuRef}
openMenu={() => menuRef.current.open()}
/>
);
};
return WithMenuRef;
};
const MyComponent = ({ menuRef, openMenu }) => {
return (
<div>
<button onClick={openMenu}>
Open Menu
</button>
<Menu ref={menuRef}>
{/* Menu items */}
</Menu>
</div>
);
};
export default withMenuRef(MyComponent);
Это несколько методов, которые можно использовать для решения проблемы «Компонентам функции меню Material UI не могут быть присвоены ссылки». Выберите метод, который лучше всего соответствует вашему проекту и стилю кодирования.