12/08/2018, 17:53
Vue Firebase CRUD Example
I. Chuẩn bị Cài đặt Vue sử dụng Vue CLI bằng một trong 2 câu lệnh sau: npm install -g @vue/cli or yarn global add @vue/cli Nếu gặp lỗi bạn hay thử với quyền root. Tạo project với scaffold dựng sẵn: vue create vuefirebaseexample Di chuyển vào thư mục gốc và mở source code bắng ...
I. Chuẩn bị
- Cài đặt Vue sử dụng Vue CLI bằng một trong 2 câu lệnh sau:
npm install -g @vue/cli or yarn global add @vue/cli
- Nếu gặp lỗi bạn hay thử với quyền root.
- Tạo project với scaffold dựng sẵn:
vue create vuefirebaseexample
- Di chuyển vào thư mục gốc và mở source code bắng sublime text:
cd vuefirebaseexample subl .
- Cài đặt vuefire bằng một trong hai câu lệnh sau:
yarn add vuefire firebase or npm install vuefire firebase --save
- Ta cần import vuefire vào file src/man.js:
import Vue from 'vue' import VueFire from 'vuefire' import App from './App.vue' Vue.use(VueFire) Vue.config.productionTip = false new Vue({ render: h => h(App) }).$mount('#app')
- Cài đặt Bootstrap 4 bằng 1 trong 2 cách:
yarn add bootstrap # or npm install bootstrap --save
- Sau đó inport vào file App.vue
<style lang="css"> @import '../node_modules/bootstrap/dist/css/bootstrap.min.css'; </style>
II. Vue component
- Tạo 4 file component AddItem.vue, EditItem.vue, ListItem.vue, Home.vue trong thư mục src/components/ với nội dung:
// Home.vue <template> <h1>Home</h1> </template> <script> export default { components: { name: 'Home' } } </script>
// AddItem.vue <template> <h1>Add Item</h1> </template> <script> export default { components: { name: 'AddItem' } } </script>
// EditItem.vue <template> <h1>Edit Item</h1> </template> <script> export default { components: { name: 'EditItem' } } </script>
// ListItem.vue <template> <h1>List Item</h1> </template> <script> export default { components: { name: 'ListItem' } } </script>
- Cài đặt gói vue-route
yarn add vue-router # or npm install vue-router --save
- Và config route trong file main.js như sau:
import Vue from 'vue' import VueFire from 'vuefire' import VueRouter from 'vue-router' import App from './App.vue' import AddItem from './components/AddItem.vue' import EditItem from './components/EditItem.vue' import ListItem from './components/ListItem.vue' import Home from './components/Home.vue' Vue.use(VueFire) Vue.use(VueRouter) Vue.config.productionTip = false const routes = [ { name: 'Home', path: '/', component: Home }, { name: 'Add', path: '/add', component: AddItem }, { name: 'Edit', path: '/edit/:id', component: EditItem }, { name: 'List', path: '/index', component: ListItem }, ]; const router = new VueRouter({ mode: 'history', routes: routes }); new Vue({ render: h => h(App), router }).$mount('#app')
- Trước khi khởi tạo server để test thử ta cần gọi route từ file App.vue như sau:
// App.vue <template> <div id="app"> <router-view></router-view> </div> </template> <script> export default { name: 'app' } </script> <style lang="css"> @import '../node_modules/bootstrap/dist/css/bootstrap.min.css'; </style>
- Và khởi tạo server với câu lệnh:
npm run serve
- Truy cập vào đường link http://localhost:8080 trên trình duyệt để xem kết quả.
- Route đã hoạt động nhưng bước tiếp theo ta cần chỉnh sửa lại style cho đẹp.
- Thêm thanh navigation vào file App.vue:
<template> <div id="app" class="container"> <nav class="navbar navbar-expand-sm bg-light"> <ul class="navbar-nav"> <li class="nav-item"> <router-link :to="{ name: 'Home' }" class="nav-link">Home</router-link> </li> <li class="nav-item"> <router-link :to="{ name: 'Add' }" class="nav-link">Add Item</router-link> </li> <li class="nav-item"> <router-link :to="{ name: 'List' }" class="nav-link">All Item</router-link> </li> </ul> </nav> <div class="gap"> <router-view></router-view> </div> </div> </template> <style lang="css"> @import '../node_modules/bootstrap/dist/css/bootstrap.min.css'; </style> <style> .gap { margin-top: 50px; } </style> <script> export default { name: 'app' } </script>
- Kết quả thu được:
- Cài đặt gói nprogress cung cấp component UI cho việc hiển thị route
yarn add nprogress # or npm install nprogress --save
- Và thêm vào file main.js:
... import NProgress from 'nprogress'; import '../node_modules/nprogress/nprogress.css' ... const router = new VueRouter({ mode: 'history', routes: routes }); router.beforeResolve((to, from, next) => { if (to.name) { NProgress.start() } next() }) router.afterEach(() => { NProgress.done() }) ...
- Tạo form add Item trong file AddItem.vue:
// AddItem.vue <template> <div class="container"> <div class="card"> <div class="card-header"> <h3>Add Item</h3> </div> <div class="card-body"> <form v-on:submit.prevent="addItem"> <div class="form-group"> <label>Item Name:</label> <input type="text" class="form-control"/> </div> <div class="form-group"> <label>Item Price:</label> <input type="text" class="form-control"/> </div> <div class="form-group"> <input type="submit" class="btn btn-primary" value="Add Item"/> </div> </form> </div> </div> </div> </template> <script> export default { components: { name: 'AddItem' } } </script>
III. FireBase
- Truy cập Firebase và tạo một project, bạn nhớ phải cho phép quyền đọc và ghi nếu không sẽ không thể tạo data trên firebase được.
- Tạo file config db.js trong thư mục src:
// db.js import Firebase from 'firebase' let config = { apiKey: "", authDomain: "", databaseURL: "", projectId: "", storageBucket: "", messagingSenderId: "" }; let app = Firebase.initializeApp(config) export const db = app.database()
- Đến đây việc config kết nối Firebase đã xong, ta sẽ tiến hành add Item vào data Firebase:
// AddItem.vue <template> <div class="container"> <div class="card"> <div class="card-header"> <h3>Add Item</h3> </div> <div class="card-body"> <form v-on:submit.prevent="addItem"> <div class="form-group"> <label>Item Name:</label> <input type="text" class="form-control" v-model="newItem.name"/> </div> <div class="form-group"> <label>Item Price:</label> <input type="text" class="form-control" v-model="newItem.price"/> </div> <div class="form-group"> <input type="submit" class="btn btn-primary" value="Add Item"/> </div> </form> </div> </div> </div> </template> <script> import { db } from '../config/db'; export default { components: { name: 'AddItem' }, firebase: { items: db.ref('items') }, data () { return { newItem: { name: ', price: ' } } }, methods: { addItem() { this.$firebaseRefs.items.push({ name: this.newItem.name, price: this.newItem.price }) this.newItem.name = '; this.newItem.price = '; this.$router.push('/index') } } } </script>
- Kết quả ta thu được:
- Sau khi lưu được data vào firebase ta sẽ update ListItem.vue để hiển thị data từ firebase:
// ListItem.vue <template> <div> <h1>List Item</h1> <table class="table table-striped"> <thead> <tr> <th>Item Name</th> <th>Item Price</th> <th colspan="2">Action</th> </tr> </thead> <tbody> <tr v-for="item of items" :key="item['.key']"> <td>{{ item.name }}</td> <td>{{ item.price }}</td> <td> <router-link :to="{ name: 'Edit', params: {id: item['.key']} }" class="btn btn-warning"> Edit </router-link> </td> </tr> </tbody> </table> </div> </template> <script> import { db } from '../config/db'; export default { components: { name: 'ListItem' }, data() { return { items: [] } }, firebase: { items: db.ref('items') } } </script>
- Update data vào firebase:
// EditItem.vue <template> <div class="container"> <div class="card"> <div class="card-header"> <h3>Edit Item</h3> </div> <div class="card-body"> <form v-on:submit.prevent="updateItem"> <div class="form-group"> <label>Item Name:</label> <input type="text" class="form-control" v-model="newItem.name"/> </div> <div class="form-group"> <label>Item Price:</label> <input type="text" class=