Vue.js 2 + Firebase

Это сообщение было впервые опубликовано на CodingTheSmartWay.com.

Создание одностраничных веб-приложений в реальном времени с помощью Vue.js 2 и Firebase

Firebase - это платформа для мобильных и веб-приложений, поддерживающая разработчиков с помощью различных инструментов и сервисов для создания высококачественных приложений. Центральной особенностью Firebase является база данных в реальном времени. Используя Firebase API, базу данных в реальном времени можно использовать для хранения и синхронизации данных между несколькими клиентами и платформами. Веб-сайт Firebase доступен по адресу: https://firebase.google.com/.

Firebase идеально подходит для Vue.js. База данных реального времени может использоваться как бэкэнд для уровня представления, который реализован с помощью Vue.js 2. Для интеграции служб Firebase с вашим приложением Vue.js 2 можно использовать библиотеку VueFire.

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

Что мы собираемся построить

Приложение, которое мы собираемся создать в этом руководстве, можно увидеть следующим образом:

Это простое приложение для управления книгами, которое распечатывает список книг (со ссылкой на соответствующий веб-сайт). Данные о книгах извлекаются из базы данных Firebase. Пользователь может добавлять новые книги в список и удалять существующие записи. Данные хранятся в базе данных Firebase, и все операции с базой данных синхронизируются в реальном времени между всеми экземплярами приложения.

Для создания пользовательского интерфейса приложения мы используем Bootstrap Framework. Чтобы показать пользователю всплывающее уведомление после успешного удаления книги, используется библиотека JavaScript Toastr:

Настройка Firebase

Прежде чем приступить к реализации приложения Vue, нам сначала нужно настроить базу данных Firebase в реальном времени.

Чтобы настроить Firebase, вам сначала нужно перейти на https://firebase.google.com/ создать учетную запись и войдите в консоль Firebase. Консоль Firebase дает вам доступ ко всем службам и параметрам конфигурации Firebase. Во-первых, нам нужно создать новый проект Firebase:

После создания проекта вы можете нажать на плитку проекта, и вы будете перенаправлены в консоль проекта Firebase:

Консоль проекта - это центральное место для настроек конфигурации Firebase. В меню слева вы можете получить доступ к различным службам Firebase. Щелкните ссылку База данных, чтобы получить доступ к просмотру базы данных в реальном времени. Вы можете использовать онлайн-редактор для добавления контента в базу данных, например:

Как видите, данные в базе данных реального времени организованы в виде иерархического дерева, которое содержит узлы и пары ключ-значение. Это похоже на структуру данных JSON. Под корневым узлом добавьте подузел items. В разделе элементы создайте несколько пар ключ-значение, как показано на снимке экрана. Позже мы будем использовать эти элементы данных в нашем примере приложения.

Наконец, нам нужно отредактировать правила безопасности базы данных, чтобы мы могли позже получить доступ к данным без аутентификации в нашем примере приложения Angular 2. Перейдите на вкладку Правила и отредактируйте данные правила безопасности, чтобы они соответствовали следующему:

{
"rules": {
".read": true,
".write": true
}
}

Теперь доступ для чтения и записи к базе данных возможен без аутентификации.

Настройка проекта Vue.js 2 (с Vue CLI)

Подготовив базу данных Firebase в реальном времени, мы готовы приступить к реализации слоя представления. Самый простой способ запустить новый проект Vue.js 2 - использовать Vue CLI:

$ vue init webpack vuejs-firebase-01

Новый каталог проекта vuejs-firebase-01 создается, и в этот каталог загружается шаблон Vue Webpack. Нам нужно завершить настройку проекта, перейдя в этот каталог и выполнив следующую команду:

$ npm install

Это гарантирует, что все зависимости загружены и установлены в node_modules подпапка.

Добавление библиотеки Firebase и VueFire в проект

