Следите за тем, как мы создаем приложение базы данных фильмов с помощью Vue, Axios, Vuetify и API Open Movie Database.

Вступление

В этой статье мы будем создавать приложение Vue.js, поддерживаемое Vuetify и Axios. Цель этой статьи - реализовать приложение для просмотра фильмов, которое будет вызывать API. Пользователь сможет искать фильмы. API найдет фильмы со всеми деталями поиска. Когда пользователь нажимает на фильм, он предоставляет более подробную информацию о каждом фильме. Это довольно простое приложение, но оно объясняет вариант использования вызова API из приложения Vue.js.

СОДЕРЖАНИЕ

  1. Почему Аксиос?
  2. Почему Vuetify?
  3. Кратко об API фильмов
  4. Вызов и тестирование API и Test.
  5. Создать приложение
  6. Требования и структура Приложения
  7. Добавить Vuetify в проект
  8. Добавить в проект vue-router
  9. Добавить аксиомы в проект
  10. Удалите компонент, созданный в настоящий момент.
  11. Создать компонент LatestMovies
  12. Реализовать компонент Movie
  13. Показать рейтинги
  14. Добавить компонент "Поиск фильма"
  15. Проблема с поисковым фильмом и способы ее устранения
  16. Добавьте предупреждающее сообщение, если в API нет данных поиска
  17. Создание центрального файла для аксиом / рефакторинга
  18. Завершение и исходный код

1. Почему именно Axios?

В приложении Vue.js мы можем отображать данные из внешнего API. Это можно сделать с помощью vue-resource и axios. Axios - это популярная 3-я часть библиотеки. Вот официальная ссылка для использования Axios с Vue.js.

Здесь важно отметить, что в официальных документах нет подробностей об установке axios в приложение Vue.js. Мы рассмотрим это в Разделе 9: Добавление аксиом в проект.

2. Почему Vuetify?

Vuetify - это фреймворк материального дизайна, построенный на основе Vue.js. Он имеет приятные компоненты пользовательского интерфейса и может быть легко доступен для использования на Vue.js.

3. Краткое описание API фильмов.

Http://www.omdbapi.com/

Omdbapi - это открытый и бесплатный API базы данных фильмов, который также предоставит сведения о фильмах и изображениях. Главный недостаток заключается в том, что большинство изображений не очень четкие, но это поможет. Также есть поддержка API.

Чтобы использовать этот API, прежде всего, необходимо зарегистрироваться, и они предоставят вам ключ API, отправленный вам по почте. Это можно использовать для каждого результата запроса.

Требуется передающий ключ, а также специальная строка. s означает поиск, при передаче s = ”Indiana” API извлечет все данные, содержащие Indiana. Кроме того, i означает, что будет возвращен фильм с идентификатором imbd, поэтому возвращается только один, поскольку он уникален. Здесь для демонстрации мы используем « и «i».

4. Вызов и тестирование API и Test

Чтобы проверить, что мы получим при вызове omdbapi, нужно провести тестирование с помощью инструмента почтальона или любого механизма тестирования API. Вот я для этого использую почтальона.

Как вы видите на изображении, необходимо передать apikey = XXXX и s = "название фильма".

Таким образом, URL-адрес становится

Http://www.omdbapi.com/?s=movie-name&apikey=XXXX&page=1&type=movie&Content-Type=application/json

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

5. Создайте приложение.

Создать приложение Vue js можно с помощью простой команды

vue create movie-app

movie-app - это название нашего приложения.

6. Требования и структура Приложения.

В структуре приложения 3 компонента.

  1. Компонент LatestMovie.
  2. Компонент Movie.
  3. Компонент SearchMovie.

Компонент LatestMovie будет иметь текущую домашнюю страницу, и я покажу фильмы, связанные с моим любимым фильмом «Индиана».

При нажатии на каждый фильм будет отображаться подробная информация о каждом отдельном фильме, что можно сделать с помощью компонента «Фильм».

