Как добавить Firebase в список задач Vuex? - PullRequest
1 голос
/ 18 мая 2019

Я создаю простое приложение со списком задач Vue.js, используя Vue.js, Vuex и Firebase. Хранилище Vuex отправляет, фиксирует и возвращает введенные данные так, как должно, но я хочу иметь возможность подключить приложение к базе данных Firestore. До сих пор мне удалось настроить приложение так, чтобы данные помещались в коллекцию, но я также хочу, чтобы база данных возвращала моментальный снимок данных пожарного хранилища в DOM, а также позволяла удалять данные из базы данных. У меня есть опыт использования этих методов Firestore в простых не Vuex-проектах, но я не уверен, как синтезировать методы Firestore с хранилищем Vuex. Как я могу это сделать? Вот что у меня так далеко. Большое спасибо!

<!--GetTodo.vue-->

<template>
  <div id="get-todo" class="container">
      <input class="form-control" :value="newTodo" @change="getTodo" placeholder="I need to...">
      <button class="btn btn-primary" @click="addTodo">Add New Post</button>
      <ul class="list-group">
          <li class="list-group-item" v-for="todo in todos">
              {{todo.body}}
          <div class="btn-group">
              <button type="button" @click="remove(todo)" class="btn btn-default btn-sm">
              <span class="glyphicon glyphicon-remove-circle"></span> Remove
              </button>
          </div>
          </li>
      </ul>
  </div>
</template>

<script>
export default {
 methods: {
   getTodo(e) {
     this.$store.dispatch('getTodo', e.target.value)
   },
   addTodo() {
     this.$store.dispatch('addTodo')
     this.$store.dispatch('clearTodo')
   },
   remove(todo){
     this.$store.dispatch('removeTodo', todo)
   }
 },
 computed: {
   todos(){
       return this.$store.getters.todos
   },
   newTodo() {
     return this.$store.getters.newTodo
   }
 }

}
</script>

<style>
</style>
//store.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex);

import db from '../firebase';

export default new Vuex.Store({
  state: {
    todos: [],
    newTodo: ''
  },
  mutations: { //syncronous, committed
    GET_TODO(state, todo){
      state.newTodo = todo
    },
    ADD_TODO(state){
      state.todos.push({
        body: state.newTodo,
        completed: false
      })
      db.collection('messages').add({
        content: state.newTodo
      })
    },
    REMOVE_TODO(state, todo){
       var todos = state.todos
       todos.splice(todos.indexOf(todo), 1)
    },
    CLEAR_TODO(state){
      state.newTodo = ''
    }
  },
  actions: { //asyncronous, dispatched
    getTodo({commit}, todo){
      commit('GET_TODO', todo)
    },
    addTodo({commit}){
      commit('ADD_TODO')
    },
    removeTodo({commit}, todo){
      commit('REMOVE_TODO', todo)
    },
    clearTodo({commit}){
      commit('CLEAR_TODO')
    }
  },
  getters: {
    newTodo: state => state.newTodo,
    todos: state => state.todos.filter((todo) => {
      return !todo.completed
    })
  }
})
<!--App.vue-->
<template>
  <div id="app" class="container">
    <GetTodo></GetTodo>
  </div>
</template>
<script>
import GetTodo from './components/GetTodo.vue'
export default {
  components: {
    GetTodo
  }

}
</script>
<style>
body {
  font-family: Helvetica, sans-serif;
}
li {
  margin: 10px;
}
</style>

1 Ответ

0 голосов
/ 18 мая 2019

Вы можете сделать синхронизацию в своей мутации, см. Пример ниже: источник: https://www.codewall.co.uk/how-to-create-a-real-time-to-do-list-app-with-vue-vuex-firebase-tutorial/

    import Vue from 'vue'
    import Vuex from 'vuex'
    import { db } from '@/main'

    Vue.use(Vuex)

    export default new Vuex.Store({
      state: {
        items: null
      },
      getters: {
        getItems: state => {
          return state.items
        }
      },
      mutations: {
        setItems: state => {
          let items = []

          db.collection('items').orderBy('created_at').onSnapshot((snapshot) => {
            items = []
            snapshot.forEach((doc) => {
              items.push({ id: doc.id, title: doc.data().title })
            })

            state.items = items
          })
        }
      },
      actions: {
        setItems: context => {
          context.commit('setItems')
        }
      }
    })


import { db } from '@/main'

export default {
  name: 'home',
  beforeCreate: function () {
    this.$store.dispatch('setItems')
  },
  data: function () {
    return {
      myTodo: '',
      errors: ''
    }
  },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...