안녕하세요 상훈입니다.
유튜버 분께서 타자가 엄청 빠르시니 적당히 멈추시면서 하세요!
(내용이 아주 좋습니다. 요점을 잘 잡고 간단하게 구현해주었습니다. )
$ vue create vue-weatherapp
으로 Vue 3 프로젝트를 생성해주었습니다.
그리고 바로 $ npm run serve 를 통하여 구동!
Component를 만들지 않고 오로지 App.vue에서 해당 내용을 작성하였습니다.
<template>
<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="Search..."
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) }}</div>
<div class="weather">{{ weather.weather[0].main }}</div>
</div>
</div>
</main>
</div>
</template>
<script>
<script>
export default {
name: 'App',
data() {
return {
api_key : 'd5297dac23efd490788f837861e52f62',
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;
},
dateBuilder () {
let d = new Date()
let months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
let days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
let day = days[d.getDay()];
let date = d.getDate();
let month = months[d.getMonth()-1];
let year = d.getFullYear();
return `${day} ${date} ${month} ${year}`;
}
}
}
</script>
<style>
<style>
*{
margin: 0;
padding: 0;
box-sizing: border-box;
}
body{
font-family: 'montserrat', sans-serif;
}
#App{
background-image: url('./assets/cold-bg.jpg');
background-color: aquamarine;
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;
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;
}
.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(255, 255, 255, 0.25);
}
</style>
결과물입니다.
도시명을 작성하면 해당되는 api를 가져와 띄워줍니다.
이상입니다.
무료 기상 API 주소 입니다. 개발 공부에 참고하세요!!
댓글 영역