Quasar v1: Weather API
This is pretty straight forward, after learning previous course which was more brutal, this course is pretty much about axios and how would you use the data.
Intro Vue - check here if needed to refresh your vue knowledge
pages/index.vue
<template>
<q-page class="flex column">
<div class="col q-pt-lg q-px-md">
<q-input
v-model="search"
placeholder="Search"
dark
borderless>
<template v-slot:before>
<q-icon name="my_location" />
</template>
<template v-slot:append>
<q-btn round dense flat icon="search" />
</template>
</q-input>
</div>
<template v-if="weatherDate">
<div class="col text-white text-center">
<div class="text-ht text-weight-light">
Manchester
</div>
<div class="text-h6 text-weight-light">
Rain
</div>
<div class="text-h1 text-weight-thin relative-position">
<span>8</span>
<span class="text-h4 relative-position degree">°</span>
</div>
</div>
</template>
<template v-else>
<div class="col column text-center text-white">
<div class="col text-h2 text-weight-thin">
Quasar<br>Weather
</div>
<q-btn class="col" flat>
<q-icon left size="3em" name="my_location" />
<div>Find my location</div>
</q-btn>
</div>
</template>
<div class="col skyline"></div>
</q-page>
</template>
<script>
export default {
name: 'PageIndex',
data() {
return {
search: '',
weatherDate: null
}
}
}
</script>
<style lang="sass">
.q-page
background: linear-gradient(to bottom, #136aBa, #267871)
.degree
top:-44px
.skyline
flex: 0 0 200px
background: url('../../public/skyline.png')
background-size: contain
background-position: center bottom
margin-bottom:-40px
</style>
<template>
<q-page class="flex column" :class="bgClass">
<div class="col q-pt-lg q-px-md">
<q-input
v-model="search"
placeholder="Search"
@keyup.enter="getWeatherBySearch"
dark
borderless>
<template v-slot:before>
<q-icon
@click="getLocation"
name="my_location" />
</template>
<template v-slot:append>
<q-btn
round
dense
flat
@click="getWeatherBySearch"
icon="search" />
</template>
</q-input>
</div>
<template v-if="weatherData">
<div class="col text-white text-center">
<div class="text-ht text-weight-light">
{{ weatherData.name}}
</div>
<div class="text-h6 text-weight-light">
{{ weatherData.weather[0].main }}
</div>
<div class="text-h1 text-weight-thin relative-position">
<span>{{Math.round(weatherData.main.temp)}}</span>
<span class="text-h4 relative-position degree">°C</span>
</div>
</div>
<div class="col text-center">
<img :src="`http://openweathermap.org/img/wn/${ weatherData.weather[0].icon }@2x.png`">
</div>
</template>
<template v-else>
<div class="col column text-center text-white">
<div class="col text-h2 text-weight-thin">
Quasar<br>Weather
</div>
<q-btn
@click="getLocation"
class="col"
flat>
<q-icon left size="3em" name="my_location" />
<div>Find my location</div>
</q-btn>
</div>
</template>
<div class="col skyline"></div>
</q-page>
</template>
<script>
export default {
name: 'PageIndex',
data() {
return {
search: '',
weatherData: null,
lat: null,
lon: null,
apiUrl: 'https://api.openweathermap.org/data/2.5/weather',
apiKey: 'baba3e3e1e63e53d004b8d4f1cd376c2'
}
},
computed: {
bgClass() {
if (this.weatherData) {
if (this.weatherData.weather[0].icon.endsWith('n')) {
return 'bg-night'
} else {
return 'bg-day'
}
}
}
},
methods: {
getLocation() {
this.$q.loading.show()
navigator.geolocation.getCurrentPosition( position => {
this.lat = position.coords.latitude
this.lon = position.coords.longitude
this.getWeatherByCoords()
})
},
getWeatherByCoords() {
this.$q.loading.show()
this.$axios(`${ this.apiUrl }?lat=${ this.lat }&lon=${ this.lon }&appid=${ this.apiKey }&units=metric`).then(response => {
console.log(response)
this.weatherData = response.data
this.$q.loading.hide()
})
},
getWeatherBySearch() {
this.$q.loading.show()
this.$axios(`${ this.apiUrl }?q=${ this.search }&appid=${ this.apiKey }&units=metric`).then(response => {
this.weatherData = response.data
this.$q.loading.hide()
})
}
}
}
</script>
<style lang="sass">
.q-page
background: linear-gradient(to bottom, #136aBa, #267871)
&.bg-night
background: linear-gradient(to bottom, #232526, #414345)
&.bg-day
background: linear-gradient(to bottom, #00B4DB, #0083B0)
.degree
top:-44px
.skyline
flex: 0 0 200px
background: url('../../public/skyline.png')
background-size: contain
background-position: center bottom
margin-bottom:-40px
</style>
To get location
data() {
return {
apiUrl: 'https://api.openweathermap.org/data/2.5/weather',
apiKey: 'baba3e004b8d4f1cd376c2'
}
},
methods: {
getLocation() {
this.$q.loading.show()
navigator.geolocation.getCurrentPosition( position => {
this.lat = position.coords.latitude
this.lon = position.coords.longitude
this.getWeatherByCoords()
})
},
getWeatherByCoords() {
this.$q.loading.show()
this.$axios(`${ this.apiUrl }?lat=${ this.lat }&lon=${ this.lon }&appid=${ this.apiKey }&units=metric`).then(response => {
this.weatherData = response.data
this.$q.loading.hide()
})
},
getWeatherBySearch() {
this.$q.loading.show()
this.$axios(`${ this.apiUrl }?q=${ this.search }&appid=${ this.apiKey }&units=metric`).then(response => {
this.weatherData = response.data
this.$q.loading.hide()
})
}
}
To learn about production build