Reputation: 161
I want to learn how to display the data from the API in reactjs..
This is the API and I want to display description
property in the API whichis in weather[0]
object and temp
property which is in main
object.
How to do it ?
This the code:
import logo from './Images/logo.png';
import './App.css';
import 'bootstrap/dist/css/bootstrap.min.css';
import { Navbar, Button, Form, FormControl } from 'react-bootstrap';
import React, { Component } from "react";
class App extends Component {
constructor(props) {
super(props);
this.state = {};
}
componentDidMount() {
if (navigator.geolocation) {
navigator.geolocation.watchPosition(async function (position) {
console.log("Latitude is :", position.coords.latitude);
console.log("Longitude is :", position.coords.longitude);
var lat = position.coords.latitude;
var lon = position.coords.longitude;
const url = `http://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&units=metric&appid=ca148f5dc67f12aafaa56d1878bb6db2`;
const response = await fetch(url);
let data = await response.json();
console.log(data);
});
}
}
render() {
return (
<div className="App">
<Navbar bg="light" expand="lg">
<Navbar.Brand href="#">Weather Forecast <img src={logo} alt="logo" width="50" height="50" /></Navbar.Brand>
<Navbar.Toggle aria-controls="navbarScroll" />
<Navbar.Collapse id="navbarScroll">
<Form className="d-flex">
<FormControl
type="search"
placeholder="Enter City"
className="mr-2"
aria-label="Search"
/>
<Button variant="outline-success" className="searchBTN">Forecast</Button>
</Form>
</Navbar.Collapse>
</Navbar>
</div>
);
}
}
export default App;
Can I get some example how to display these properties on the page ?
SOLVED
Just replace async function (position)
in navigator.geoposition
function with async (position) =>
and the data come sucsessfully.
Upvotes: 2
Views: 1500
Reputation: 4974
You give another url for api but in your code, you're calling another url with some parameters. But if we assume the url is one that you mention in the question. You can call the api and take the result as the bellow:
import "./styles.css";
import "bootstrap/dist/css/bootstrap.min.css";
import { Navbar, Button, Form, FormControl } from "react-bootstrap";
import React, { Component } from "react";
class App extends Component {
constructor(props) {
super(props);
this.state = {};
}
componentDidMount() {
const url =
"https://api.openweathermap.org/data/2.5/weather?q=plovdiv&units=metric&appid=ca148f5dc67f12aafaa56d1878bb6db2";
fetch(url)
.then((response) => response.json())
.then((data) => this.setState(data))
.catch((e) => {
console.log(e);
});
}
renderWeatherDescription = () => {
if (this.state && this.state.weather && this.state.weather[0])
return <p>{this.state.weather[0].description}</p>;
};
renderMainTemp = () => {
if (this.state && this.state.main) return <p>{this.state.main.temp}</p>;
};
render() {
return (
<div className="App">
<Navbar bg="light" expand="lg">
<Navbar.Brand href="#">
Weather Forecast <img alt="logo" width="50" height="50" />
</Navbar.Brand>
<Navbar.Toggle aria-controls="navbarScroll" />
<Navbar.Collapse id="navbarScroll">
<Form className="d-flex">
<FormControl
type="search"
placeholder="Enter City"
className="mr-2"
aria-label="Search"
/>
<Button variant="outline-success" className="searchBTN">
Forecast
</Button>
</Form>
</Navbar.Collapse>
</Navbar>
{this.renderWeatherDescription()}
{this.renderMainTemp()}
</div>
);
}
}
export default App;
Here's the executable sample:
Also you can check this link for complete answer with navigator:
Upvotes: 2
Reputation: 521
I do not know exactly how the API response looks like, you can console log it to see the exact structure of the response. This is an example of how to render it based on your description of the response object. The first thing you do is put the response object into the state, the second thing is you display it inside the render method (from the state).
import logo from './Images/logo.png';
import './App.css';
import 'bootstrap/dist/css/bootstrap.min.css';
import { Navbar, Button, Form, FormControl } from 'react-bootstrap';
import React, { Component } from "react";
class App extends Component {
constructor(props) {
super(props);
this.state = {};
}
componentDidMount() {
if (navigator.geolocation) {
navigator.geolocation.watchPosition(async (position) => {
console.log("Latitude is :", position.coords.latitude);
console.log("Longitude is :", position.coords.longitude);
var lat = position.coords.latitude;
var lon = position.coords.longitude;
const url = `http://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&units=metric&appid=ca148f5dc67f12aafaa56d1878bb6db2`;
const response = await fetch(url);
let data = await response.json();
console.log(data);
this.setState(data);
});
}
}
render() {
return (
<div className="App">
<Navbar bg="light" expand="lg">
<Navbar.Brand href="#">Weather Forecast <img src={logo} alt="logo" width="50" height="50" /></Navbar.Brand>
<Navbar.Toggle aria-controls="navbarScroll" />
<Navbar.Collapse id="navbarScroll">
<Form className="d-flex">
<FormControl
type="search"
placeholder="Enter City"
className="mr-2"
aria-label="Search"
/>
<Button variant="outline-success" className="searchBTN">Forecast</Button>
</Form>
</Navbar.Collapse>
</Navbar>
<div>
<p>{this.state.weather && this.state.weather[0].description}</p>
<p>{this.state.main && this.state.main.temp}</p>
</div>
</div>
);
}
}
export default App;
Upvotes: 1
Reputation: 617
In place, where you have console.log(data); just call this.setState({ ...something }).
You pass object to setState, so everything you pass is saved to state.
this.setState also triggers automatically rerender, so if you use in rendet method this.state, variables are updated and rerendered.
<div>{this.state.xxx}</div>
You can also render collection.
<div>{this.state.someArray.map((item) => item.description)}</div>
Upvotes: 1