Библиотека Vuefire позволяет нам добавлять возможности управления базой данных Firebase прямо из нашего приложения Vue.

В этой статье мы рассмотрим, как использовать Vuefire и Vuexfire, чтобы добавить поддержку управления базой данных Cloud Firestore в наше приложение Vue.

Развязывание

Мы можем остановить синхронизацию состояния коллекции или документа с нашим хранилищем Vuex с помощью метода unbindFirestoreRef.

Например, мы можем написать:

db.js

import firebase from "firebase/app";
import "firebase/firestore";
export const db = firebase
  .initializeApp({ projectId: "project-id" })
  .firestore();
const { Timestamp, GeoPoint } = firebase.firestore;
export { Timestamp, GeoPoint };

main.js

import Vue from "vue";
import App from "./App.vue";
import { firestorePlugin } from "vuefire";
import { vuexfireMutations, firestoreAction } from "vuexfire";
import Vuex from "vuex";
import { db } from "./db";
Vue.use(Vuex);
Vue.use(firestorePlugin);
Vue.config.productionTip = false;
const store = new Vuex.Store({
  state: {
    books: []
  },
  mutations: {
    ...vuexfireMutations
  },
  actions: {
    bindBooksRef: firestoreAction((context) => {
      return context.bindFirestoreRef("books", db.collection("books"));
    }),
    unbindBooksRef: firestoreAction(({ unbindFirestoreRef }) => {
      unbindFirestoreRef("books");
    })
  },
  getters: {
    books: (state) => {
      return state.books;
    }
  }
});
new Vue({
  store,
  render: (h) => h(App)
}).$mount("#app");

App.vue

<template>
  <div>{{books}}</div>
</template>
<script>
import { mapGetters, mapActions } from "vuex";
export default {
  data() {
    return {};
  },
  methods: {
    ...mapActions(["bindBooksRef"])
  },
  computed: {
    ...mapGetters(["books"])
  },
  mounted() {
    this.bindBooksRef();
  }
};
</script>

Мы добавили действие unbindBookRef, которое вызывает unbindFirestoreRef со строкой имени коллекции.

По умолчанию, когда мы отвязываем коллекцию, состояние хранилища Vuex сбрасывается до исходного значения.

unbindFirestoreRef(“books”); совпадает с unbindFirestoreRef(“books”, true);.

Если мы не хотим, чтобы состояние сбрасывалось при отмене привязки, мы можем передать false в качестве второго аргумента:

unbindFirestoreRef("books", false);

Мы также можем сбросить состояние до значения, которое мы хотим, если мы передадим функцию, которая возвращает значение, которое мы хотим сбросить до:

unbindFirestoreRef('books', () => [{ title: 'foo' }])

Если мы сбросим документ, он будет сброшен на null:

unbindFirestoreRef('book')

Геоточки

Мы можем сохранить данные о геолокации в наших документах Firebase с помощью конструктора GeoPoint.

Это доступно только в Cloud Firestore.

Например, мы можем использовать его, написав:

main.js

import Vue from "vue";
import App from "./App.vue";
import { firestorePlugin } from "vuefire";
import { vuexfireMutations, firestoreAction } from "vuexfire";
import Vuex from "vuex";
import { db } from "./db";
Vue.use(Vuex);
Vue.use(firestorePlugin);
Vue.config.productionTip = false;
const store = new Vuex.Store({
  state: {
    cities: []
  },
  mutations: {
    ...vuexfireMutations
  },
  actions: {
    bindCitiesRef: firestoreAction((context) => {
      return context.bindFirestoreRef("cities", db.collection("cities"));
    })
  },
  getters: {
    cities: (state) => {
      return state.cities;
    }
  }
});
new Vue({
  store,
  render: (h) => h(App)
}).$mount("#app");

App.vue

<template>
  <div>{{cities}}</div>
</template>
<script>
import { mapGetters, mapActions } from "vuex";
import { db, GeoPoint } from "./db";
export default {
  data() {
    return {};
  },
  methods: {
    ...mapActions(["bindCitiesRef"])
  },
  computed: {
    ...mapGetters(["cities"])
  },
  async mounted() {
    this.bindCitiesRef();
    await db.collection("cities").add({
      name: "Paris",
      location: new GeoPoint(48.9, 2.3)
    });
  }
};
</script>

Мы просто вызываем add, чтобы добавить запись в нашу коллекцию Firestore.

Конструктор GeoPoint возвращает объект со свойствами latitude и longitude.

Это также аргументы конструктора.

Поскольку мы вызвали метод bindCitiesRef, документы коллекции автоматически синхронизируются с Vuex Store.

И мы вызвали mapGetters, чтобы сопоставить cities геттер с нашим компонентом, так что мы увидим документы в нашем шаблоне.

Заключение

Мы можем отвязаться от нашего магазина и добавить GeoPoint экземпляров в нашу коллекцию и сразу увидеть обновления.

Понравилась эта статья? Если да, то получите больше похожего контента, подписавшись на наш канал YouTube!