Предоставляется возможность поиска и отображения тех фильмов, которые могут обрабатываться компонентом SearchMovie.

7. Добавьте Vuetify в проект.

Как уже говорилось, мы используем Vuetify для дизайна приложения. Для этого нужно подготовить какой-то фундамент. на терминале введите

vue add vuetify

После установки наш интерфейс будет выглядеть так:

Отлично, они также предоставляют панель навигации. Потом продолжим.

8. Добавьте в проект vue-router.

Объясню, зачем нам нужен vue-router, он без проблем выполнит функции маршрутизации и переключение компонентов. Установка vue-router осуществляется

npm install vue-router

Теперь необходимо связать маршрутизатор с приложением и создать файл маршрутов.

  1. Создайте файл роутера
  2. Добавить контент в файл роутера
  3. Свяжите роутер с приложением

1. Создайте файл маршрутизатора.

Я следую шаблону, по которому создаю папку с именем router в пути src, и в ней будет создан файл index.js файл

2. Добавьте содержимое в файл маршрутизатора

До сих пор мы создали файл router / index.js, теперь необходимо импортировать экземпляр Vue и vue-router в этот файл, необходимо экспортировать файл маршрутизатора по умолчанию.

Каждый путь маршрутизатора будет состоять из трех компонентов: путь, имя, компонент.

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
export default new VueRouter({
  routes: [
    {
    }
  ]
})

3. Свяжите роутер с приложением

Во-первых, необходимо импортировать маршрутизатор из пути и использовать его в экземпляре Vue. Все это делается в файле src / main.js

import router from ‘./router’

Текущий файл main.js будет выглядеть так:

import Vue from 'vue'
import './plugins/vuetify'
import App from './App.vue'
import router from './router'
Vue.config.productionTip = false
new Vue({
  render: h => h(App),
  router
}).$mount('#app')

9. Добавьте в проект аксиомы.

Axios - это наша точка контакта для вызова служб API в этом приложении. Теперь нам нужно установить axios в наш проект.

npm install axios --save

10. Удалите компонент, на котором в данный момент возведены строительные леса.

По умолчанию у нас есть компонент, мы удалим его и создадим необходимые нам компоненты.

HelloWorld.vue - это компонент по умолчанию, он будет удален из нашего приложения.

11. Создайте компонент LatestMovie.

Здесь нужно сделать несколько шагов

  1. Создайте LatestMovie.vue.
  2. Добавьте аксиомы в компонент LatestMovie.
  3. Свяжите роутер с LatestMovie.
  4. Добавьте индикатор выполнения для LatestMovie.
  5. Создайте LatestMovie.vue.

Создайте файл с именем LatestMovie.vue в папке компонентов.

2. Добавьте аксиомы в компонент LatestMovie.

Здесь мы используем жизненный цикл mount () для этого, добавили код, чтобы получить результат от omdbapi с данными индийского фильма.

mounted () {
  axios
    .get('http://www.omdbapi.com/?s=mummy&apikey=XXXXX&page=1&type=movie&Content-Type=application/json')
    .then(response => {
      this.wholeResponse = response.data.Search
    })
    .catch(error => {
      console.log(error)
    })
}

3. Свяжите маршрутизатор с LatestMovie.

Теперь нам нужно связать LatestMovie с файлом маршрутизатора.

в src / router / index.js:

import LatestMovie from '@/components/LatestMovie'

добавляем ссылки на router / index.js:

export default new VueRouter({
  routes: [
   {
      path: '/',
      name: 'LatestMovie',
      component: LatestMovie
    }
  ]
})

4. Добавить индикатор выполнения для LatestMovie

Если для получения API потребуется время, нам потребуется отобразить индикатор выполнения. Этого можно добиться с помощью «‹ v-progress -icing » из vuetify.

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

Также о данных позаботится другое свойство данных под названием wholeResponse.

Таким образом, наш LatestMovie.vue становится следующим:

<template>
<v-container v-if="loading">
    <div class="text-xs-center">
      <v-progress-circular
        indeterminate
        :size="150"
        :width="8"
        color="green">
      </v-progress-circular>
    </div>
  </v-container>
