В одностраничном приложении, управляемом API, HTML/CSS/JS загружается раньше всего. Это означает, что на странице будут загружены макет и стили, но больше данных. Что мы сделаем, так это привяжем один из хуков жизненного цикла для компонента домашней страницы и загрузим данные. Если вы не знакомы с хуками жизненного цикла VueJS, ознакомьтесь с: Экземпляр Vue — Vue.js. По сути, это точки в процессе рендеринга компонента, к которым вы можете привязать определенные события.

На главной странице хотелось бы вывести список кафе хоть где-то, так что давайте пока загрузим все кафе на домашнем маршруте. Для этого откройте страницу /resources/assets/js/pages/Home.vue.

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

А пока добавьте заглушенный метод для привязки к хуку created() следующим образом:

<script>
  export default {
    created(){

    }
  }
</script>

Шаг 2. Отправьте действие «Загрузить кафе»

Поскольку нам нужно загрузить все кафе, нам нужно отправить действие на наш магазин. Есть несколько способов сделать это, как описано в документации: Действия · Vuex. Мне нравится вызывать метод переменной $store (которая является нашим глобальным хранилищем данных Vuex) для отправки действия. Если вы посмотрите на файл /resources/assets/js/modules/cafe.js, вы увидите все действия, которые мы настроили в предыдущем уроке. Нам нужно загрузить все кафе, поэтому мы будем использовать метод loadCafes. В наш хук жизненного цикла created() нам нужно добавить следующий код:

this.$store.dispatch( 'loadCafes' );

Это делает использование хранилища VueJS и отправку действия loadCafes, которое вызовет API, загрузит кафе и сохранит их в массиве кафе в модуле кафе. Теперь, когда страница загрузится, у нас также будут загружены все наши кафе! Я займусь оптимизацией этих загрузок в следующих уроках, потому что есть куча сценариев навигации, чтобы определить, перезагружаем ли мы кафе или нет, но пока мы будем жить как есть.

Шаг 3: Добавьте кафе в компонент

Это самый важный шаг, отображение данных! К сожалению, сейчас в нашей базе данных нет кафе, если только вы не используете Faker и не заполняете тестовые данные, что круто (GitHub — fzaninotto/Faker: Faker — это PHP-библиотека, которая генерирует для вас фальшивые данные). Мы просто настроим это для следующих нескольких частей серии, когда будем добавлять данные в нашу базу данных.

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

Для этого нам понадобятся 2 вычисляемых свойства, и мы добавим их в наш файл Home.vue следующим образом:

/*
      Defines the computed properties on the component.
    */
    computed: {
      /*
        Gets the cafes load status
      */
      cafesLoadStatus(){
        return this.$store.getters.getCafesLoadStatus;
      },

      /*
        Gets the cafes
      */
      cafes(){
        return this.$store.getters.getCafes;
      }

Теперь у нас есть два вычисляемых свойства, которые мы можем использовать для отображения данных. Каждый из методов возвращает данные из геттеров, которые мы определили в нашем модуле Vuex cafe.js. Теперь мы можем использовать вычисляемые свойства так же, как и с любым типом данных в нашем приложении.

Шаг 4: Отобразите данные

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

Чтобы показать состояние загрузки, вы можете добавить некоторые элементы в шаблон Home.vue, например:

<span v-show="cafesLoadStatus == 1">Loading</span>
<span v-show="cafesLoadStatus == 2">Cafes loaded successfully!</span>
<span v-show="cafesLoadStatus == 3">Cafes loaded unsuccessfully!</span>

Каждый из этих элементов будет отображаться с соответствующим статусом загрузки кафе.

Чтобы перечислить кафе, вы можете сделать что-то вроде этого:

<ul>
    <li v-for="cafe in cafes">{{ cafe.name }}</li>
</ul>

Каждое кафе — это объект, возвращаемый из базы данных. Для получения дополнительной информации о рендеринге списка ознакомьтесь с документацией VueJS здесь: Визуализация списка — Vue.js

Наш файл Home.vue должен выглядеть так:

<style>

</style>

<template>
  <div id="home">
    <span v-show="cafesLoadStatus == 1">Loading</span>
    <span v-show="cafesLoadStatus == 2">Cafes loaded successfully!</span>
    <span v-show="cafesLoadStatus == 3">Cafes loaded unsuccessfully!</span>

    <ul>
      <li v-for="cafe in cafes">{{ cafe.name }}</li>
    </ul>
  </div>
</template>

<script>
  export default {
    created(){
      this.$store.dispatch( 'loadCafes' );
    },

    /*
      Defines the computed properties on the component.
    */
    computed: {
      /*
        Gets the cafes load status
      */
      cafesLoadStatus(){
        return this.$store.getters.getCafesLoadStatus;
      },

      /*
        Gets the cafes
      */
      cafes(){
        return this.$store.getters.getCafes;
      }
    }
  }
</script>

Наше приложение загружает кафе и отображает статус загрузки. Мы будем стилизовать это, чтобы сделать его полезным, но пока это работает!

Вывод

Теперь у нас есть все на месте и полностью рабочая система нашего одностраничного приложения! Есть еще много руководств, которые нужно написать, и функций, которые нужно добавить, но мы к чему-то движемся! В следующем уроке я добавлю несколько стилей в приложение, чтобы сделать его более полезным, а затем мы добавим кафе через внешний интерфейс! Как я уже упоминал ранее, у каждой функции будет руководство и открытый код здесь: GitHub — serversideup/roastandbrew.

Привет! Мы пишем книгу по разработке приложений на основе API. Узнай первым, как только он будет готов! Зарегистрируйтесь здесь: Регистрация для разработки приложений на основе API