Weather Today


This Weather App was built with React - JavaScript framework. With React you can create interactive UIs. It's easy to create simple views for each state and React efficiently update and render just the right components when your data changes. For this project, I used OpenWeatherMap API to fetch real-time data for a specific location.

I started project set up on the conventional way of using the command line CLI tool 'create-react-app' After the installation process is completed, you’ll have react project successfully setup and launched on your browser localhost:3000. App component is the major class components that will be wrapping all other components, like Title, Weather, Clock and Form Component.

All of the components are created by extending React.Component. React components always implement a render() method that will return a single element, in this case, a div, inside which we then add every other element we want to render to the DOM.

ReactDOM is a library that is used to render components on the DOM. Like in index.html rendering App component on the root element with the id of root. ReactDOM.render(< App/>, document.getElementById("root"))

For fetching real-time data I used OpenWeatherMap API. It's very easy to sing up and get a unique key. To remember, always keep your API key safe and secure. To store API key I created .env file with a unique key. I add .env file to .gitignore so this file is ignored in .git. To access our key we can use that environment variable process.env like so var api_key = process.env.API_KEY;

So why we need API key? It's a way for websites to know that you are trying to access the data from their database. When you make a call, that website will use your unique key to see who you are and what kind of data you need to access.

To make a fetch call I'm using async/await. It's a great way to make https request. I created function getWeather and right before declaring the function I put a keyword async and then when you actually going to make a call type keyword await Then finally create a response variable that will take in results of api call and convert it to json. Json stands for JavaScript object notation, which means it just convert data that we get from api to readable format for any programming language.

The next step is when we click on submit button in Form.js file we get call this function getWeather(). That brings us to props. Props stand for 'properties', It allows you to pass data between componets via HTML attributes.

You can call props whatever you want, I'm calling my getWeather and I will pass it to Form ComponnetgetWeather={this.getWeather}(with keyword "this") so this way it will have access to props in Form.js file like so onSubmit={this.props.getWeather}(with keyword "this.props").

To show data to the user in Form.js file I set name attributes for country and city, I'm going to use those name attributes to access the value of this input in App.js like this http://api.openweathermap.org/data/2.5/weather?q=${city},${country}&appid=${Api_Key} I have to set up target event property that will get that element on which the event originally occurred const city = e.target.elements.city.value and same for countryconst country = e.target.elements.country.value

This brings us to the state. State is an object that lives within components, its responsibility to keep track of changes in our data, for example, if the user clicks on the button, submit a form, ect. First, we need to initiate the state that holds key-value pairs and set it undefined. Then within getWeather() we will use setState to set current values of the state that contain an object. To access object, on click inspect page we can see API giving us data and from there we can see how to set up our state. For example the name of the city will be city: data.name

To pass these values we set it up in the state to the Weather component, we use props. Within App component in render() we will pass props to Weather Component like Thiscity={this.state.city}. This means we have access to these props in Weather.js file{this.props.city}.

I add an error message in case user submits an empty value for city or country. Just before setState we do a conditional check that says, if city and country are true, then set the state, else show an error message.

For this project I got inspired by many tutorials online and decided to pratice my knowledge by following along.

  • Real Time Data Fetch with API
  • Display validation failures to users with error messages
  • Toggle between Celsius and Fahrenheit


Bulit with: JavaScript - React
GitHub: Weather Today