vue 를 이용해서 날씨 앱을 만들어 보자
프로젝트 생성
Vue CLI 4.x 기본 앱 만들기 를 참고해서 `vue-weather-app` 이라는 프로젝트를 생성한다
1 2 3 4
| vue create first-vue-app
vue add eslint
|
구성
UI 개발 (v0.1.0)
App.vue
App.vue 는 첫화면으로 components 의 배치를 생각하고 구성한다.
WeatherApp component 만 구성할 꺼라서 간단하다
App.vue1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <template> <div id="app"> <div class="app"> <WeatherApp></WeatherApp> </div> </div> </template>
<script> import WeatherApp from './components/WeatherApp'
export default { name: 'App', components: { WeatherApp } } </script>
<style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
.app { height: 100vh; width: 100vw;
display: flex; justify-content: center; align-items: center; } </style>
|
WeatherApp
WeatherApp 은 3가지 Component 를 모아놓은 Component 입니다.
- Measurements : 강수, 풍속, 습도 정보를 보여줍니다
- Temperature : 온도를 보여줍니다
- Weather : 날씨를 보여줍니다
components/WeatherApp.vue1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <template> <main> <Measurements></Measurements> <Temperature></Temperature> <Weather></Weather> </main> </template>
<script> import Measurements from './Measurements' import Temperature from './Temperature' import Weather from './Weather'
export default { name: 'WeatherApp', components: { Measurements, Temperature, Weather } } </script>
<style scoped> main { width: 100%; height: 100%; background-position: center; background-size: cover; background-repeat: no-repeat; display: flex; flex-direction: column; justify-content: space-around; align-items: center; } </style>
|
Measurements.vue
강수확률, 풍속, 습도를 표시해줍니다.
각 항목에 맞는 아이콘을 넣고
정보를 표현할 데이터 변수를 설정하고
components/Measurements.vue1 2 3 4 5 6 7 8 9 10 11 12 13
| <template> <section> <div class="chance-of-shower measure-icon"> <img src="../assets/icons/umbrella.svg" alt="강수"><span>{{ chanceOfShower }}</span> </div> <div class="wind-speed measure-icon"> <img src="../assets/icons/wind.svg" alt="풍속"><span>{{ windSpeed }}</span> </div> <div class="humidity measure-icon"> <img src="../assets/icons/humidity.svg" alt="습도"><span>{{ humidity }}</span> </div> </section> </template>
|
Temperature.vue
현재기온, 최고기온, 최저기온을 표시해줍니다.
아이콘과 정보를 표현할 데이터 변수를 설정합니다.
components/Temperature.vue1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <template> <section> <div class="temperature">{{ value }}</div> <div class="temperature_right"> <div class="temperature_scale"></div> <div class="temperature_high"> <img class="temp-icon" src="../assets/icons/temperature-high.svg" alt="최고기온">{{ high }} </div> <div class="temperature_low"> <img class="temp-icon" src="../assets/icons/temperature-low.svg" alt="최저기온">{{ low }} </div> </div> </section> </template>
|
Weather.vue
사용자의 위치, 설명, 날씨 아이콘을 표현해줍니다.
components/Weather.vue1 2 3 4 5 6 7
| <template> <section> <div class="location">{{ location }}</div> <div class="description">{{ description }}</div> <img class="weather_icon" :src="icon" :alt="description"> </section> </template>
|
WeatherApp 에 임시정보 설정
WeatherApp 에 데이터를 임시로 설정해줍니다.
데이터를 임시로 넣고 UI 에 임시 정보가 제대로 표현되는지 확인하려는 목적입니다.
data() 함수에서 forecast 라는 Object 를 return 해주고
forecast 를 각 component 에 값을 v-bind 로 설정해줍니다.
해당 값들은 component 의 props 에 정의된 대로 전달되어 사용되게 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <script> import Measurements from './Measurements' import Temperature from './Temperature' import Weather from './Weather'
export default { name: 'WeatherApp', components: { Measurements, Temperature, Weather },
data() { return { forecast : { chanceOfShower: 70, windSpeed: 1.1, humidity: 30, temperatureValue: 21, temperatureHigh: 24, temperatureLow: 13, location: 'Seoul', description: 'Good', weatherIcon: '' } } } } </script>
|
data()
값은 나중에 API 에서 받아서 변경될 예정입니다.
각 component 에서 사용하는 argument 로 forecast의 값을 설정해줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <template> <main> <Measurements :chanceOfShower="this.forecast.chanceOfShower" :windSpeed="this.forecast.windSpeed" :humidity="this.forecast.humidity" ></Measurements> <Temperature :value="this.forecast.temperatureValue" :high="this.forecast.temperatureHigh" :low="this.forecast.temperatureLow" ></Temperature> <Weather :location="this.forecast.location" :description="this.forecast.description" :icon="this.forecast.weatherIcon"></Weather> </main> </template>
|
UI 결과 확인 (v0.1.0)
연관포스트