Эта проблема похожа на эту .Существует экземпляр Axios, который не связан с приложением React, поэтому он не может заставить модальный экземпляр взаимодействовать с ним.Связывание его с экземплярами компонентов React будет ошибкой, которая может привести к другим проблемам, например, к тестам.Надлежащий подход заключается в том, чтобы связать экземпляр Axios с конкретным экземпляром приложения и предоставить экземпляр Axios для всего приложения.
Распространенными способами сделать это являются глубоко передаваемые реквизиты, контекстный API и управление глобальным состоянием (Redux, MobX).
Например, фабричная функция Axios получает экземпляр модального компонента для его ссылки:
function axiosFactory(modalRef) {
const instance = ...;
instance.interceptors.request.use(..., function (error) {
const modalInstance = modalRef.current;
modalInstance.toggle();
});
...
}
const AxiosContext = React.createContext();
class App extends Component {
modalRef = React.createRef();
render() {
return <>
<Modal ref={this.modalRef}/>
<AxiosContext.Provider value={axiosFactory(this.modalRef)}>
...the rest of the app that depends on Axios...
</AxiosContext.Provider>
</>;
}
}
Экземпляр Axios можно получить в дочерних компонентах:
<AxiosContext.Consumer>{axios => (
<ComponentThatNeedsToGetAxiosAsProp axios={axios} />
)</AxiosContext.Consumer>
Возможность многократного использования может быть улучшена с помощью идиоматического Reactрецепты, например withAxios
компонент высшего порядка, использующий <AxiosContext.Consumer>
, как показано выше.
В случае Redux это может быть еще проще, поскольку экземпляр Axios может стать доступным в хранилище Redux и отделиться от Reactиерархия компонентов.Ему не нужно напрямую получать модальный компонент, потому что он может взаимодействовать с ним с помощью действий.