Vue.js - это простой в использовании фреймворк для веб-приложений, который мы можем использовать для разработки интерактивных интерфейсных приложений.

Vue Router - это URL-маршрутизатор, который сопоставляет URL-адреса с компонентами.

В этой статье мы рассмотрим, как передавать свойства для маршрутизации компонентов с помощью Vue Router.

Прохождение реквизита

Использование $route в нашем компоненте создает тесную связь между объектом $route и компонентом. Следовательно, он ограничивает гибкость компонента, поскольку его можно использовать только с определенными URL-адресами.

Мы можем отделить компонент от маршрутизатора, используя параметр props.

Например, вместо того, чтобы писать:

const User = { template: "<div>User {{ $route.params.id }}</div>" };
const routes = [
  {
    path: "/user/:id",
    component: User
  }
];
const router = new VueRouter({
  routes
});
new Vue({
  el: "#app",
  router
});

Вместо этого мы пишем:

src/index.js :

const User = { template: "<div>User {{ id }}</div>" };
const routes = [
  {
    path: "/user/:id",
    component: User,
    props: true
  }
];
const router = new VueRouter({
  routes
});
new Vue({
  el: "#app",
  router
});

src/index.html :

<!DOCTYPE html>
<html>
  <head>
    <title>App</title>
    <meta charset="UTF-8" />
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
  </head>
  <body>
    <div id="app">
      <router-view></router-view>
    </div>
    <script src="src/index.js"></script>
  </body>
</html>

Если у нас несколько router-views, то мы должны определить props для каждого следующим образом:

src/index.js :

const Foo = { props: ["id"], template: "<div>foo {{id}}</div>" };
const Bar = { props: ["id"], template: "<div>bar {{id}}</div>" };
const routes = [
  {
    path: "/:id",
    components: { default: Foo, bar: Bar },
    props: { default: true, bar: true }
  }
];
const router = new VueRouter({
  routes
});
new Vue({
  el: "#app",
  router
});

index.html :

<!DOCTYPE html>
<html>
  <head>
    <title>App</title>
    <meta charset="UTF-8" />
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
  </head>
  <body>
    <div id="app">
      <router-view></router-view>
      <router-view name="bar"></router-view>
    </div>
    <script src="src/index.js"></script>
  </body>
</html>

Затем, когда мы переходим к /#/1, мы видим:

foo 1
bar 1

отображается.

Как мы видим, когда для props установлено значение true, тогда $route.params будет установлен в качестве свойств компонента.

Это упрощает тестирование, поскольку нам не нужно беспокоиться об объекте $route при тестировании.

Объектный режим

Мы можем установить свойство props для объекта. Это удобно для статических опор.

Например, мы можем сделать это следующим образом:

src/index.js :

const Foo = { props: ["id"], template: "<div>foo {{id}}</div>" };
const routes = [
  {
    path: "/foo",
    component: Foo,
    props: { id: 1 }
  }
];
const router = new VueRouter({
  routes
});
new Vue({
  el: "#app",
  router
});

index.html :

<!DOCTYPE html>
<html>
  <head>
    <title>App</title>
    <meta charset="UTF-8" />
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
  </head>
  <body>
    <div id="app">
      <router-view></router-view>
    </div>
    <script src="src/index.js"></script>
  </body>
</html>

Затем мы видим foo 1, когда переходим к /#/foo.

Функциональный режим

Мы можем передать функцию, которая возвращает реквизиты. Это позволяет нам делать с параметрами маршрута все, что мы хотим, прежде чем отправлять их компоненту в качестве свойств.

src/index.js :

const Foo = { props: ["idString"], template: "<div>foo {{idString}}</div>" };
const routes = [
  {
    path: "/foo/:id",
    component: Foo,
    props: route => ({ idString: `id ${route.params.id}` })
  }
];
const router = new VueRouter({
  routes
});
new Vue({
  el: "#app",
  router
});

index.html :

<!DOCTYPE html>
<html>
  <head>
    <title>App</title>
    <meta charset="UTF-8" />
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
  </head>
  <body>
    <div id="app">
      <router-view></router-view>
      <router-view name="bar"></router-view>
    </div>
    <script src="src/index.js"></script>
  </body>
</html>

В приведенном выше коде мы устанавливаем функцию как свойство props, где мы вернули объект, который устанавливает для свойства idString значение `id ${route.params.id}`.

Затем наш Foo компонент принимает свойство idString вместо того, чтобы получать id прямо из параметра маршрута. Таким образом, перед параметром маршрута id, который мы передали, поскольку это то, что мы вернули, мы видим «id».

Итак, когда мы переходим к /#/foo/1, мы получаем foo id 1.

Заключение

Мы можем передать параметр маршрута компонентам в качестве свойств вместо получения параметров маршрута из объекта $route.

Это упрощает тестирование, а также делает компонент более гибким, поскольку он отделяет компонент от Vue Router.

Мы можем установить для свойства props значение true, чтобы передать параметр маршрута в качестве опоры. Для статических свойств мы можем установить объект как значение props.

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