Я пытаюсь установить для переменной состояния значение глобальной переменной внутри componentWillMount.
Я делаю вызовы API, основываясь на интересах пользователя (используя функцию forEach), и я пытаюсь сохранить результаты в глобальной переменной, чтобы затем сохранить ее в переменной состояния (пользователь: {article}).
По какой-то причине в рендере переменная this.state.user.articles
всегда пуста.Я что-то пропустил ?
Вот как я устанавливаю начальное значение:
class Home extends Component {
constructor(props){
super(props);
this.state = {
user :{
articles: [],
}
}
this.componentWillMount.bind(this);
}
Здесь я делаю вызовы API и пытаюсь использовать this.setState
для обновления переменной
async componentWillMount(){
const loggedUser = await Auth.currentAuthenticatedUser();
const userEntry = await API.get(apiName,path + loggedUser.username);
console.log(userEntry)
currentInterests = userEntry.userInterests;
currentInterests.forEach(async function (interest) {
console.log(interest);
let query = 'q='+interest+'&';
let url = 'https://newsapi.org/v2/everything?' +
query +
'from=2019-02-22&' +
'sortBy=popularity&' +
'apiKey=hiddenforsecurity';
let req = new Request(url);
const response = await fetch(req);
const json = await response.json();
console.log(typeof json.articles);
for(var key in json.articles){
results.push(json.articles[key])
}
console.log(results[15]);
});
this.setState({
user : {
articles: results,
}
})
}
В то время как console.log(results[15])
возвращает ожидаемый элемент, при рендеринге console.log(this.state.user.articles)
из
render() {
console.log(this.state.user.articles)
return (
<ul>
{this.state.user.articles.map((article, index) => {
console.log(article.author)
return (<li key={index}>{article.author}</li>)})}
</ul>
);
}
возвращает пустой массив, как тот, который установлен в конструкторе, что означает, что функция
this.setState({
user : {
articles: results,
}
})
из componentWillMount не имеет никакого эффекта.Чего мне не хватает?Я пробовал бесчисленные исправления онлайн, и ничто, кажется, не работает.