Библиотека VueFire (https://github.com/vuejs/vuefire) упрощает привязку данных Firebase к свойствам данных Vue.js. Чтобы добавить VueFire и базовую библиотеку Firebase в проект, выполните следующую команду в каталоге проекта:

$ npm install firebase vuefire --save

В файле main.js мы Теперь можно импортировать VueFire. Также необходимо вызвать Vue.use(VueFire), чтобы сделать библиотеку доступной в проекте:

import Vue from 'vue'
import VueFire from 'vuefire'
import App from './App'
Vue.use(VueFire)
new Vue({
  el: '#app',
  template: '<App/>',
  components: { App }
})

Добавление Bootstrap в проект

Поскольку мы хотели бы использовать Bootstrap CSS и компоненты в нашем примере приложения, нам также необходимо добавить этот фреймворк в проект. Чтобы добавить фреймворк в наш проект, нам нужно включить соответствующий файл CSS и JavaScript в index.html. Ресурсы можно получить из CDN, как вы можете видеть на следующем рисунке:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>vuejs-firebase-01</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
  </head>
  <body>
    <div id="app"></div>
    
    <!-- built files will be auto injected -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
  </body>
</html>

Подключение к Firebase

Когда в проект добавлены все библиотеки, теперь мы можем установить соединение с базой данных Firebase. Давайте добавим следующий код в раздел сценария в файле App.vue:

import Firebase from 'firebase'
let config = {
    apiKey: "...",
    authDomain: "...",
    databaseURL: "...",
    storageBucket: "...",
    messagingSenderId: "..."
  };
  
let app = Firebase.initializeApp(config)
let db = app.database()
let booksRef = db.ref('books')

Сначала мы импортируем Firebase из основной библиотеки Firebase. Для создания экземпляра Firebase мы используем фабричный метод initializeApp. Этот метод ожидает объект конфигурации, содержащий следующие свойства: apiKey, authDomain, databaseURL, storageBucket и messagingSenderId. Значения свойств необходимо установить в соответствии с созданным проектом Firebase. Вы можете очень легко получить значения из консоли Firebase. Откройте страницу обзора проекта и нажмите ссылку Добавить Firebase в свое веб-приложение.

В открывшемся всплывающем окне вы получите предварительно заполненный объект конфигурации в нотации JSON.

Теперь, когда экземпляр Firebase хранится в приложении, мы можем получить ссылку на базу данных с помощью вызова app.database (). Теперь, когда ссылка на базу данных доступна, мы, наконец, можем получить ссылку на узел books в нашей базе данных:

let booksRef = db.ref('books')

Реализация вывода списка книг

Библиотека VueFire позволяет очень легко привязать свойства Vue.js к данным Firebase. Просто добавьте в объект конфигурации компонента следующее:

firebase: {
    books: booksRef
  },

Теперь переменная books дает нам доступ к элементам книг из базы данных Firebase, чтобы мы могли вывести данные в шаблон:

<div class="panel-body">
    <table class="table table-striped">
      <thead>
        <tr>
          <th>Title</th>
          <th>Author</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="book in books">
          <td><a v-bind:href="book.url">{{book.title}}</a></td>
          <td>{{book.author}}</td>
        </tr>
      </tbody>
    </table>
  </div>

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

Внедрение формы ввода книги

Затем давайте посмотрим, как новые элементы могут быть добавлены в базу данных в реальном времени. Сначала мы определяем модель данных:

data () {
    return {
      newBook: {
          title: '',
          author: '',
          url: 'http://'
      }
    }
  },

Далее соответствующая форма ввода реализуется в шаблоне компонента:

<div class="panel panel-default">
      <div class="panel-heading">
        <h3 class="panel-title">Add New Books</h3>
      </div>
      <div class="panel-body">
         <form id="form" class="form-inline" v-on:submit.prevent="addBook">
          <div class="form-group">
            <label for="bookTitle">Title:</label>
            <input type="text" id="bookTitle" class="form-control" v-model="newBook.title">
          </div>
          <div class="form-group">
            <label for="bookAuthor">Author:</label>
            <input type="text" id="bookAuthor" class="form-control" v-model="newBook.author">
          </div>
          <div class="form-group">
            <label for="bookUrl">Url:</label>
            <input type="text" id="bookUrl" class="form-control" v-model="newBook.url">
          </div>
          <input type="submit" class="btn btn-primary" value="Add Book">
        </form>
      </div>
    </div>

HTML-форма состоит из трех входных элементов: заголовок, автор и URL-адрес книги. С помощью директивы v-model свойства newBook ​​ привязываются к соответствующим элементам управления вводом.

С помощью директивы v-on событие отправки привязано к методу обработчика событий addBook. Чтобы реализовать addBook, добавьте свойство methods к объекту конфигурации компонента и назначьте объект, содержащий реализацию addBook.

methods: {
      addBook: function () {
        booksRef.push(this.newBook);
        this.newBook.title = '';
        this.newBook.author = '';
        this.newBook.url = 'http://';
      },
    },

Поскольку мы использовали привязку данных для синхронизации значения элементов управления вводом формы с объектом newBook ​​, мы можем использовать этот объект в addBook и передать ему вызов метода booksRef.push. Это вставляет новый объект книг в узел книг Firebase и автоматически синхронизирует данные между всеми подключенными клиентскими экземплярами приложения.

Реализация функции удаления

На следующем этапе давайте расширим реализацию и добавим функцию удаления, чтобы пользователь мог удалять записи из таблицы книг. Сначала добавьте в таблицу еще один столбец со значком, по которому пользователь может щелкнуть, чтобы удалить запись:

<td><span class="glyphicon glyphicon-trash" aria-hidden="true" v-on:click="removeBook(book)"></span></td>

Опять же, мы используем v -on, чтобы связать событие щелчка с методом обработчика событий removeBook. Реализацию метода можно увидеть в следующем:

removeBook: function (book) {
    booksRef.child(book['.key']).remove()
}

Чтобы удалить элемент книги из базы данных Firebase, мы сначала выбираем узел книги с помощью метода child. Этот метод ожидает получить ключ элемента книги, который должен быть выбран. У нас уже есть доступ к этой информации через book['.key']. Наконец, нам нужно вызвать remove () для возвращенного объекта книги, чтобы удалить его из базы данных.

Добавление всплывающих уведомлений

В качестве последнего штриха мы добавляем в наше приложение библиотеку Toastr, которая будет отображать всплывающее уведомление при каждом удалении книги.

Добавьте CSS-файл Toastr из CDN в заголовок index.html:

<link href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.css" rel="stylesheet"/>

Затем добавьте NPM-пакет toastr в проект и сохраните эту зависимость в package.json:

$ npm install toastr --save

Теперь мы можем добавить следующий оператор импорта поверх раздела скрипта в App.vue:

import toastr from 'toastr'

Внутри removeBook вызов метода toastr.success обеспечивает отображение уведомления:

removeBook: function (book) {
   booksRef.child(book['.key']).remove()
   toastr.success('Book removed successfully')
 }

Резюме

Сложив все части вместе, вы получите следующий код внутри Vue.app:

<template>
  <div id="app" class="container">
    <div class="page-header">
      <h1>Vue.js 2 & Firebase <small>Sample Application by CodingTheSmartWay.com</small></h1>
    </div>
    <div class="panel panel-default">
      <div class="panel-heading">
        <h3 class="panel-title">Add New Books</h3>
      </div>
      <div class="panel-body">
         <form id="form" class="form-inline" v-on:submit.prevent="addBook">
          <div class="form-group">
            <label for="bookTitle">Title:</label>
            <input type="text" id="bookTitle" class="form-control" v-model="newBook.title">
          </div>
          <div class="form-group">
            <label for="bookAuthor">Author:</label>
            <input type="text" id="bookAuthor" class="form-control" v-model="newBook.author">
          </div>
          <div class="form-group">
            <label for="bookUrl">Url:</label>
            <input type="text" id="bookUrl" class="form-control" v-model="newBook.url">
          </div>
          <input type="submit" class="btn btn-primary" value="Add Book">
        </form>
      </div>
    </div>
    <div class="panel panel-default">
      <div class="panel-heading">
        <h3 class="panel-title">Book List</h3>
      </div>
      <div class="panel-body">
        <table class="table table-striped">
          <thead>
            <tr>
              <th>Title</th>
              <th>Author</th>
              <th></th>
            </tr>
          </thead>
          <tbody>
            <tr v-for="book in books">
              <td><a v-bind:href="book.url">{{book.title}}</a></td>
              <td>{{book.author}}</td>
              <td><span class="glyphicon glyphicon-trash" aria-hidden="true" v-on:click="removeBook(book)"></span></td>
            </tr>
          </tbody>
        </table>
      </div>
    </div>
  </div>
</template>
<script>
import Hello from './components/Hello'
import Firebase from 'firebase'
import toastr from 'toastr'
let config = {
    apiKey: "...",
    authDomain: "...",
    databaseURL: "...",
    storageBucket: "...",
    messagingSenderId: "..."
  };
  
let app = Firebase.initializeApp(config)
let db = app.database()
let booksRef = db.ref('books')

export default {
  name: 'app',
  firebase: {
    books: booksRef
  },
  
  data () {
    return {
      newBook: {
          title: '',
          author: '',
          url: 'http://'
      }
    }
  },
  
   methods: {
      addBook: function () {
        booksRef.push(this.newBook);
        this.newBook.title = '';
        this.newBook.author = '';
        this.newBook.url = 'http://';
      },
      removeBook: function (book) {
        booksRef.child(book['.key']).remove()
        toastr.success('Book removed successfully')
      }
    },
  
  components: {
    Hello
  }
}
</script>
<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  color: #2c3e50;
  margin-top: 20px;
}
</style>

Резюме

Vue.js 2 упрощает реализацию уровня представления одностраничного веб-приложения. Поскольку Vue не делает никаких предположений о бэкэнд-технологии, его можно использовать вместе с разными стеками приложений. Если вы хотите синхронизировать данные в реальном времени в своем приложении, Firebase - отличный вариант для создания серверной части.

Видеоурок

Этот видеоурок содержит шаги, описанные в тексте выше:

Это сообщение было впервые опубликовано на CodingTheSmartWay.com.