Vue CLI 4.x 날씨 앱 만들기 (1.UI만들기)

vue 를 이용해서 날씨 앱을 만들어 보자

프로젝트 생성

Vue CLI 4.x 기본 앱 만들기 를 참고해서 `vue-weather-app` 이라는 프로젝트를 생성한다
1
2
3
4
## 프로젝트 생성
vue create first-vue-app
## eslint 추가
vue add eslint

구성

UI 개발 (v0.1.0)

App.vue

App.vue 는 첫화면으로 components 의 배치를 생각하고 구성한다.
WeatherApp component 만 구성할 꺼라서 간단하다

App.vue
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
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 **/
.app {
height: 100vh;
width: 100vw;

display: flex;
justify-content: center;
align-items: center;
}
</style>

WeatherApp

WeatherApp 은 3가지 Component 를 모아놓은 Component 입니다.

  • Measurements : 강수, 풍속, 습도 정보를 보여줍니다
  • Temperature : 온도를 보여줍니다
  • Weather : 날씨를 보여줍니다
components/WeatherApp.vue
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
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.vue
1
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.vue
1
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.vue
1
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)

v0.1.0 결과화면

연관포스트