<v-container v-else grid-list-xl>
    <v-layout wrap>
      <v-flex xs4
        v-for="(item, index) in wholeResponse"
        :key="index"
        mb-2>
        <v-card>
          <v-img
            :src="item.Poster"
            aspect-ratio="1"
          ></v-img>
<v-card-title primary-title>
            <div>
              <h2>{{item.Title}}</h2>
              <div>Year: {{item.Year}}</div>
              <div>Type: {{item.Type}}</div>
              <div>IMDB-id: {{item.imdbID}}</div>
            </div>
          </v-card-title>
<v-card-actions class="justify-center">
            <v-btn flat
              color="green"
              @click="singleMovie(item.imdbID)"
              >View</v-btn>
          </v-card-actions>
</v-card>
      </v-flex>
  </v-layout>
  </v-container>
</template>
<script>
import axios from 'axios'
export default {
  data () {
    return {
      wholeResponse: [],
      loading: true
    }
  },
  mounted () {
  axios
    .get('http://www.omdbapi.com/?s=indiana&apikey=XXXX&page=1&type=movie&Content-Type=application/json')
    .then(response => {
      this.wholeResponse = response.data.Search
      this.loading = false
    })
    .catch(error => {
      console.log(error)
    })
  }
}
</script>
<style lang="stylus" scoped>
  .v-progress-circular
    margin: 1rem
</style>

Теперь добавьте представление маршрутизатора в App.vue, чтобы отобразить компонент:

<router-view></router-view>

12. Реализуйте компонент Movie

Теперь пришло время для отдельной части фильма. Этого можно добиться с помощью файла Movie.vue.

  1. Добавьте файл Movie.vue
  2. Добавьте роутер
  3. Добавить режим
  4. Вставьте стойки в роутер.
  5. Передайте реквизит в последний компонент.
  6. Работайте с данными props в компоненте фильма.

Добавьте файл Movie.vue

Добавьте файл в components / Movie.vue

Добавьте маршрутизатор

Зарегистрируйте Movie.vue в файле router / index.js.

import Movie from '@/components/Movie'

Добавить режим

В URL-адресе есть символ #, мы можем удалить те, которые используют

mode: 'history'

В файле router / index.js.

Вставьте опоры в маршрутизатор.

Создайте путь для компонента Movie.vue, используя приведенный ниже код в файле router / index.js.

{
      path: '/movie/:id',
      name: 'Movie',
      props: true,
      component: Movie
    },

Мы указываем props: true, потому что мы передаем imdb_id компоненту Movie.vue, а затем это значение используется для вызова API для этого единственного фильма.

Передайте реквизиты в последний компонент

Теперь, щелкнув представление в LatestMovie, вызовет метод, который, в свою очередь, передаст imdb_id в качестве свойства Movie.vue.

<v-btn round
              color="green"
              @click="singleMovie(item.imdbID)"
              >View</v-btn>

а метод singleMovie -

methods: {
    singleMovie (id) {
      this.$router.push('/movie/' + id)
    }
  }

Работа с данными реквизита в компоненте фильма

Теперь данные передаются из LatestMovie. Это значение получено как свойство в компоненте Movie.vue. Это значение может использоваться this.id

Также добавлено свойство данных singleMovie для обработки ответа.

Код в Movie.vue становится следующим:

<template>
  <v-container>
    <v-layout row wrap>
      <v-flex xs12>
        <h2>welcome to single movie component</h2>
          <div>{{singleMovie}}</div>
      </v-flex>
    </v-layout>
  </v-container>
</template>
<script>
import axios from 'axios'
export default {
  props: ['id'],
  data () {
    return {
      singleMovie: ''
    }
  },
  mounted () {
    axios
      .get('http://www.omdbapi.com/?apikey=b76b385c&i=XXXXX&Content-Type=application/json')
      .then(response => {
        this.singleMovie = response.data
      })
      .catch(error => {
        console.log(error)
      })
  }
}
</script>
<style>
</style>

