Определяемые во Vue.js маршруты могут содержать параметры. Для определения параметра в конец маршрута добавляется двоеточие, после которого идет название параметра:
{ path: '/products/:id', component: Products }
Например, в данном случае определен параметр id. И такому маршруту , к примеру, будут соответствовать такие пути запроса как:
/products/6-tom
/products/21
/products/phones
Та часть, которая идет после последнего слеша, будет интерпретироваться как значение параметра id.
В компоненте Vue.js мы можем получить параметры запроса через объект $route.params, который содержит значения всех параметров.
В частности, для обращения к параметру id нужно использовать выражение $route.params.id
.
К примеру, определим следующую страницу index.html:
<!DOCTYPE html> <html> <head> <title>Маршрутизация Vue.js</title> <meta charset="utf-8" /> <style> ul{list-style-type: none;padding: 0;} li{display: inline-block;} a{padding: 5px;} a.router-link-active, li.router-link-active>a { color: red; } </style> </head> <body> <div id="app"> <ul> <li><router-link to="/" exact>Home</router-link></li> <li><router-link to="/products/1">Product 1</router-link></li> <li><router-link to="/products/2">Product 2</router-link></li> </ul> <router-view></router-view> </div> <script src="https://unpkg.com/vue@2.7.14/dist/vue.js"></script> <script src="https://unpkg.com/vue@2.7.14/dist/vue.js-router/dist/vue-router.js"></script> <script> const NotFound = { template: '<h2>Page Not Found</h2>' } const Home = { template: '<h2>Home Page</h2>' } const Products = { template: '<h2>Product {{$route.params.id }}</h2>' } const routes = [ { path: '/', component: Home }, { path: '/products/:id', component: Products }, { path: '*', component: NotFound } ]; const router = new VueRouter({ mode: 'history', routes: routes }); new Vue({ el: '#app', router: router }) </script> </body> </html>
Здесь маршрут, использующий компонент Products, применяет один параметр id:
Подобным образом можно использовать большее количество параметров:
<!DOCTYPE html> <html> <head> <title>Маршрутизация Vue.js</title> <meta charset="utf-8" /> <style> ul{list-style-type: none;padding: 0;} li{display: inline-block;} a{padding: 5px;} a.router-link-active, li.router-link-active>a { color: red; } </style> </head> <body> <div id="app"> <ul> <li><router-link to="/" exact>Home</router-link></li> <li><router-link to="/products/tablets/2">Tablet 2</router-link></li> <li><router-link to="/products/phones/3">Phone 3</router-link></li> </ul> <router-view></router-view> </div> <script src="https://unpkg.com/vue@2.7.14/dist/vue.js"></script> <script src="https://unpkg.com/vue@2.7.14/dist/vue.js-router/dist/vue-router.js"></script> <script> const NotFound = { template: '<h2>Page Not Found</h2>' } const Home = { template: '<h2>Home Page</h2>' } const Products = { template: `<div><h2>Product</h2> <h3>Category: {{$route.params.category }}</h3> <h3>Id: {{$route.params.id }}</h3> </div>` } const routes = [ { path: '/', component: Home }, { path: '/products/:category/:id', component: Products }, { path: '*', component: NotFound } ]; // создаем объект маршрутизатора const router = new VueRouter({ mode: 'history', routes: routes }); new Vue({ el: '#app', router: router }) </script> </body> </html>
В данном случае маршрут { path: '/products/:category/:id', component: Products }
применяет два параметра category и id,
поэтому такому маршруту будут соответствовать следующие пути:
/products/tablets/2
/products/phones/3
Параметры могут быть необязательными. Для таких параметров необязательно передавать значения. Для их определения после названия параметра ставится вопросительный знак:
<div id="app"> <router-view></router-view> </div> <script src="https://unpkg.com/vue@2.7.14/dist/vue.js"></script> <script src="https://unpkg.com/vue@2.7.14/dist/vue.js-router/dist/vue-router.js"></script> <script> const Home = { template: '<h2>Главная</h2>' } const Products = { template: ` <div> <h2 v-if="$route.params.id">Товар {{$route.params.id}}</h2> <h2 v-else>Список товаров</h2> </div>` } const NotFound = { template: '<h2>Страница не найдена</h2>' } const routes = [ { path: '/', component: Home }, { path: '/products/:id?', component: Products }, { path: '*', component:NotFound } ]; const router = new VueRouter({ mode: 'history', routes: routes }); new Vue({ el: '#app', router: router }) </script>
В данном случае в маршруте { path: '/products/:id?', component: Products }
параметр id определен как необязательный,
поэтому компонент Products будет обрабатывать запросы как по пути "/products/3", так и по пути "/products".