Добро пожаловать в stackoverflow!
Как вы узнали, вам не следует создавать глобальные переменные. (В общем, это не лучшая идея)
Вы используете функциональный компонент function App()
какой человек вы можете использовать React Hooks
Вы можете использовать useEffect
крючок для замены window.onload
и useState
, чтобы иметь внутреннее состояние для компонента.
Примерно так:
import React, { useEffect, useState } from "react";
import logo from './logo.png';
import './App.css';
import Skycons from 'react-skycons';
function App() {
const [state, setState] = useState({
long: null,
lat: null,
temperatureDescription: "",
temperatureDegree: 0,
locationTimezone: "",
minimalna: 0,
maksymalna: 0,
icons: ""
});
useEffect(() => {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(position => {
// save lat/long to save in state and later use
const lat = position.coords.latitude;
const long = position.coords.longitude;
setState({
...state,
lat,
long
});
const proxy = "https://cors-anywhere.herokuapp.com/";
const api = `${proxy}https://api.darksky.net/forecast/1539bbb708779eef3993021296196cb2/${lat},${long}`; // <-- use lat/long
fetch(api)
.then(response => {
return response.json();
})
.then(data => {
console.log(data);
const { temperature, summary, icon } = data.currently;
const celcjusz = ((temperature - 32) * 5) / 9;
const { temperatureLow } = data.daily.data[1];
const celcjusz1 = ((temperatureLow - 32) * 5) / 9;
const { temperatureMax } = data.daily.data[1];
const celcjusz2 = ((temperatureMax - 32) * 5) / 9;
setState({
...state,
temperatureDescription: summary,
temperatureDegree: Math.floor(celcjusz),
locationTimezone: data.timezone,
minimalna: Math.floor(celcjusz1),
maksymalna: Math.floor(celcjusz2),
icons: icon.replace(/-/g, "_").toUpperCase() //there is defined
});
});
});
}
}, []);
return (
<div className="App">
<img src={logo} className="App-logo" alt="logo" />
<div class="location">
<h1 class="location-timezone"> Lokalizacja </h1>
<Demo icons={state.icons} />
</div>
<div class="temperature">
<div class="degree-section">
<h2 class="temperature-degree"> Brak </h2>
<span> {state.temperatureDegree}°C </span>
</div>
<div class="temperature-description">
{" "}
{state.temperatureDescription}{" "}
</div>
</div>
<div class="sekcja-jutro">
<h1>Pogoda na Jutro: </h1>
</div>
<div class="minimalna">
<span>Minimalna:</span>
<h1 class="temperatura-minimalna"> Brak </h1>
<span> {state.minimalna}°C </span>
</div>
<div class="maksymalna">
<span>Maksymalna:</span>
<h1 class="temperatura-maksymalna"> Brak </h1>
<span>{state.maksymalna}°C</span>
</div>
</div>
);
}
class Demo extends React.Component {
render() {
return (
<Skycons
class="icon"
color="white"
icon={this.props.icons} //There I make display icon as anything is in "icons" variable but after compiling I got error that icons is not defined
autoplay={true}
height="130"
/>
);
}
}
export default App;
Я не тестировал его, работает ли он, но теоретически это должно быть вашей целью. Пожалуйста, не запускайте useEffect
после рендеринга. Это означает, что при желании вы можете показывать анимацию загрузки или текст до long!=null
для лучшего взаимодействия с пользователем.