Я использую библиотеку materialize css в своем приложении React. Итак, я хочу использовать «модальный» из него. Есть 2 способа его инициализации:
document.addEventListener('DOMContentLoaded', function() {
var elems = document.querySelectorAll('.modal');
var instances = M.Modal.init(elems, options);
});
// Or with jQuery
$(document).ready(function(){
$('.modal').modal();
});
Итак, я обычно делаю 2-й способ:
componentDidMount() {
const $ = window.$;
$('.dropdown-trigger').dropdown();
$(document).ready(function () {
$('.modal').modal();
})
}
И все это работало для меня, но теперь у меня есть дополнительный метод в моем ComponentDidMount(), который запрашивает API сервера:
componentDidMount() {
this.getCurrentUser();
const $ = window.$;
$('.dropdown-trigger').dropdown();
$(document).ready(function () {
$('.modal').modal();
})
}
getCurrentUser() {
fetch('api/user/'+ localStorage.getItem("currentUser") +'/me', {
method: 'GET',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
}
})
.then(response => {
if (!response.ok) {
this.setState({
isLoadong: false,
failed: true
})
}
else {
response.json().then(user => {
this.setState({
user: user,
isLoadong: false,
failed: false
})
});
}
})
}
Так почему модальное окно не работает сейчас? Как сделать все правильно?
Это довольно плохая реализация. Я бы посоветовал изучить библиотеки реагирования, которые вы могли бы использовать. В сети их куча!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы хотите использовать jQuery только в конечных узлах древовидной структуры вашего приложения React. Если у этого компонента есть дочерние компоненты, это плохая идея. Если это компонент листового узла, вам нужно поместить свою логику jQuery в функцию componentDidMount().
На этой странице есть полезные материалы по теме: https://reactjs.org/docs/интеграция-с-другими-библиотеками.html
Спасибо! И у вас есть идея, почему он перестает работать, когда я добавляю метод this.getCurrentUser() в componentDidMount?
Извините, я не знаю. Это не выглядит плохо. Я бы попробовал добавить улов после вашего тогда. Что-то вроде .then(// code).catch((err) => { console.info('error: ' + err); })
Не надо! Используйте библиотеку реактивных материалов