Как использовать маршрутизацию Vue.js Router для разработки лучшего опыта пользователя

Как использовать маршрутизацию Vue.js Router для разработки лучшего опыта пользователя

От автора: Vue.js — отличная JavaScript платформа, созданная Эваном Ю. Она используется для разработки отдельных приложений для веб-страниц и гибких компонентов, это также один из самых необходимых навыков при разработке Front End.

Vue.js предоставляет множество функций, которые позволяют создавать повторно используемые веб-компоненты. Маршрутизация — одна из таких функций. Она позволяет пользователю переключаться между страницами без обновления страницы. Это то, что делает навигацию в веб-приложениях простой и очень приятной. Итак, в этой статье я объясню, как работают маршрутизаторы Vue.js, создав в качестве примера шаблона Vue.js Router.

Приступаем к работе

Итак, давайте начнем с создания проекта Vue.js Router, установив и создав новый проект Vue.js. Нам нужно установить Node.js. Для создания нового проекта Vue.js мы будем использовать vue-cli. Выполните следующие действия. Введите и запустите в терминале следующий код:

vue init webpack vue-router //
cd vue-router
//
npm run dev

Перейдите по адресу http://localhost:8080

Откройте приложение в текстовом редакторе. В папке компонентов откройте файл HellowWorld.vue и выполните следующие действия. Переименуйте HellowWorld.vue в home.vue. Удалите из файла весь код и замените его следующим:

