После создания приложения в Vue вам часто захочется, чтобы оно состояло из нескольких представлений или страниц. Для этого нам нужно использовать дополнительный пакет, известный как vue-router
. Создать простое приложение Vue несложно, поэтому в этом руководстве мы рассмотрим, как добавить vue-router
в свое новое приложение. Прежде всего, чтобы создать свое приложение, вам нужно выполнить только следующие команды:
npm i -g @vue/cli
vue create my-app
Затем добавление маршрутизатора в ваше приложение, чтобы вы могли перемещаться между страницами, также не составляет труда. Просто запустите следующую команду:
vue add router
Вас могут спросить, хотите ли вы использовать режим истории. Вы можете ввести Y
, если у вас нет предпочтений. После этого вы получите еще несколько папок и файлов в своем проекте. Ваша общая структура должна выглядеть примерно так:
- public
--- favicon.ico
--- index.html
- src
--- assets
--- components
--- router
------ index.js
--- views
------ About.vue
------ Home.vue
--- App.vue
--- main.js
- package.json
- package-lock.json
Как видите, теперь у вас есть несколько новых файлов для маршрутизатора и несколько изменений в существующих файлах. Например, в main.js
ваше приложение будет использовать только что созданную папку маршрутизатора. Файл index.js
будет импортирован, как показано ниже:
import { createApp } from 'vue' import App from './App.vue' import router from './router'
createApp(App).use(router).mount('#app')
Изменение вашего маршрутизатора Vue
В файле /router/index.js
вы найдете конфигурацию своего маршрутизатора! Здесь вы можете настроить страницы. По умолчанию ваш router
выглядит примерно так:
import { createRouter, createWebHistory } from 'vue-router' import Home from '../views/Home.vue'
const routes = [ { path: '/', name: 'Home', component: Home }, { path: '/about', name: 'About', // route level code-splitting // this generates a separate chunk (about.[hash].js) for this route // which is lazy-loaded when the route is visited. component: () => import(/* webpackChunkName: "about" */ '../views/About.vue') } ]
const router = createRouter({ history: createWebHistory(process.env.BASE_URL), routes })
export default router
Таким образом, есть два способа добавить маршруты, как показано выше. Вы можете импортировать с помощью функции import()
или import
с помощью типичного оператора JavaScript import
. Каждый route
состоит из 3 разных частей:
path
, который является URL-адресом, по которому пользователь сможет перейти.name
страницы, который является идентификатором страницы.component
для страницы. Это компонент, который появится, когда пользователь перейдет к страницеpath
.
{
path: '/',
name: 'Home',
component: Home
}
Чтобы добавить больше, вам просто нужно добавить больше к объекту — поэтому ниже я добавил новую страницу с именем /contact-us
, используя компонент, найденный в '../views/ContactUs.vue'
:
import { createRouter, createWebHistory } from 'vue-router' import Home from '../views/Home.vue'
const routes = [ { path: '/', name: 'Home', component: Home }, { path: '/contact-us', name: 'ContactUs', component: () => import('../views/ContactUs.vue') }, { path: '/about', name: 'About', // route level code-splitting // this generates a separate chunk (about.[hash].js) for this route // which is lazy-loaded when the route is visited. component: () => import(/* webpackChunkName: "about" */ '../views/About.vue') } ]
const router = createRouter({ history: createWebHistory(process.env.BASE_URL), routes })
export default router
Динамическая маршрутизация с помощью Vue Router
Итак, все хорошо, но что, если ваша конечная точка URL не является статической? Например, /user/:id
, где :id
может быть вообще чем угодно. К счастью, это также возможно, просто написав URL-адрес в этом формате — вам просто нужно написать /user/:id
в свойстве path
:
{
path: '/user/:name',
name: 'User',
component: () => import('../views/User.vue')
}
Формат сопоставления для vue-router
знаком, если вы использовали express
- и фактически любое сопоставление маршрута, которое вы можете выполнить в express
, вы можете сделать и в vue-router
.
Перенаправление с помощью Vue Router
Наконец, мы также можем установить маршрут для перенаправления на другой. Вы можете сделать это, используя свойство redirect
. Например, ниже будет перенаправлено /home
на /homepage
:
{
path: '/home',
name: 'home',
redirect: '/homepage'
}
Это также может быть определено как именованный маршрут. Ниже мы перенаправим /home
на любой маршрут с именем about
:
{
path: '/home',
name: 'home',
redirect: { name: 'about' }
}
И, наконец, вы также можете определить это как функцию.. это означает, что вы можете создать более сложную логику для обработки перенаправления:
{
path: '/user/:id',
name: 'home',
redirect: (to) => {
// to will contain information about the route
// to.params.id will be whichever `id` is in the URL in /user/:id
}
}
Навигация между страницами с помощью Vue Router
Теперь, когда мы определили наш маршрутизатор, мы хотим использовать его в нашем приложении. Вы можете заметить, что ваш файл App.vue
немного изменился и содержит что-то вроде этого:
<template>
<div id="nav">
<router-link to="/">Home</router-link> |
<router-link to="/about">About</router-link>
</div>
<router-view/>
</template>
Тег <router-link>
можно использовать для удобной навигации между маршрутами, определенными в файле маршрутизатора index.js
. Тег <router-view>
в конечном итоге будет содержать ваши маршруты, как только на них нажмут. Каждый маршрут также будет содержать свой собственный <router-view>
, что означает, что вы можете иметь вложенные маршруты. Все это можно определить в /routes/index.js
. Например, вот вложенный маршрут, содержащий двух потенциальных потомков, dashboard
и posts
:
const routes = [
{
path: '/user/:name',
name: 'User',
component: import('../views/User.vue'),
children: [{
path: 'dashboard',
component: import('../views/Dashboard.vue'),
},
{
path: 'posts',
component: import('../views/Posts.vue'),
}]
}
]
Теперь, когда мы определили дочерние компоненты, мы по-прежнему можем использовать путь /user/:name
, но теперь у нас есть два дополнительных компонента, которые будут отображаться в User.vue
, доступные через /user/:name/dashboard
и /user/:name/posts
соответственно. Таким образом, пока User
отображается в App.vue, <router-view>
, dashboard
и posts
будут отображаться в User.vue
версии <router-view>
. Это выглядит примерно так:
┌ - - - - - - - - - - - - - - - - - - ┐
| App.vue |
| ┌ - - - - - - - - - - - - - - - - ┐ |
| | User.vue | |
| | ┌ - - - - - - - ┐ ┌ - - - - - ┐ | |
| | | Dashboard.vue | | Posts.vue | | |
| | └ - - - - - - - ┘ └ - - - - - ┘ | |
| └ - - - - - - - - - - - - - - - - ┘ |
└ - - - - - - - - - - - - - - - - - - ┘
В конечном итоге это означает, что компонент User.vue
всегда будет виден при переходе к /user/:name
, но компоненты Dashboard.vue
и Posts.vue
станут видимыми только при переходе к этим маршрутам!
Программная маршрутизация с помощью Vue Router
Точно так же, как мы использовали <router-link>
, мы также можем программно перейти к маршруту, используя router.push
. <router-link to="/about">
можно аналогичным образом записать в JavaScript так:
router.push('/about')
Если мы хотим быть немного более продвинутыми, мы можем передать объект. Например, приведенный ниже код будет программно переходить к маршруту с name
, определенным как About
, и добавит в конец строку запроса ?id=15
. Если маршрут About
имеет path
из /about
, тогда URL-адрес, на который будет перенаправлено, будет /about/?id=15
:
router.push({ name: 'About', query: { id : 15 }})
Точно так же тот же JavaScript можно представить в HTML следующим образом:
<router-link to="{ name: 'About', query: { id : 15 }}">About</router-link>
Предотвращение кнопки «Назад» с помощью Vue Router
Хотя это добавит новую запись в историю навигации пользователя, мы также можем заменить текущую страницу для пользователя, что означает отсутствие истории или кнопки возврата на предыдущую страницу. будет доступно. Как правило, это не рекомендуется, но в некоторых ситуациях будет иметь ограниченное применение. Чтобы сделать это программно, мы можем использовать router.replace
:
router.replace({ name: 'About', query: { id : 15 }})
Или в HTML добавьте атрибут replace
:
<router-link to="{ name: 'About', query: { id : 15 }}" replace>About</router-link>
Заключение
Надеюсь, вам понравилось это руководство по началу работы с vue router. Маршрутизаторы в Vue являются бесценной частью настройки нового приложения и дают нам большую гибкость для определения и создания страниц в Vue. Чтобы узнать больше о Vue, ознакомьтесь с другими моими руководствами.