Vue 2如何使用Firebase进行实时更新

丹妮尔·卡迪西娜(Daniele Cadicina)

我最近接触过vue和vuetify,我在这里和那里都遵循一些教程,并通过阅读一些pdf文件创建了一个具有Firebase集成的待办事项列表,但是我有一个无法管理的问题,它是以下内容:

当您通过前端向数据库中添加元素时,会定期显示该元素,但是如果我要删除它,则会从后端而不是前端中删除它,直到至少更新页面为止。

脚本:

<script>
import Popup from '../components/Popup.vue'
import db from '@/fb'
// @ is an alias to /src

export default {
  components:{ Popup },
  data(){
    return{
      projects: [],
      snackbar: false
    }
  },
  methods: {

    sortBydaniele(prop){
      this.projects.sort((d,s) => d[prop] < s[prop] ? -1 : 1)
    },
    sortBysara(prop){
      this.projects.sort((d,s) => d[prop] > s[prop] ? -1 : 1)
    },

    cancella(id){ //delete
      console.log('deleted');
      db.collection('projects').doc(id).delete()
    }
  },
  created(){

    db.collection('projects').onSnapshot(res => {
      const changes  = res.docChanges();

      changes.forEach(change => {
        if(change.type === 'added'){
          this.projects.push({
            ...change.doc.data(),
            id: change.doc.id
          })
        }
        if(change.type === 'removed') {
          this.projects.splice(this.id, 1);
        }
      })
    })
  }
}
</script>

基本上,当我要删除特定的id时,我无法更新onSnapshot()方法,或者,我设法使用pop()或slice()函数做到了这一点,但实际上,它们删除了添加到数组中的最后一个元素或第一个,因此不是真正选择的人。有人可以帮助我吗?

HTML:

<template>

  <div class="dashboard">

    <v-snackbar v-model="snackbar" :timeout="4000" top color="success">
      <span class="white--text">Aggiunto con successo!</span>
        <template v-slot:action="{ attrs }">
         <v-btn color="white" v-bind="attrs" text @click="snackbar = false">Chiudi</v-btn>
        </template>
    </v-snackbar>

    <h1 class="subtitle-1 grey--text">Dashboard</h1>

    <v-container class="my-5">

      <v-row class="mb-3">
        <v-tooltip top>
          <template v-slot:activator="{on}">
        <v-btn small depressed class="grey--text" @click="sortBydaniele('persona')" v-on="on">
          <v-icon left small>mdi-account</v-icon>
          <span class="caption text-lowercase">Daniele</span>
        </v-btn>
          </template>
          <span> Ordina le schede di Daniele</span>
        </v-tooltip>
         <v-tooltip top>
          <template v-slot:activator="{on}">
        <v-btn small depressed class="grey--text" @click="sortBysara('persona')" v-on="on">
          <v-icon left small>mdi-account</v-icon>
          <span class="caption text-lowercase">Sara</span>
        </v-btn>
          </template>
          <span> Ordina le schede di Sara</span>
        </v-tooltip>
        <v-col>
        <div align="right">
        <Popup @projectAdded="snackbar = true"/>
        </div>
        </v-col>
      </v-row>
      

       <v-card flat tile class="pa-3" v-for="project in projects" :key="project.titolo">
         <v-row row wrap :class="`pa-3 project ${project.stato}`">
           <v-col cols="12" md="7">
             <div class="caption grey--text">Ricordati di:</div>
             <div>{{ project.titolo }}</div>
           </v-col>
           <v-col xs="2">
             <div class="caption grey--text">Entro il</div>
             <div>{{ project.entro }}</div>
           </v-col>
           <v-col xs="2">
             <div align="right">
               <v-chip small :color="`${project.stato}`" :class="`v-chip--active white--text caption my-2`">{{ project.stato }}</v-chip>
             </div>
           </v-col>
           <v-col xs="2">
             <div align="right">
             <v-btn small icon @click="cancella(project.id)">
               <v-icon color="red darken-1">mdi-delete</v-icon>
             </v-btn>
             </div>
           </v-col>
         </v-row>
         <v-row cols="12">
          <v-divider></v-divider>
         </v-row>
       </v-card>

   </v-container>

  </div>
</template>
saibbyweb

您可以filter在项目阵列通过跳过具有相同的项目id作为deleted项目的ID。您可以尝试如下操作:

 if(change.type === 'removed') {
     /* keeping all the projects except the one whose's id matches with the deleted projects id */
     const projectsWithoutTheDeletedOne = this.projects.filter(project => project.id !== change.doc.id);

     /* replace the old projects array with this new one */
     this.projects = projectsWithoutTheDeletedOne;
 }
 

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Vue过滤“实时”结果?

来自分类Dev

如何使用Firestore进行实时位置更新?

来自分类Dev

vue2 & promise 如何更新变量?

来自分类Dev

如何从Express / Flask后端向vue.js前端发送实时状态更新

来自分类Dev

Vue分页-如何使用?

来自分类Dev

如何将 Vuetify 更新为使用 Vue-cli-2 创建的项目

来自分类Dev

使用Vue 2进行客户端表单验证

来自分类Dev

如何更新实时绘图并使用按钮在pyqtgraph中进行交互?

来自分类Dev

如何使用django和instagram API进行实时POST更新?

来自分类Dev

如何在vue2-datepicker中更新日期

来自分类Dev

更新 vue js 值

来自分类Dev

看不更新改变vue

来自分类Dev

Vue - 数组不更新

来自分类Dev

Vue 3与Vue 2的__vue__等价的是什么?

来自分类Dev

如何告诉Vue应用使用Firebase模拟器?

来自分类Dev

如何使用Mocha在Vue.js中测试DOM更新?

来自分类Dev

如何使用 put 方法更新 vue 组件上的数据?

来自分类Dev

如何使用 vue-chartjs 动态更新图表?

来自分类Dev

如何使用laravel和vue同时保存和更新

来自分类Dev

在vue组件中使用.vue组件

来自分类Dev

无法使用 vue/cli 创建 Vue 项目

来自分类Dev

如何使用Django渲染Vue

来自分类Dev

如何继承Vue Json

来自分类Dev

如何使 Vue Filter 递归?

来自分类Dev

Vue 2 Laravel 5.3无限更新循环

来自分类Dev

在Vue中使用fotorama

来自分类Dev

使用 Transition Vue 折叠

来自分类Dev

使用 Vue 插件

来自分类Dev

Vue.js:如何更新对象数组?