យើងបានសិក្សា Vue custom To Do App ប្រើជាមួយ Array ដើម្បីផ្ទុកទិន្ន័យ ប៉ុន្តែយើងផ្ទុកទិន្ន័យជាមួយ google firebase
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihoA6Rf5zN69klDQCnEtBHcFOudmKq0R_iTnFHXeh3uMQYkYouYE4jto9d9hcQHnutAttbqCVx4AexFph9D9_FgExLH8PTdZUsGDADwarnMzGKKlSX0y8Cd2E-AsmrLJpD6F3Ykryi1z7ybW7STtAVcedcNkXjHVZFzhN7oTjNXmTX_LdA_2zvZt0cST8/s1600/Screenshot%202024-06-09%20at%2010.26.54%20at%20night.png)
បង្កើត project នៅក្នង Firebase
ដោយចូលក្នុងវែបសាយ firebase
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn-mM_nZxV9Mr6pNKCjmoO9OYgif-79wJg-CC5gnczVg5d2LTDdBf8WqiXdHqGcKCeU9Y3adc-ObU82DHn1mOFh8OKfj5O6TDKzMbC5hiUNixUk0gw3RZhguy3E3qi_Uf8scJC_5deNSN0II4YlYbOlzmhS2sOltuRc6dqZ-QUD9CnVSLQe9wqstUYu0w/s1600/Screenshot%202024-06-09%20at%205.22.20%20in%20the%20afternoon.png)
វាមានបីសម្រាប់ឲ្យជ្រើសរើសមានដូចជា Ios, android and web ។ ដូចនេះយើងធ្វើជាមួយវែបសូមជ្រើសរើសយក web។ រួចហើយដាក់ឈ្មោះឲ្យ app យើងអាចដាក់ឈ្មោះដូចទៅនឹងឈ្មោះ project។
បន្ទាប់ពីយើងបានដាក់ឈ្មោះឲ្យវាហើយចុច register រួចហើយវាឲ្យភ្ជាប់ជាមួយ project របស់យើង (configure)
configure firebase ជាមួយ Vue
- យើង install npm
npm install firebase
បង្កើត folder មួយឈ្មោះថា firebase នៅក្នុង src ហើយបង្កើត file មួយឈ្មោះថា index.js។ បន្ទាប់មក copy code របស់ firebase ទៅកាន់ file index.js របស់យើង
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilxf3FkHeFOVNBfHG7ZB2Jr7pTjKvjIU_G_5xzyIuJCIsUolBdqN9gjrYpWIJ3Q6IN_yRUn-Hw99xv9cRllwEPLcZAXHHRPbCstGiSwio-8jRE-kDvez3Yr2-p0Mcbedyj4cC4-t9tEEBBEO3C6qIsga0yFrMfG1Qvn8273VL209SuKh6-mLxxILY7VvQ/s1600/Screenshot%202024-06-09%20at%207.02.37%20in%20the%20evening.png)
សូមទៅកាន់វែបសាយ firebase វិញហើយចុច continue to console
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5hpOCfSFGTqZpv97m7DBq4nFSunWibH5RTwrteGtksKDkXc9JbCNKZj6gkexyQhFbwsx_YCo3XZNXe-hTIQcabHODrVnzfHSCpA-z5spBM09TMHURkE-3prINm8VqdRfbv464TtBqfYB0mNEKyRaBJIsPTwSR0kNlVKt-P9Ca4-LuRqAWSI8bE6fYzmo/s1600/Screenshot%202024-06-09%20at%205.25.06%20in%20the%20afternoon.png)
យើងចូលមើល document ដើម្បីការណែនាំធ្វើ firestore database។
ចុចលើ buil => firestore => get started រួចហើយហូសមកក្រោម។ នៅចំណុច Set up your development environment សូមជ្រើសរើសយក web modular API ។ ដោយយើងធ្វើទៅតាមការណែនាំរបស់វា
សូម copy នៅក្រោម initializeApp នៃ vue
import { getFirestore } from "firebase/firestore";
copy Initialize ដាក់នៅក្រោម initializeApp
const db = getFirestore(app)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI2eIaTWEi1APsl2nIVjzgKkPYojbhCSJDXj91-brORP_Ol2ZSNTvMy15whEUeAdE54B-Oijp4iNzS9ktZ5gnCVynJccOs3yEBzgaNyDFY6oocOVPFNYIeVsVYBsmGzR1LrU7JCMBBbZlzngjNSKnGKx5aJw1Ql8n8FmsVoaXXucjoYaYG-dvgfWKQ4PQ/s1600/Screenshot%202024-06-09%20at%208.41.11%20in%20the%20evening.png)
Create Database
ចូល buil => firestore Database => create database
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlsyN5sjWsQZ-DyaetQOuQ9fFhhTQhHdcRKJW_LWRljthUVMN7T-LcSox3Fw3Z4XpS1Dbw75oYE81aEupEEK-f6vm-_U-icKeK8ZAmJj3_TyFrhXssYsb2p2l7pwCKTiTsE4DYMBxrws2xROHWgvW6bD9nUbpWm39Sh4PUCYTkjxDoec9BNmEjZv4FuXY/s1600/Screenshot%202024-06-09%20at%207.34.54%20in%20the%20evening.png)
ចុច next => យក start in test mode គឺសម្រាប់ឲ្យយើងធ្វើការសាកល្បង => create
វាចូលដល់ database ហើយ។ ចំណុច Start collection គឹជាការដាក់ឈ្មោះឲ្យ database
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlU5iG8jhIV7W8uPZTYyTK3xO4mIPecfgY673bGLwN90GLS-_Uveh60clC3z-FsUngNrkP13i-qQTQ6qkbIyllm80_8kn0poNh15os3ZafWiQ1AJU_oFSa037WtHdL7ryt8TIy8IpHjupnI_YPHjev4RTXVaH_iPIwf_ghV-psYZP2lV2j0jd734TQdLk/s1600/Screenshot%202024-06-09%20at%207.40.37%20in%20the%20evening.png)
យើងបញ្ចូលទៅទិន្ន័យទៅកាន់ firebase ទៅតាម array របស់យើង
{ id: 'id1', article: 'String', done: boolean }
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg60GNQx7uACSlqKPkPh19PEiS41TIUPFwr-TgplT1pzSePCOmB-72TvesEzCKseGbuIsj30ICklhdBHOaEVR9SmA4gjF4pfjuLbf-u7URM3TUFK44AwLw_NpB3V3wRzB4r3WUgnu57ntspHoRYJRcyqWEthyAoImSWvsduW1h057nUMwapUHRAfu2g_e4/s1600/Screenshot%202024-06-09%20at%207.43.37%20in%20the%20evening.png)
Read data
ដោយយើងចូលទៅក្នុងវែបសាយ firebase វិញរួចហើយយក Read data => Get data រួចហើយអូសមកក្រោមដល់ Get all documents in a collection ប្រើជាមួយ vue
យើងហៅ db ពី index.js មកប្រើ
onMounted ដាក់នៅក្នុង ref ។ វាគឺជា lifecycle hook នៃ Vue សម្រប់ពពួក fetching data ឬ initialzing third-party libraries
<script setup> //MARK: Import import Card from '@/components/Card.vue'; import { ref, onMounted } from 'vue'; import { collection, getDocs } from "firebase/firestore"; import {db} from '@/firebase'
យើងធ្វើការតេស onMounted ថាតើវាដើរឬក៏អត់
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQvLnPkbgyCr4rJb2Qj8Lx_jP5NCtDvxSQLkh58cmvpcNTyDtKV5D0rjMTKpZ9S9UHC7HIAVfx42eal-zrUgTbB7WwIfSYf70F7UU0jWvpQyXl6juSXeRSy8xREnu6K-PAdDK7tb558g0ViH6fkjeyMy567ok6qxM9CTuPOFqOZ31ovWEnU1wDlA615n4/s1600/Screenshot%202024-06-09%20at%208.44.01%20in%20the%20evening.png)
<script setup> //MARK: Import import Card from '@/components/Card.vue'; import { ref, onMounted} from 'vue'; import { collection, getDocs } from "firebase/firestore"; import {db} from '@/firebase' //MARK: To Do const todos = ref([]) //MARK: Read data onMounted(async ()=>{ const querySnapshot = await getDocs(collection(db, "todos")); const fbTodos = [] querySnapshot.forEach((doc) => { //console.log(doc.id, " => ", doc.data()); const todo = { id: doc.id, article: doc.data().article, done: doc.data().done } fbTodos.push(todo) }) todos.value = fbTodos }) </script>
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjNd5qnF8P0H-mRIOaKvDLIjfq3FMTIcaNDv7kJcEUGSE6i9etNesIbY-eIpXgeQwGiqdx6-f-_I5V_i06US_LQYp28Lj1c_A02bndu7bjll6VI6uFrRMjOSlroxUtcIGjvYQb_0uY9C-8U1Oxtyt2CWFmvbCCZmqA_KMmUp2Z3tWstoqgntmxnmfLcjE/s1600/Screenshot%202024-06-09%20at%209.08.06%20at%20night.png)
ការ Get data ខាងលើនេះបានដើរហើយ ប៉ុន្តែវាមិន real-time នៅពេលយើង update ទិន្ន័យទៅកាន់ Database យើងត្រូវ refresh page ទើបវាលូតមក។ ប៉ុន្តែនៅខាងនេះ Get data ដោយ realtime
Get data real-time update
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT7phduCMnAZzkozHVq7CgIkD4Qxu8VXI5fIRumFf_-kR8E8SEyzpnPsmsmYCvWV6ndz807aBe10ipS4zwGlN0G8Xht3-EuHgVRUKe4YcmU3bq3fuKDqBuozDHG8LrbLqyM9DpfwKm55xapAUC8fJjU_Qja0vxBiy59znToyUZ5jl3FF5uCSviXbwwxfo/s1600/Screenshot%202024-06-09%20at%209.15.07%20at%20night.png)
import { collection, getDocs } from "firebase/firestore"; ប្តូរមក import { collection, onSnapshot} from "firebase/firestore";
សម្រាប់ q ផ្លាស់មក collection(db, "todos")
//MARK: Import import Card from '@/components/Card.vue'; import { ref, onMounted} from 'vue'; import { collection, onSnapshot} from "firebase/firestore"; import {db} from '@/firebase' //MARK: To Do const todos = ref([]) //MARK: Get data real-time update onMounted(async ()=>{ onSnapshot(collection(db, "todos"), (querySnapshot) => { const fbTodos = [] querySnapshot.forEach((doc) => { const todo = { id: doc.id, article: doc.data().article, done: doc.data().done } fbTodos.push(todo) }) todos.value = fbTodos }) }) </script>
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4dw7yyfD3adXK96SeEU_aerRcJkYhvSmfCVrfU7ADF8ckmiHqDNXuL33sukVgEimxfi7mvVSijquTaYActSx6Y-_vA-pb8Ok_UK3h4xjekSOqFhEIfXcGpQr61sYWn9KYkxKWgvgXF9PrDlvQwwb9e0ZmKhNzcFg2YjmXczwwmH68aVsG7am51ROo8MI/s1600/Screenshot%202024-06-09%20at%209.27.29%20at%20night.png)
Add data
Add a document
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS_OVTYx-Yf3p3JdDxjWHlr1BbER5Ke_WvliQOBDSVTZr7jFqvaFKSig5GDMr_BQS-j8e_8KgQs7nZ9r-YqdyG4Rl3yYrZo1JwZFCN5Bvai8ZhiTQwGMFB2R6smhXnbe35fm5fj9yxthQmX8SSBijyngSkXxBt-Kz5ntVpJHMXwusDCHdXWcGNI6u0jMU/s1600/Screenshot%202024-06-09%20at%209.33.27%20at%20night.png)
import { collection, onSnapshot, addDoc} from "firebase/firestore";
//MARK: Add data const newArticleTodo = ref() const addTodo = ()=>{ addDoc(collection(db, "todos"), { article: newArticleTodo.value, done: false }) newArticleTodo.value = '' }
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZtm-JLiSZvqE0id7eEP1f6tuq0Aos2hA0uOlsXls4MgobmskvoSqIZUZ28eG4ovsL-pgsk9YVe4i5vF-VP_D3_I6CoM8LFXazHWfL4SZRflAK6YmFDd9Q9pK2XFekOlvR8t8BVUw350hnanPNww8Yytx4c4Y5qOpOeoW_NVaR1Qlp1XEXM7An5Rz6tkY/s1600/Screenshot%202024-06-09%20at%209.50.03%20at%20night.png)
ចំណាំ៖ កែពីកូដ //MARK: Add To Do
Delete data
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidFw0utZFbuWSCv6I3CX_5S8mUhH9k0hDMRsGkxmZT9gfhD7SJ8FOdnzkgaNn-dpuOy3r8JO2IdrIXMzbydzGHh2X55tGuZYTAZx8jbrk82jRBGs6TKbKZZkAtGKW7-Xl7X2h_fh3E4gOxQWBQQh3Qznr5xjvG_qJSfmnHWOm7Ls3Kb4wn1UVh8W2kOOU/s1600/Screenshot%202024-06-09%20at%209.55.41%20at%20night.png)
import { collection, onSnapshot, addDoc, doc, deleteDoc} from "firebase/firestore";
ចំពោះ "DC" យើងប្តូរមក parameter id
//MARK: Delete data const deleteTodo = id =>{ deleteDoc(doc(db, "todos", id)) }
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji5zUcSb245mCm_2Tj3hblvE0SIFMaz8Cn4NDFxIRBdBUD_qlzEVy0_g3ZUWElV6pDcSuuvDCkTi7pjhAcNuhBZMguk1blnRDeW1JgNDJ6EeHFvWMS_4s-jCHyQQkdzOuSHQdQ7qz31g54TUcHKiJH_pua6zXHGot0cCHntpYcnJWcet-ATAoQMht_xOI/s1600/Screenshot%202024-06-09%20at%2010.05.20%20at%20night.png)
Mark toggle button
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEYEzQ45JY18ypjy4hP8qpB8LlRXsX3STtkmaQR4H4-GViCZVZ9rcHgjmKiaxbs9_AovVltx581Q_A1bgkDBwUG-SSXiFGVMELglONQ-3bMxQnx0tVTVg0cT_-NRaE2wON39ccpmNAe_c8SukFzcRBNgqGA6CEK9Il87JHAlebae2c1x3Wkf95KLWlpu8/s1600/Screenshot%202024-06-09%20at%2010.12.09%20at%20night.png)
import { collection, onSnapshot, addDoc, doc, deleteDoc, updateDoc} from "firebase/firestore";
//MARK: Mark Done const toggleBtn = id =>{ const index = todos.value.findIndex(todo =>todo.id == id) updateDoc(doc(db, "todos", id), { done: !todos.value[index].done }) //todos.value[index].done //REMARK: if done: true is true but done: false is false }
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihoA6Rf5zN69klDQCnEtBHcFOudmKq0R_iTnFHXeh3uMQYkYouYE4jto9d9hcQHnutAttbqCVx4AexFph9D9_FgExLH8PTdZUsGDADwarnMzGKKlSX0y8Cd2E-AsmrLJpD6F3Ykryi1z7ybW7STtAVcedcNkXjHVZFzhN7oTjNXmTX_LdA_2zvZt0cST8/s1600/Screenshot%202024-06-09%20at%2010.26.54%20at%20night.png)
កូដពេញ
<template> <div class="contain"> <form class="form-input" @submit.prevent="addTodo"> <input v-model="newArticleTodo" type="text" placeholder="Add todo"> <button :disabled="!newArticleTodo" class="btn-gb">Add</button> </form> <!--MARK: Custom Card--> <card v-for="todo in todos" :class="{sucess: todo.done}" > <div :class="{line: todo.done}" class="txt">{{ todo.article }}</div> <div class="btn-box"> <button @click="toggleBtn(todo.id)" :class="todo.done? 'btnSucess': 'btn-check' " class=" ">✓</button> <button @click="deleteTodo(todo.id)" class="btn-cross">✗</button> </div> </card> </div> </template> <script setup> //MARK: Import import Card from '@/components/Card.vue'; import { ref, onMounted} from 'vue'; import { collection, onSnapshot , addDoc, doc, deleteDoc, updateDoc} from "firebase/firestore"; import {db} from '@/firebase' //MARK: To Do const todos = ref([]) //MARK: Get data real-time update onMounted(async ()=>{ onSnapshot(collection(db, "todos"), (querySnapshot) => { const fbTodos = [] querySnapshot.forEach((doc) => { const todo = { id: doc.id, article: doc.data().article, done: doc.data().done } fbTodos.push(todo) }) todos.value = fbTodos }) }) //MARK: Add data const newArticleTodo = ref() const addTodo = ()=>{ addDoc(collection(db, "todos"), { article: newArticleTodo.value, done: false }) newArticleTodo.value = '' } //MARK: Delete data const deleteTodo = id =>{ deleteDoc(doc(db, "todos", id)) } //MARK: Mark Done const toggleBtn = id =>{ const index = todos.value.findIndex(todo =>todo.id == id) updateDoc(doc(db, "todos", id), { done: !todos.value[index].done }) //todos.value[index].done //REMARK: if done: true is true but done: false is false } </script> <style> body{ background-color: rgba(0, 0, 0, 0.69); } .contain{ width: 500px; margin: 0 auto; } .form-input{ padding: 8px; } .form-input input{ padding: 10px; border-radius: 8px; width: 79%; margin-right: 10px; border: 1px solid; font-size: 18px; } .form-input button{ /* padding: 10px; */ font-size: 16px; padding: 10px 20px 10px 20px; border: 0px; background-color: #4b7bec; color: white; border-radius: 8px; cursor: pointer; } .btn-gb{ background-color: red; } .btnSucess{ background-color: #4834d4; color: white; } /* MARK Done */ .sucess{ /* Change BG*/ background-color: #7ed6df; color: rgb(255, 255, 255); } .btnSucess{ background-color: #4834d4; color: white; } .line{ text-decoration: line-through; text-decoration-color: rgb(164, 176, 190); } </style>
មេរៀន Vue custom To Do App
0 Comments