<template> <div class="home"> <h1>Home</h1> </div>
</template>
<script>
export default { name: 'home', data () { return { msg: 'Welcome to Your Vue.js App' } }
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>

Перейдите к файлу index.js в папке router и замените HelloWorld на home:

import Vue from 'vue'
import Router from 'vue-router'
import home from '@/components/home'
Vue.use(Router)
export default new Router({ routes: [ { path: '/', name: 'home', component: home } ]
})

Файл App.vue должен выглядеть следующим образом:

<template> <div id="app"> <router-view/> </div>
</template>
<script>
export default { name: 'App'
}
</script>
<style>
#app { }
</style>

А теперь давайте напишем наш код!

Мы добавим шаблон Bootswatch. Вы можете выбрать любой шаблон по своему усмотрению. Я выбираю Cosmo. Нажмите Ctrl + U, чтобы просмотреть исходный кода и просто скопируйте Navbar (нам нужен только navbar). Вставьте этот код в компонент App.vue.

Вот что у нас получилось:

Затем мы собираемся создать три других компонента: Blog,Services и Contact. Внутри папки компонентов создайте новый файл, назовите его blog.vue и вставьте в него этот код:

<template> <div class="blog"> <h1>{{blog}}</h1> </div>
</template>
<script> export default{ name:'blog', data (){ return{ title:'Blog' } } }
</script>
<style scoped> </style>

Если вы хотите сделать то же самое для компонентов Services и Contact, вам нужно создать следующие файлы в папке компонентов:

home.vue

blog.vue

services.vue

contact.vue

Настройка маршрутизаторов

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

Итак, как мы можем переходить к каждому компоненту с помощью маршрутизаторов? Нам нужно изучить правила маршрутизации. Теперь нам нужно внести некоторые изменения в папки маршрутизаторов, поэтому откройте файл index.js

Выполните следующие действия. Сначала импортируйте компоненты в index.js. Импортируйте все компоненты с помощью метода import.

import home from '@/components/home'
import blog from '@/components/blog'
import services from '@/components/services'
import contact from '@/components/contact'

Далее импортируйте Vue и модуль маршрутизатора из модуля vue-router:

import Vue from 'vue'
import Router from 'vue-router'
// использование маршрутизатора
Vue.use(Router)

Если вы установили Vue с vue-cli, модуль vue-router будет импортирован у вас по умолчанию.

И, наконец, в папке маршрутизаторов мы должны настроить маршрутизаторы, чтобы они заработали. Метод маршрутизатора принимает массив объектов, который, в свою очередь, принимает свойства каждого компонента:

export default new Router({ routes: [ { path: '/', name: 'home', component: home }, { path: '/blog', name: 'blog', component: blog }, { path: '/services', name: 'services', component: services }, { path: '/contact', name: 'contact', component: contact } ]
})

path: путь компонента

name: имя компонента

component: представление компонента

Чтобы компонент являлся компонентом по умолчанию, добавьте слэш (‘/’) в свойство path:

path:'/'

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

{
path:'/',
name:'home',
component:home
}

У маршрутизатора vue есть более продвинутые параметры и методы, но на данном этапе мы этой темы касаться не будем. Это список свойств и методов, которые можно использовать с vue-router:

Теперь вы можете просматривать любые компоненты, введя имя компонента!

Далее мы настроим навигацию через Navbar, который мы создали с помощью элемента router-link. Для этого на нужно заменить элемент </a> на <router-link> </ router / link> следующим образом:

<li class="nav-item"> <router-link class="nav-link" to="/blog">Blog</router-link>
</li>
<li class="nav-item"> <router-link class="nav-link" to="/services">Services</router-link> </li>
<li class="nav-item"> <router-link class="nav-link" to="/contact">contact</router-link> </li>

router-link принимает атрибут to=’path’, который принимает в качестве значения путь к компоненту.

Router-view

Вы найдете тег <router-view> в файле App.vue. Это в основном представление, в котором отображаются компоненты. Оно похоже на главный div, содержащий все компоненты, и возвращает компонент, соответствующий текущему маршруту. Мы рассмотрим маршруты в следующей части, когда используем анимацию перехода.

Использование параметров внутри маршрутизаторов

На этом этапе мы будем использовать параметры для перехода к конкретным компонентам. Параметры делают маршрутизацию динамической.

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

В данном случае мы не будем использовать базу данных или API для извлечения информации о товарах. Поэтому нам нужно создать массив товаров, который будет выполнять роль базы данных. Внутри компонента home.vue поместите массив в метод data() следующим образом:

export default { name: 'home', data () { return { title: 'Home', products:[ { productTitle:"ABCN", image : require('../assets/images/product1.png'), productId:1 }, { productTitle:"KARMA", image : require('../assets/images/product2.png'), productId:2 }, { productTitle:"Tino", image : require('../assets/images/product3.png'), productId:3 }, { productTitle:"EFG", image : require('../assets/images/product4.png'), productId:4 }, { productTitle:"MLI", image : require('../assets/images/product5.png'), productId:5 }, { productTitle:"Banans", image : require('../assets/images/product6.png'), productId:6 } ] } }
}

Затем извлеките и переберите через цикл массив товаров, используя директиву v-for.

<div class="row"> <div class="col-md-4 col-lg4" v-for="(data,index) in products" :key="index"> <img :src="data.image" class="img-fluid"> <h3>{{data.productTitle}}</h3> </div> </div>

Результат:

Чтобы мы могли переходить к компоненту информации о товаре, сначала нужно добавить событие click:

<h3 @click="goTodetail()" >{{data.productTitle}}</h3>
Затем добавьте методы:
methods:{ goTodetail() { this.$router.push({name:'details'}) }

Если вы нажмете на заголовок, он вернет undefined, потому что мы еще не создали компонент информации о товаре. Итак, давайте создадим его:

details.vue

<template> <div class="details"> <div class="container"> <h1 class="text-primary text-center">{{title}}</h1> </div> </div>
</template>
<script> export default{ name:'details', data(){ return{ title:"details" } } }
</script>

Теперь при переходе мы не получаем больше ошибку:

Итак, как мы можем перейти на страницу информации о товаре и получить соответствующие данные, если у нас нет базы данных?

Мы можем использовать тот же массив товаров в компоненте информации о товаре. Таким образом, мы можем обрабатывать идентификатор, который связан с URL-адресом:

products:[ { productTitle:"ABCN", image : require('../assets/images/product1.png'), productId:1 }, { productTitle:"KARMA", image : require('../assets/images/product2.png'), productId:2 }, { productTitle:"Tino", image : require('../assets/images/product3.png'), productId:3 }, { productTitle:"EFG", image : require('../assets/images/product4.png'), productId:4 }, { productTitle:"MLI", image : require('../assets/images/product5.png'), productId:5 }, { productTitle:"Banans", image : require('../assets/images/product6.png'), productId:6 } ]

Сначала мы должны установить id в качестве параметра в метод goTodetail():

<h3 @click="goTodetail(data.productId)" >{{data.productTitle}}</h3>

Затем добавьте в метод маршрутизатора второй параметр. Метод $router принимает два параметра: первый — имя компонента, к которому мы хотим перейти, второй — параметр id (или любой другой параметр).

this.$router.push({name:'details',params:{Pid:proId}})

Добавьте Pid в качестве параметра в index.js внутри папки маршрутизатора:

{ path: '/details/:Pid', name: 'details', component: details }

home.vue

methods:{ goTodetail(prodId) { this.$router.push({name:'details',params:{Pid:proId}}) } }

Чтобы получить соответствующий параметр, используйте эту строку кода:

this.$route.params.Pid

details.vue

<h2>the product id is :{{this.$route.params.Pid}}</h2>

Затем переберите через цикл массив товаров в файле detalils.vue и проверьте объект, который соответствует параметру Pid и возвращает его данные:

<div class="col-md-12" v-for="(product,index) in products" :key="index"> <div v-if="proId == product.productId"> <h1>{{product.productTitle}}</h1> <img :src="product.image" class="img-fluid"> </div> </div>
///
export default{ name:'details', data(){ return{ proId:this.$route.params.Pid, title:"details" }
}

Теперь, когда мы нажимаем ссылку какого-либо товара, мы получаем этот товар!

Компонент detail.vue:

<template> <div class="details"> <div class="container"> <div class="row"> <div class="col-md-12" v-for="(product,index) in products" :key="index"> <div v-if="proId == product.productId"> <h1>{{product.productTitle}}</h1> <img :src="product.image" class="img-fluid"> </div> </div> </div> </div> </div>
</template>
<script> export default{ name:'details', data(){ return{ proId:this.$route.params.Pid, title:"details", products:[ { productTitle:"ABCN", image : require('../assets/images/product1.png'), productId:1 }, { productTitle:"KARMA", image : require('../assets/images/product2.png'), productId:2 }, { productTitle:"Tino", image : require('../assets/images/product3.png'), productId:3 }, { productTitle:"EFG", image : require('../assets/images/product4.png'), productId:4 }, { productTitle:"MLI", image : require('../assets/images/product5.png'), productId:5 }, { productTitle:"Banans", image : require('../assets/images/product6.png'), productId:6 } ] } } }
</script>

Переход

В этой части мы добавим анимацию переход к анимированному компоненту. Мы будем анимировать переход компонентов. Это делает навигацию красивой, и она создает лучший UX и UI. Чтобы задать анимацию перехода, поместите <router-view> внутри тега <transition/> и задайте для него имя класса.

App.vue

<transition name="moveInUp"> <router-view/> </transition>

Чтобы анимировать переход компонента при входе в представление, добавьте enter-active к имени, указанному для тега transition. Затем добавьте действие leave-active и задайте для него свойства перехода CSS:

.moveInUp-enter-active{ opacity: 0; transition: opacity 1s ease-in;
}

Использование анимации CSS3

Теперь мы зададим анимацию, используя @keyframes из CSS3. Когда компонент входит в представление, добавьте для представления эффект затухания.

.moveInUp-enter-active{ animation: fadeIn 1s ease-in;
}
@keyframes fadeIn{ 0%{ opacity: 0; } 50%{ opacity: 0.5; } 100%{ opacity: 1; }
}

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

.moveInUp-leave-active{ animation: moveInUp .3s ease-in;
}
@keyframes moveInUp{ 0%{ transform: translateY(0); } 100%{ transform: translateY(-400px); }
}

Теперь вы можете создать собственные эффекты анимации и переходы для своих компонентов. Вот и все! Мы закончили! Исходный код вы можете скачать здесь.

Заключение

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

Автор: Said Hayani

Источник: https://medium.freecodecamp.org/

Редакция: Команда webformyself.