--- tags: Vue3 新手夏令營 --- # Vue + Firebase 即時聊天室 ## 你要先知道的事 >**firebase 的詳細功能有哪些在此不贅述,可以去看加碼第五週的主線筆記~六角副校長卡斯伯打得很用心❤️** 正常情況下 要與資料庫交互 都會是由前端發出一個請求給後端 然後當後端收到請求就會給予響應 與數據庫交互的部分會由後端進行處理 但在使用 firebase 時則不是這樣的哦! firebase 會先建立一個 web socket 他可以不斷跟 web server 互相聯繫 使 web server 能無限發送回應給前端 此時前端就只需要一直監聽是否有發過來的響應並進行處理即可 使用 firebase 時前後端一樣會建立一個連線 且只要連線建立成功就可不斷發送響應 firebase 主要就是先建立連線,建立後就可以不斷地從資料庫取得資料了 ## 直播影片實作的 Vue + firebase 教學 1. 使用你超方便的 Google 帳號到 Firebase 登入服務 2. 首先要建立一個專案 專案名稱自己看得懂即可(副校是打 hexschool-demo) 3. 進入專案後先到設定裡面把 CDN 的內容貼到你的 .html 的 body 最下方 4. 回到 firebase 點擊左邊選單的 realtime database 5. 建立你的 realtime database 6. 到 [Firebase CDN 連結](https://firebase.google.com/docs/web/setup#expandable-8) 找到 realtime 的 scritp 引入方式 貼在引入 Firebase 那段的任意位置(反正記得貼就對惹) 7. 可以開始寫程式了 我們前往下一章 >**擔心 Config 內容流出的話可使用 Authentication 改成用戶有登入才授權使用資料庫的方式建立** ### 第一章:先串連到服務 ```javascript= // 這是雅萱的 不要亂複製 示意就好 var firebaseConfig = { apiKey: "AIzaSyCiIDLjTl65lugnCvaoe-1xsN-NEs1fjow", authDomain: "online-chatroom-demo.firebaseapp.com", // 這個 databaseURL 一定要記得加入哦!!!! databaseURL: "https://online-chatroom-demo-default-rtdb.asia-southeast1.firebasedatabase.app", projectId: "online-chatroom-demo", storageBucket: "online-chatroom-demo.appspot.com", messagingSenderId: "938520106251", appId: "1:938520106251:web:649b16c56f38d614527e0e", measurementId: "G-NVZQJWM59K" }; // Initialize Firebase firebase.initializeApp(firebaseConfig); firebase.analytics(); // 上面一大段全部都是 CDN 複製過來的 // 往下第一步設置 db 為 firebase 的 realtime database const db = firebase.database(); // 第二步 用 ref 抓到對應的資料庫名稱 const msgRef = db.ref("message"); // 第三步 用 on 連結到資料庫 msgRef.on("value", (snapshot) => { console.log(snapshot.val()); // 這個就是我們資料庫中的數據囉 }); ``` ### 第二章:結合 Vue(直播寫 option API 所以我寫另一種) 1. 先用 ESM 引入 Vue3 2. 我們只會用到 CreateApp ref onMounted 所以 import 這三個東西進來 3. 打電話給副校要版型(省事👍) 來貼 4. 開始起手式 setup(){ return {}; } 5. 宣告 username(用來保存當前使用者名稱 所以是空字串) 6. 宣告 chatroom(用來保存所有資料庫的資料 所以是空陣列) 7. 宣告 message(用來保存當前使用者輸入的訊息內容 所以是空字串) 8. 宣告 tempUsername(用來保存當前的使用者輸入的名稱且尚未按下開始使用 即名稱鎖定前的值 也是空字串) 9. 把上述宣告的 data 都放到 return 裏面 10. 先到空白模板中把這些 data 綁定到正確的位置(username 不會綁定在 DOM 身上 其他都要綁 這邊大家自己來哦都上五週了你可以ㄉ👍) 11. 接下來開始寫 methods ,兩個方法分別為 addMessage、addUsername 12. addMessage 就是把這個人的名字和輸入訊息和輸入時間全部傳給資料庫哦 下面會附上代碼~ 13. addUsername 就是把輸入的名稱(tempUsername)設置為用戶名稱(username) 14. 方法中使用到 data 記得要改成 .value 獲取值 15. 最後就是把剛才的那個 `msgRef.on()` 改寫在 onMounted 方法中渲染數據庫資料到畫面了 * 上述宣告 data 的部分皆使用 const 變數名 = ref(設置的變數內容) * 宣告 methods 的部分皆使用 const 方法名 = function(){ 方法程式碼 } * 所有宣告除了 onMounted 外皆要記得放進去 setup 的 return 裏面 ### 第三章:附上程式碼 前面貼入 Firebase CDN 的部份省略 往下內容如下: ```javascript= // 這兩個保留放在這邊 第三個那個 msgRef.on() 改放在 Vue 裏面 const db = firebase.database(); const msgRef = db.ref("message"); // 往下開始寫 Vue的 API import { createApp, ref, onMounted } from "https://cdnjs.cloudflare.com/ajax/libs/vue/3.2.0-beta.7/vue.esm-browser.min.js"; createApp({ setup() { // date const message = ref(""); const username = ref(""); const chatroom = ref([]); const tempUsername = ref(""); // methods const addUsername = function () { username.value = tempUsername.value; }; const addMessage = function () { // 這是 firebase 的內建幫我們建立亂數的 key const key = msgRef.push().key; // 這邊是把數據推到 realtime 資料庫中的 message 這個資料集合(不確定這詞有沒有用錯)裡面 msgRef.child(key).set({ message: message.value, // 這是用戶輸入的訊息內容 username: username.value, // 這是用戶的名稱 time: Date.now(), // 這是獲取現在的時間 key // 這個等同於 key: key }); message.value = ""; // 把物件推給資料庫後我們要把 message 清空~ }; // mounted onMounted(() => { // 這是前面講過的那個 msgRef.on(),是 firebase 獲取(連結)資料內容的方法 msgRef.on("value", (snapshot) => { // 把資料庫的數據丟給 chatroom 這個陣列 再到 DOM 上用 v-for 渲染資料 chatroom.value = snapshot.val(); }); }); // 最重要的一步 記得把宣告的東西塞進去 你就完成了👍 return { message, username, tempUsername, chatroom, addMessage, addUsername }; } }).mount("#app"); ``` ## 成品 1. [Vue + Firebase 即時聊天室](https://codepen.io/WangShuan/pen/eYvMNmd) 2. [Vue + firebase 雲端硬碟](https://wangshuan.github.io/vue-could/#/)