Здравствуйте! Изучая Реакт, делаю приложение для отображения текущей погоде и столкнулся с проблемой.
Есть класс, который делает запрос погоды и и необходимые данные из ответа засовывает в объект data:
export default class AskForWeather {
getNeededData = async () => {
const city = "ulyanovsk"; //"479123";
const url = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "&appid=b1b35bba8b434a28a0be2a3e1071ae5b&units=imperial";
let data = {};
await fetch(url).then((res) => res.json()).then(json => {
data = { temperature: json.main.temp }
})
return data;
}
}
-------------------------------------------------------------------------------------
Есть основной файл, куда импортируется class AskForWeather. Стейт обновляется данными из объекта data. В компоненте Main пропсом передается temperature.
import React, { Component } from 'react';
import Main from "../main/main.js"
import AskForWeather from "../../service/parser.js"
export default class App extends Component {
constructor(props) {
super(props);
this.state = { weather: null }
}
askForWeather = new AskForWeather();
openData = () => {
this.setState(() => {
return { weather: this.askForWeather.getNeededData() }
});
}
componentDidMount() {
this.openData();
}
render() {
return(
<div className= "container">
<Header />
<Main temperature={this.state.weather.temperature}/>
<Additional />
</div>
);
}
}
-------------------------------------------------------------
Ну и Main, принимающий пропс temperature и отображающий его в верстке
import React, { Component } from 'react';
const Main = (props) => {
const temperature = props.temperature;
return (
<section className="main">
<div className="temperature">
<span>{temperature} C</span>
</div>
<div className="weather-desc">
<img className="weather" src="" alt="#"></img>
<span className="desc">Тепло</span>
</div>
</section>
)
}
export default Main;
В итоге ошибка TypeError: this.state.weather is null.
И никак не могу ее побороть. Судя по всему AskForWeather получает данные, но в основном файле почему-то не обновляется стейт. А из-за чего такое происходит? Где я ошибся?