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

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

Геоточки

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

Это поддерживается только CloudFirestore.

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

<template>
  <div>
    <button @click="add">add city</button>
    <div v-for="c of cities" :key="c.id">{{c}}</div>
  </div>
</template>
<script>
import { db, GeoPoint } from "./db";
export default {
  data() {
    return {
      cities: []
    };
  },
  mounted() {
    this.$bind("cities", db.collection("cities"));
  },
  methods: {
    async add() {
      await db.collection("cities").add({
        name: "London",
        location: new GeoPoint(51.3, 0)
      });
    }
  }
};
</script>

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 };

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

Тогда у нас должно получиться что-то вроде:

{ "name": "London", "location": { "latitude": 51.3, "longitude": 0 } }

сохранены.

Отметки времени

Кроме того, мы можем сохранять временные метки с помощью Vuefire.

Мы используем метод Timestamp.fromDate для создания нашей отметки времени.

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

<template>
  <div>
    <button @click="add">add event</button>
    <div v-for="e of events" :key="e.id">{{e}}</div>
  </div>
</template>
<script>
import { db, Timestamp } from "./db";
export default {
  data() {
    return {
      events: []
    };
  },
  mounted() {
    this.$bind("events", db.collection("events"));
  },
  methods: {
    async add() {
      await db.collection("events").add({
        name: "event",
        date: Timestamp.fromDate(new Date("2029-07-14"))
      });
    }
  }
};
</script>

Мы передали экземпляр Date в Timestamp.fromDate.

Тогда получаем что-то вроде:

{ "name": "event", "date": { "seconds": 1878681600, "nanoseconds": 0 } }

сохранено в результате.

Vuefire

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

Чтобы использовать его, мы устанавливаем необходимые пакеты, запустив:

yarn add vuex vuexfire vuefire firebase

or

npm i vuex vuexfire vuefire firebase

Теперь мы можем создать наше хранилище Vuex и привязать его к базе данных Firebase, написав:

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"));
    })
  },
  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>

Как обычно, мы создаем наш магазин с конструктором Vuex.Store.

Но мы импортируем vuefireMutations и кладем в наш магазин.

Также наши действия создаются с помощью функции fireStoreAction.

И мы вызываем метод context.bindFirestoreRef, чтобы получить данные нашего магазина и установить их как состояние.

Первый аргумент - это имя состояния, а второй - это коллекция, которую мы хотим привязать к состоянию с заданным именем.

Также у нас есть геттер для получения состояния books.

В App.vue мы сопоставляем действия и геттеры с методами и вычисляемыми свойствами соответственно.

После этого мы можем вызвать действие this.bindBooksRef, которое мы сопоставили с методом заполнения состояния books.

Тогда наш шаблон должен показать books данные.

Заключение

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

Кроме того, библиотека Vuexfire позволяет нам легко привязать базу данных Firebase к нашему хранилищу Vuex.

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