13. Отображение оценок

Omdbapi предоставит нам текущие рейтинги фильма. Мы отобразим это значение в таблице,

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

<template>
<v-layout row wrap>
      <v-flex xs12>
        <div class="text-xs-center">
        <v-dialog
          v-model="dialog"
          width="500">
          <v-btn
            slot="activator"
            color="green"
            dark>
            View Ratings
          </v-btn>
          <v-card>
            <v-card-title
              class="headline grey lighten-2"
              primary-title
            >
              Ratings
            </v-card-title>
            <v-card-text>
              <table style="width:100%" border="1" >
                <tr>
                  <th>Source</th>
                  <th>Ratings</th>
                </tr>
                <tr v-for="(rating,index) in this.ratings" :key="index">
                  <td align="center">{{ratings[index].Source}}</td>
                  <td align="center">{{ratings[index].Value}}</td>
                </tr>
              </table>
            </v-card-text>
            <v-divider></v-divider>
            <v-card-actions>
              <v-spacer></v-spacer>
              <v-btn
                color="primary"
                flat
                @click="dialog = false"
              >
                OK
              </v-btn>
            </v-card-actions>
          </v-card>
        </v-dialog>
      </div>
      </v-flex>
    </v-layout>
  </template>

Мы повторяем значение данных, называемое рейтингами. Это свойство данных получено из ответа API, т.е. r esponse.data.Ratings.

14. Добавить компонент "Поиск фильма"

Для этого нам нужно создать следующее:

  1. Создайте файл SearchMovie.vue
  2. Создайте текстовое поле в App.vue.
  3. При нажатии кнопки поиска данные из текстового поля будут переданы в файл SearchMovie.vue в качестве свойства.
  4. В файле SearchMovie.vue мы получим значение и вызовем API для получения данных.

Совершить ссылку для этого

15. Проблема с поисковым фильмом и способы ее устранения.

Установленный на данный момент хук жизненного цикла вызывается только один раз, когда мы ищем один раз, он отображает данные, то есть при поиске с помощью Iron Man он показывает данные. но после поиска с «титаном» он показывает те же данные. Это можно исправить, используя свойство watch в свойствах данных с именем name (из App.vue) и обновив смонтированное свойство как метод. В результате система вызовет 2 раза, то есть когда первый загружается с помощью смонтированного хука жизненного цикла и снова поиск будет обрабатываться действием наблюдателя для значения props (name).

Ссылка фиксации для исправления

16. Добавьте предупреждающее сообщение, если в API нет данных поиска.

Предположим, когда мы вызываем API с недопустимым фильмом или фильмом, который недоступен в нашем omdbapi. В этом случае необходимо вывести сообщение.

Мы создаем свойство данных по умолчанию, которое имеет значение false, когда искомые данные ничего не возвращают, будет установлено значение true и будет отображаться сообщение.

Ссылка на фиксацию для изменения кода

17. Создание центрального файла для аксиом / рефакторинга

Тем не менее, наши коды вызова axios и API разбросаны по всему компоненту. Будет хорошо, если мы разместим все это в одном месте, как сервисы в angular.

Для этого

  1. Создайте папку с именем services в src / и создайте файл MovieApi.js
  2. Импортируйте аксиомы в main.js
  3. Создайте URL-адрес по умолчанию в main.js
  4. Экспорт файла MovieApi.js
  5. Импортируйте MovieApi.js в компоненты.
  6. Удалите код axios из компонентов и поместите в файл MovieApi.js.
  7. Вызовите соответствующие методы из компонентов.

Ссылка на фиксацию для изменения кода

18. Заключение и исходный код

Наш окончательный результат будет таким:

Если эта история поможет вам узнать что-нибудь, пожалуйста, купи мне кофе.

GitHub URL

И вот оно!

Надеюсь, вам понравилось следовать за мной. Пожалуйста, оставляйте аплодисменты и комментарии, если вам понравился контент и вы хотите обсудить его дальше!