Vue.js - это простой в использовании фреймворк для веб-приложений, который мы можем использовать для разработки интерактивных интерфейсных приложений.
В этой статье мы рассмотрим, как создавать многократно используемые переходы и делать запросы в приложении Vue.
Инкапсулированный переходный компонент
Мы можем инкапсулировать переходы в отдельный компонент, чтобы мы могли повторно использовать его где угодно.
Например, мы можем создать компонент перехода, который имеет компонент transition
, а затем повторно использовать его следующим образом:
styles.css
:
.fade-enter-active, .fade-leave-active { transition: opacity 0.3s; } .fade-enter, .fade-leave-to { opacity: 0; }
index.js
:
Vue.component("foo-transition", { template: ` <transition name="fade"> <slot></slot> </transition> ` }); new Vue({ el: "#app", data: { show: true } });
index.html
:
<!DOCTYPE html> <html lang="en"> <head> <title>App</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <link type="text/css" rel="stylesheet" href='styles.css'></link> </head> <body> <div id="app"> <button v-on:click="show = !show"> Toggle transition </button> <foo-transition> <p v-if='show'>foo</p> </foo-transition> <foo-transition> <p v-if='show'>bar</p> </foo-transition> </div> <script src="index.js"></script> </body> </html>
В приведенном выше коде у нас есть многоразовый компонент foo-transition
, который имеет компонент transition
с slot
внутри, поэтому мы можем включать и выключать то, что мы хотим в компоненте foo-transition
, с примененными к нему эффектами transition
.
Затем в index.html
мы повторно использовали foo-transition
, написав:
<foo-transition> <p v-if='show'>foo</p> </foo-transition> <foo-transition> <p v-if='show'>bar</p> </foo-transition>
Затем, когда мы будем переключать show
между true
и false
, мы увидим, что к обоим элементам p применен эффект плавного перехода.
Кроме того, мы также можем использовать v-bind='$attrs'
для привязки атрибутов от родительского к дочернему и v-on='$listeners'
для передачи прослушивателей событий от родительского к дочернему.
Например, мы можем изменить приведенный выше пример следующим образом:
styles.css
:
.fade-enter-active, .fade-leave-active { transition: opacity 0.3s; } .fade-enter, .fade-leave-to { opacity: 0; } .foo { color: green; }
index.js
:
Vue.component("foo-transition", { template: ` <transition name="fade" v-bind="$attrs" v-on="$listeners"> <slot></slot> </transition> ` }); new Vue({ el: "#app", data: { show: true } });
index.html
:
<!DOCTYPE html> <html lang="en"> <head> <title>App</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <link type="text/css" rel="stylesheet" href='styles.css'></link> </head> <body> <div id="app"> <button @click="show = !show"> Toggle transition </button> <foo-transition class="foo"> <p v-if='show'>foo</p> </foo-transition> </div> <script src="index.js"></script> </body> </html>
В приведенном выше коде у нас v-bind=”$attrs”
в transitions
. Таким образом, к нему будет применен класс foo
, если мы установим для него значение foo
в foo-transition
.
Используйте Axios для получения данных
Vue не имеет собственного HTTP-клиента, поэтому для выполнения HTTP-запросов мы должны добавить свой собственный. Axios - хороший выбор, поскольку он доступен через CDN и в виде пакета Node.
Кроме того, он основан на обещаниях, поэтому нам не придется иметь дело с вложенными обратными вызовами.
Например, мы можем использовать его следующим образом:
index.js
:
new Vue({ el: "#app", data: { info: {} }, async mounted() { const { data } = await axios.get( "https://api.coindesk.com/v1/bpi/currentprice.json" ); this.info = data; } });
index.html
:
<!DOCTYPE html> <html lang="en"> <head> <title>App</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> </head> <body> <div id="app"> <p v-if="info.bpi"> {{info.bpi['USD'].code}} - {{info.bpi['USD'].rate}} </p> </div> <script src="index.js"></script> </body> </html>
В приведенном выше коде мы использовали библиотеку Axios, включив ее из CDN. Затем мы получаем данные в ловушке mounted
. Поскольку axios.get
возвращает обещание, мы можем использовать синтаксис async
и await
для выполнения запроса.
Альтернативой может служить Fetch API, который похож на Axios, но нам не нужно добавлять библиотеку для его использования.
Использование vue-router для обработки маршрутизации на стороне клиента
Vue Router - один из наиболее часто используемых маршрутизаторов для приложений Vue. Он позволяет нам сопоставлять URL-адреса с компонентами, а также получать параметры маршрута и запроса и передавать их нашим компонентам.
Он также поддерживает вложенные маршруты и переходы.
Простой пример:
index.js
:
const Foo = { template: "<div>foo</div>" }; const Bar = { template: "<div>bar</div>" }; const routes = [ { path: "/foo", component: Foo }, { path: "/bar", component: Bar } ]; const router = new VueRouter({ routes }); new Vue({ el: "#app", router });
index.html
:
<!DOCTYPE html> <html lang="en"> <head> <title>App</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script> </head> <body> <div id="app"> <router-link to="/foo">Foo</router-link> <router-link to="/bar">Bar</router-link> <router-view></router-view> </div> <script src="index.js"></script> </body> </html>
В приведенном выше коде мы добавили Vue Router, а затем добавили router-view
для отображения содержимого маршрута, то есть компонентов, которые мы сопоставили.
Затем у нас есть router-link
, на который мы можем нажимать, чтобы перемещаться между маршрутами.
Заключение
Мы можем создавать повторно используемые компоненты перехода, добавляя слоты внутри transition
компонентов. Для выполнения HTTP-запросов мы можем использовать HTTP-клиент Axios, чтобы упростить отправку запросов. Наконец, мы можем использовать Vue Router для сопоставления URL-адресов нашим компонентам.