壹、作業目標
- 將資料內容透過 “元件” 呈現
- 製作城市過濾選項
- 將外層的資料透過 Props 傳到內層
- 將內層資料透過 emit 傳遞到外層 (作為另一個關注城市的呈現)
- 依據不同污染呈現不同色彩
- 透過 localStorage 儲存上次關注的城市
貳、前言
這個作業算是第一個我以 Vue 完成的小專案,剛從原生 JS 轉換過來框架,有許多概念都滿模糊的。
所以一開始滿痛苦的,這個小專案也花了我兩天的時間。
附上codepen
參、程式發想流程
開發心得: 起頭還是要從最簡單的開始,難的事留到後面想,有時候前面的路鋪好了,後面難走的路也會變順。
一、 使用撈出空汙 JSON 的資料呈現在畫面上。
二、 將各縣市的資料撈出來過濾,去除重複的縣市。
三、 選擇下拉式選單縣市,下方呈現出對應的縣市空污資料。
四、 點選星號,可以將下方的資料新增到關注名單。而下方被點選的資料會消失。
五、 點選上方關注資料的星號,那筆關注資料會被取消,回到下方的分類資料。
六、 特定的空氣品質,給予對應的背景顏色。
七、 將關注的資料儲存到 localStorage 裡,並且網頁下次打開,關注欄也會呈現最新的空污資訊。
肆、程式撰寫細節
一、 撈出空汙 JSON 的資料呈現在畫面上。
1 | <div class="card-columns"> |
二、 將各縣市的資料撈出來過濾,去除重複的縣市。
1 | //擷取下拉式選單縣市資料 |
三、 選擇下拉式選單縣市,下方呈現出對應的縣市空污資料。
1 | <select name="" id="" class="form-control mb-3" @change="filterCounty"> |
四、 點選星號,可以將下方的資料新增到關注名單。而下方被點選的資料會消失。
五、 點選上方關注資料的星號,那筆關注資料會被取消,回到下方的分類資料。
1 | <h4>關注城市</h4> |
六、 特定的空氣品質,給予對應的背景顏色。
這個我放在 component 裡面直接處理掉,因為它屬於內層的資料
1 | <script type="text/x-template" id="listTemplate"> |
七、 將關注的資料儲存到 localStorage 裡,並且網頁下次打開,關注欄也會呈現最新的空污資訊。
1 | var app = new Vue({ |
八、bug 修正
- 當全部的縣市裡全部的資料都被關注的時候,這時下拉式選單中的這個縣市會消失。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21created: function() {
const vm = this;
const api = 'http://opendata2.epa.gov.tw/AQI.json';
$.get(api).then(function( response ) {
vm.filterData = response;
//使用物件深拷貝,拷貝一份新的物件,這樣就不會有物件傳參考的問題,
//如果不拷貝一份物件,當南投區域全部被打星號,跑到關注時,下次重新整理,下拉式選單的南投就會不見
vm.data = JSON.parse(JSON.stringify(response));
//擷取下拉式選單縣市資料,這時的 data 就獨立出來一個陣列,和 response 資料就不會有物件傳參考的問題。
let locationArray = [];
for(let i=0 ; i<vm.data.length ; i++){
locationArray.push(vm.data[i].County);
}
vm.location = locationArray.filter(function(element,index,array){
//原本我直接用 indexOf(response.County),但 indexOf 不能用在物件裡面的值。
return array.indexOf(element) === index;
});
});
},