Создание приложения, отображающего данные из API New York Times.
Quasar - это альтернативная библиотека виджетов для приложений Vue.js. Его легко включить в приложение Vue.js, и результат также будет привлекательным для пользователей.
В этой части мы создадим приложение, которое отображает данные из New York Times API. Вы можете зарегистрироваться для получения ключа API на https://developer.nytimes.com/. После этого мы можем приступить к созданию приложения.
Создание приложения
Чтобы начать сборку приложения, мы должны установить Vue CLI. Мы делаем это, запустив:
npm install -g @vue/cli
Для запуска Vue CLI требуется Node.js 8.9 или новее. Мне не удалось заставить Vue CLI работать с версией Node.js. для Windows. У Ubuntu не было проблем с запуском Vue CLI для меня. Создайте папку проекта и ее файлы, запустив:
vue create quasar-nyt-app
В мастере вместо использования параметров по умолчанию мы выбираем «Выбрать функции вручную». Затем мы выбираем Babel, Router и Vuex из списка опций, нажимая пробел на каждой. Если они зеленые, это означает, что они выбраны.
Теперь нам нужно установить несколько библиотек. Нам нужно установить HTTP-клиент, библиотеку для форматирования дат, одну для генерации строки запроса GET из объектов, а другую для проверки формы. Нам также необходимо установить саму библиотеку Vue Material. Мы делаем это, запустив:
npm i axios moment querystring vee-validate
axios
- наш HTTP-клиент, moment
- для управления датами, querystring
- для генерации строки запроса из объектов, а vee-validate
- дополнительный пакет для Vue.js для выполнения проверки.
Затем мы запускаем vue add quasar
, чтобы добавить шаблонный код Quasar для нашего приложения. После выполнения этой команды мы должны получить новый оператор Vue.use
для библиотеки Quasar и макет по умолчанию, который мы настроим.
В quasar.js
, который должен быть сгенерирован при запуске vue add quasar
, мы помещаем:
Это должно импортировать все виджеты, которые мы включим в наше приложение.
В другом файле, который необходимо сгенерировать, Default.vue
, мы имеем:
Теперь, когда у нас установлены все библиотеки, мы можем приступить к созданию нашего приложения. Сначала мы создаем некоторые компоненты. В папке views
создаем Home.vue
и Search.vue
. Это файлы кода для наших страниц. Затем создайте папку mixins
и создайте файл с именем nytMixin.js
. Миксины - это фрагменты кода, которые можно включать непосредственно в наши компоненты Vue.js и использовать, как если бы они были непосредственно в компоненте.
Теперь нам нужно добавить несколько фильтров. Фильтры - это код Vue.js, который отображает одно на другое. Создаем папку filters
и добавляем capitalize.js
и formatDate.js
. Затем в папке components
создайте файл с именем SearchResults.vue
. Папка components
содержит компоненты Vue.js, которые не являются страницами.
Чтобы упростить и упорядочить передачу данных между компонентами, мы используем Vuex для управления состоянием. Поскольку мы выбрали Vuex при запуске vue create
, у нас должен быть store.js
в папке нашего проекта. Если нет, создайте его. В store.js
мы помещаем:
В объекте state
хранится состояние. Объект mutations
- это то место, где мы можем управлять своим состоянием. Когда мы вызываем this.$store.commit(“setSearchResults”, searchResults)
в нашем коде, учитывая, что searchResults
определено, тогда state.searchResults
будет установлено в searchResults
. Затем мы можем получить результат с помощью this.$store.state.searchResults
.
Нам нужно добавить шаблонный код в наше приложение. Сначала добавляем наш фильтр. В capitalize.js
положить:
Это позволяет нам использовать заглавные буквы в названиях разделов New York Times, перечисленных на https://developer.nytimes.com/docs/top-stories-product/1/routes/%7Bsection%7D.json/get.
В formatDate.js
мы помещаем:
Это форматирует наши даты в удобочитаемый формат.
В main.js
мы помещаем:
Обратите внимание, что в приведенном выше файле мы должны зарегистрировать библиотеки, которые мы используем, с Vue.js, вызвав для них Vue.use
, чтобы их можно было использовать в наших шаблонах приложений. Мы вызываем Vue.filter
для наших функций фильтрации, чтобы мы могли использовать их в наших шаблонах, добавляя канал и имя фильтра справа от нашей переменной.
В router.js
мы помещаем:
Это позволяет нам переходить на страницы, когда мы вводим перечисленные URL-адреса. mode: ‘history’
означает, что у нас не будет знака решетки между базовым URL и нашими маршрутами. Мы также устанавливаем макет на DefaultLayout
, который мы определили в DefaultLayout.js
. Если мы развернем наше приложение, нам нужно настроить наш веб-сервер так, чтобы все запросы перенаправлялись на index.html
, чтобы у нас не было ошибок при перезагрузке приложения.
Например, в Apache мы делаем:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</IfModule>
а в Nginx мы ставим:
location / {
try_files $uri $uri/ /index.html;
}
См. Документацию к вашему веб-серверу, чтобы узнать, как сделать то же самое на вашем веб-сервере.
Теперь пишем код для наших компонентов. В SearchResults.vue
мы помещаем:
Здесь мы получаем результаты поиска из магазина Vuex и отображаем их. Мы возвращаем this.$store.state.searchResults
в функции в computed
property нашего приложения, чтобы результаты поиска обновлялись автоматически при обновлении searchResults
состояния магазина.
q-card
- карточный виджет для отображения данных в поле. v-for
предназначен для зацикливания записей массива и отображения всего. q-list
- виджет списка для аккуратного отображения элементов списка на странице. {{s.pub_date | formatDate}}
- это то место, где применяется наш formatDate
фильтр.
Далее пишем наш миксин. Мы добавим код для наших HTTP-вызовов в наш миксин. В nytMixin.js
мы помещаем:
Мы возвращаем обещания для наших HTTP-запросов на получение статей в каждой функции. В функции searchArticles
мы массируем объект, который передаем в строку запроса, которую мы передаем в наш запрос. Убедитесь, что вы поместили свой ключ API в константу apiKey
и удалили все, что не определено, с помощью:
Object.keys(params).forEach(key => { if (!params[key]) { delete params[key]; } })
Далее в Home.vue
мы помещаем:
В этом компоненте страницы мы получаем статьи для выбранного раздела, по умолчанию это раздел home
. У нас также есть меню для выбора раздела, который мы хотим видеть, добавив:
<q-btn color="primary" label="Sections"> <q-menu> <q-list> <q-item clickable v-close-popup v-for="s in sections" :key="s" @click="selectSection(s)" > <q-item-section>{{s | capitalize}}</q-item-section> </q-item> </q-list> </q-menu> </q-btn>
Обратите внимание, что мы используем ключевые слова async
и await
в нашем коде обещаний вместо использования then
. Он намного короче, а функции между then
и await
и async
эквивалентны. Однако он не поддерживается в Internet Explorer. В блоке beforeMount
мы запускаем this.getNewsArticles
, чтобы получать статьи по мере загрузки страницы.
Затем в Search.vue
мы помещаем:
Здесь мы включаем форму для поиска статей. У нас также есть два средства выбора даты, чтобы пометить пользователей, как установить даты начала и окончания. Мы ограничиваем даты только сегодняшним днем и ранее, чтобы поисковый запрос имел смысл. Мы также вложили наш компонент SearchResults
в компонент страницы Search
, включив:
components: { SearchResults }
между тегом script
и <SearchResults />
в шаблоне.
Обратите внимание, что у нас есть свойство :rules
в поле ввода. Это позволяет нам выполнять проверку формы, добавляя для этого дополнительные пакеты. Это остановит вас от автоматической отправки, если критерии проверки формы не выполнены ни в одном поле. Вы можете добавить любую функцию, которая вам нравится, или вы можете использовать встроенные правила проверки на https://github.com/quasarframework/quasar/blob/dev/ui/src/utils/patterns.js
Наконец, мы добавляем нашу верхнюю панель и меню, помещая в App.vue
следующее:
Если вам нужна верхняя панель с левым навигационным ящиком, вы должны точно следовать структуре кода, приведенной выше.
Полученные результаты
После того, как весь код написан, мы имеем следующее:
Следуйте за мной в Twitter: https://twitter.com/AuMayeung
Подпишитесь на мою рассылку сейчас по адресу http://jauyeung.net/subscribe/