Skip to content
Перевод синхронизирован с документацией от , хэш коммита 0d8d997.

Синтаксис сопоставления маршрутов

Большинство приложений будут использовать статические маршруты, такие как /about, и динамические маршруты, такие как /users/:userId, как мы только что видели в динамическом сопоставлении маршрутов, но у Vue Router есть намного больше возможностей!

Совет

Для простоты все записи маршрутов опускают свойство component, чтобы сосредоточиться на значении path.

Регулярные выражения в качестве параметров

При определении параметра, например, :userId, мы внутренне используем следующее регулярное выражение ([^/]+) (по крайней мере один символ, не являющийся слэшем /), чтобы извлекать параметры из URL-адресов. Это работает хорошо, если вам необходимо различать два маршрута на основе содержимого параметра. Представьте себе два маршрута /:orderId и /:productName, которые оба будут соответствовать точно таким же URL-адресам, поэтому нам нужен способ их различать. Самым простым способом будет добавить статическую секцию в путь, который различает их:

js
const routes = [
  // соответствует /o/3549
  { path: '/o/:orderId' },
  // соответствует /p/books
  { path: '/p/:productName' },
]

Но в некоторых сценариях мы не хотим добавлять эту статическую секцию /o или /p. Тем не менее, orderId всегда является числом, в то время как productName может быть чем угодно, поэтому мы можем указать регулярное выражение для параметра в круглых скобках:

js
const routes = [
  // /:orderId -> соответствует только числам
  { path: '/:orderId(\\d+)' },
  // /:productName -> соответствует всему остальному
  { path: '/:productName' },
]

Теперь при переходе на /25 маршрут будет соответствовать /:orderId, а при переходе к любому другому - /:productName. Порядок массива routes даже не имеет значения!

Совет

Убедитесь, что для передачи символа обратной косой черты в строке в JavaScript необходимо экранировать обратные косые черты (\), как мы это делали с \d(становится \\\d).

Повторяющиеся параметры

Если необходимо сопоставить маршруты с несколькими секциями, например /first/second/third, то следует пометить параметр как повторяющийся с помощью * (0 и более) и + (1 и более):

js
const routes = [
  // /:chapters -> соответствует /one, /one/two, /one/two/three и т.д.
  { path: '/:chapters+' },
  // /:chapters -> соответствует /, /one, /one/two, /one/two/three и т.д.
  { path: '/:chapters*' },
]

Это позволит получить массив параметров вместо строки, а также потребует передачи массива при использовании именованных маршрутов:

js
// задан маршрут { path: '/:chapters*', name: 'chapters' },
router.resolve({ name: 'chapters', params: { chapters: [] } }).href
// преобразуется в /
router.resolve({ name: 'chapters', params: { chapters: ['a', 'b'] } }).href
// преобразуется в  /a/b

// задан маршрут { path: '/:chapters+', name: 'chapters' },
router.resolve({ name: 'chapters', params: { chapters: [] } }).href
// выдаст ошибку, так как `chapters` пустое

Их также можно комбинировать с регулярным выражением, добавляя после закрывающих круглых скобок:

js
const routes = [
  // соответствует только числам
  // соответствует /1, /1/2 и т.д.
  { path: '/:chapters(\\d+)+' },
  // соответствует /, /1, /1/2 и т.д.
  { path: '/:chapters(\\d+)*' },
]

Параметры маршрута sensitive и strict

По умолчанию все маршруты нечувствительны к регистру и соответствуют маршрутам как без завершающего слэша, так и с ним. Например, маршрут /users соответствует /users, /users/ и даже /Users/. Это поведение можно настроить с помощью параметров strict и sensitive, их можно устанавливать как на уровне маршрутизатора, так и на уровне маршрута:

js
const router = createRouter({
  history: createWebHistory(),
  routes: [
    // будет соответствовать /users/posva но не будет для:
    // - /users/posva/ потому что strict: true
    // - /Users/posva потому что: true
    { path: '/users/:id', sensitive: true },
    // будет соответствовать /users, /Users и  /users/42, но не будет /users/ или /users/42/
    { path: '/users/:id?' },
  ],
  strict: true, // применяется ко всем маршрутам
})

Необязательные параметры

Можно также отметить параметр как необязательный с помощью модификатора ? (0 или 1):

js
const routes = [
  // будет соответствовать /users и /users/posva
  { path: '/users/:userId?' },
  // будет соответствовать /users и /users/42
  { path: '/users/:userId(\\d+)?' },
]

Обратите внимание, что * технически также помечает параметр как необязательный, но параметры ? не могут повторяться.

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

  • /users/:uid?-:name? не будет соответствовать /users, только /users/- или даже /users/-/
  • /users/:uid(\\d+)?:name? не будет соответствовать /users, только /users/, /users/2, /users/2/, и т.д.

Вы можете поэксперементировать с синтаксисом сопоставления в песочнице

Отладка

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

Released under the MIT License.

FREE WEEKEND
Get unlimited access to ALL Vue School premium courses
1-2 March 2025
Reserve Your Spot
1-2 March 2025