# 萬年曆 Calendar Part3
使用的架構為 Vue + Vuetify + Firebase storage
版本別如下:
名稱 | 版本 |
---|---|
Vue | 2.6.11 |
Vuetify | 2.6.0 |
Firebase | 9.6.10 |
firestore | 1.1.6 |
把原始的內容稍為整理一下,把 components 裡面的 HelloWord.vue 刪除,建立 Calendar.vue
<!-- Calendar.vue -->
<template>
<div>Calendar</div>
</template>
然後將 app.vue 的內容刪除留下
<template>
<v-app>
<v-main>
<Calendar />
</v-main>
</v-app>
</template>
<script>
import Calendar from "./components/Calendar";
export default {
name: "App",
components: {
Calendar,
},
data: () => ({}),
};
</script>
整理完後查看頁面有沒有成功顯示組件的內容(Calendar),若成功則進行下一步
到 Vuetify > UI components > Calendars 找一個喜歡的萬年曆(作者是找 Events Click, link (opens new window)) 的這個萬年曆
直接複製 template 到 Calendar.vue (程式碼太長就不貼了)
貼上去之後一定報一堆錯誤,因為組件內還沒有寫用到的屬性與方法(不用怕很正常 =D )
接下來作者就稍微介紹組件 vuetify tags、屬性與方法,介紹時可以知道該組建用的屬性與方法,待會兒建立資料時會比較有概念
接下來就是建立屬性與方法拉~
先把基本的屬性(data)建立起來
<!-- calendar.vue -->
<template>...</template>
<script>
export default {
data: () => ({
// toISOString() 回傳一個 ISO 字串
// substr(起始位置,長度)
// today 就可以拿到今天的日期
today: new Date().toISOString().substr(0, 10),
// focus 應該是指定的那天變色
focus: new Date().toISOString().substr(0, 10),
type: "month",
typeToLabel: {
month: "Month",
week: "Week",
day: "Day",
"4day": "4 Days",
},
// start firebase data
name: null,
details: null,
start: null,
end: null,
color: "#1976D2",
events: [],
// end
currentlyEditing: null,
selectedEvent: {},
selectedElement: null,
selectedOpen: false,
dialog: false,
}),
};
</script>
掛載 firebase db 並使用它
從 firebase 取得資料 getEvents()
<script>
// import firebase db
import { db } from "@/main";
export default {
mounted() {
this.getEvents();
},
methods: {
// 獲取 firebase 資料 (因為是獲取遠端資料需要用 async, await)
async getEvents() {
// get() 使用的方法 collection("collect 的名字")
// snapshot 拿到的是 firebase db 回傳的一大包東西
let snapshot = await db.collection("calendar").get();
// 等等來塞資料到裡面的容器
let events = [];
snapshot.forEach((doc) => {
// doc -> QueryDocumentSnapshot
// doc.data() -> 剛剛建立資料表的資料
let appData = doc.data();
// doc.id -> 每個資料綁定唯一的 id
appData.id = doc.id;
// appData 裡面就包括剛剛建立的一包資料 + firebase 給的 ID
events.push(appData);
});
// 最後更新裡面的 events 到屬性的 this.events
this.events = events;
},
},
};
</script>
然後剩下的 methods 直接從 vuetify 抓,全部都可以共用(除了 updateRange() 以外)
<script>
export default {
methods: {
// 特別注意 updateRange 這個 function 有改寫過,原本它是使用元件內的資料,改寫成 firebase db 拿取後的資料
updateRange({ start, end }) {
this.start = start;
this.end = end;
},
},
};
</script>
現在架構已經整理得差不多了,最後再增加新增、修改、刪除就完成了
source code (opens new window) 因為接下來都是片段整理,如果有不清楚的地方可以找到 source code 來看一下