Проблема 1 в вызове AJAX
function GetUsers(project){
$.ajax({
url: "https://jsonplaceholder.typicode.com/users",
success: function (data) {
console.log(data);
callback(null, data);
},
error: function (error) {
console.log(data);
callback(error, {});
}
});
}
$.ajax
- это асинхронный вызов, это означает, что он не возвращает напрямую никакого значения (как он мог бы, если он выбирает результаты из Интернета), он просто создает другую функцию, которая будет вызывать success
и error
, когда завершено.
Вот почему нам нужно обернуть его обратными вызовами
function GetUsers(project, resolve = () => {}, reject = () => {}) {
}
Проблема 2 в креплении
componentDidMount() {
GetUsers(null, function (err, data) {
if (err)
{
console.log(err);
}// do something
this.setState({ users: data })
}.bind(this))
}
Этот код совершенно неправильный, в нем даже есть синтаксическая ошибка, поэтому не стоит обсуждать это подробно.
Нам нужно вызвать нашу новую функцию и передать успешный обратный вызов для изменения состояния
GetUsers(null, users => {
this.setState({ users });
});
Таким образом мы будем вызывать GetUsers
дождаться его результатов и только после этого мы будем мутировать состояние с новым результатом
3 проблема при создании компонента
Компоненты React не имеют состояния по умолчанию, вам нужно вывести состояние из конструктора, поэтому нам нужно изменить инициализацию на
constructor(props) {
super(props);
this.state = {
users: false
};
}
в противном случае вы получите Cannot call setState of undefined
, так как состояние не создается автоматически для повышения производительности, и все компоненты по умолчанию Pure.
Я создал рабочую песочницу здесь