Hi guys I’m trying to build a weather app with a 7 day forecast of a city to be informed by the user. It has to be in Vue js and use the Open Weather Map API
.
I managed to make the app and connect it to the Open Weather Map API
displaying the weather. But I couldn’t display the 7-day forecast. I read the API documentation and didn’t find examples to help me.
can you help me?
App.vue
<template> <div id="app" :class="typeof weather.main != 'undefined' && weather.main.temp > 16 ? 'warm' : ''"> <main> <div class="search-box"> <input type="text" class="search-bar" placeholder="Digite uma cidade..." v-model="query" @keypress="fetchWeather" /> </div> <div class="weather-wrap" v-if="typeof weather.main != 'undefined'"> <div class="location-box"> <div class="location">{{ weather.name }}, {{ weather.sys.country }}</div> <div class="date">{{ dateBuilder() }}</div> </div> <div class="weather-box"> <div class="temp">{{ Math.round(weather.main.temp) }}°c</div> <div class="weather">{{ weather.weather[0].main }}</div> <div class="weather">{{ weather.weather[0].main }}</div> </div> </div> </main> </div> </template> <script> export default { name: 'app', data () { return { api_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', url_base: 'https://api.openweathermap.org/data/2.5/', query: '', weather: {} } }, methods: { fetchWeather (e) { if (e.key == "Enter") { fetch(`${this.url_base}weather?q=${this.query}&units=metric&APPID=${this.api_key}`) .then(res => { return res.json(); }).then(this.setResults); } }, setResults (results) { this.weather = results; this.weather.icon = results; }, dateBuilder () { let d = new Date(); let months = ["Janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"]; let days = ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"]; let day = days[d.getDay()]; let date = d.getDate(); let month = months[d.getMonth()]; let year = d.getFullYear(); return `${day} ${date} ${month} ${year}`; } } } </script> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: Arial, Helvetica, sans-serif; } #app { background-image: url('./assets/cold-bg.jpg'); background-size: cover; background-position: bottom; transition: 0.4s; } #app.warm { background-image: url('./assets/warm-bg.jpg'); } main { min-height: 100vh; padding: 25px; background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.25), rgba(0, 0, 0, 0.75)); } .search-box { width: 100%; margin-bottom: 30px; } .search-box .search-bar { display: block; width: 100%; padding: 15px; color: #313131; font-size: 20px; appearance: none; border:none; outline: none; background: none; box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.25); background-color: rgba(255, 255, 255, 0.5); border-radius: 0px 16px 0px 16px; transition: 0.4s; } .search-box .search-bar:focus { box-shadow: 0px 0px 16px rgba(0, 0, 0, 0.25); background-color: rgba(255, 255, 255, 0.75); border-radius: 16px 0px 16px 0px; } .location-box .location { color: #FFF; font-size: 32px; font-weight: 500; text-align: center; text-shadow: 1px 3px rgba(0, 0, 0, 0.25); } .location-box .date { color: #FFF; font-size: 20px; font-weight: 300; font-style: italic; text-align: center; } .weather-box { text-align: center; } .weather-box .temp { display: inline-block; padding: 10px 25px; color: #FFF; font-size: 102px; font-weight: 900; text-shadow: 3px 6px rgba(0, 0, 0, 0.25); background-color:rgba(255, 255, 255, 0.25); border-radius: 16px; margin: 30px 0px; box-shadow: 3px 6px rgba(0, 0, 0, 0.25); } .weather-box .weather { color: #FFF; font-size: 48px; font-weight: 700; font-style: italic; text-shadow: 3px 6px rgba(0, 0, 0, 0.25); } </style>
”’
Advertisement
Answer
Your API call for only 7 days forecast should be:
https://api.openweathermap.org/data/2.5/onecall?lat={lat}&lon={lon}&lang={en}&units=metric&exclude=current,minutely,hourly,alerts&appid={apiKey}
in object from response You will get timezone_offset":
so you can loop over array daily
to get date:
const myDate = new Date(obj.dt*1000-(obj.timezone_offset*1000)));