Skip to content

Named Routes

Simplify navigation and make your routes more maintainable by giving them meaningful names.

Introduction

Instead of using paths for navigation, you can give routes names and reference them by name. This provides several advantages including cleaner code, automatic parameter encoding, and better maintainability.

Basic Named Routes

Define routes with names using the name property:

javascript
const routes = [
  {
    path: '/user/:username',
    name: 'user-profile',
    component: UserProfile
  },
  {
    path: '/user/:username/posts',
    name: 'user-posts', 
    component: UserPosts
  },
  {
    path: '/settings',
    name: 'settings',
    component: Settings
  }
]

Using Named Routes

vue
<template>
  <!-- Using route name instead of path -->
  <router-link :to="{ name: 'user-profile', params: { username: 'john' } }">
    View Profile
  </router-link>
  
  <!-- With query parameters -->
  <router-link :to="{ 
    name: 'user-posts', 
    params: { username: 'john' },
    query: { page: 1 }
  }">
    View Posts
  </router-link>
  
  <!-- Simple route without parameters -->
  <router-link :to="{ name: 'settings' }">
    Settings
  </router-link>
</template>

Programmatic Navigation

javascript
// Navigate using route name
router.push({ name: 'user-profile', params: { username: 'john' } })

// With query parameters
router.push({ 
  name: 'user-posts', 
  params: { username: 'john' },
  query: { page: 1, sort: 'date' }
})

// Simple navigation
router.push({ name: 'settings' })

Advantages of Named Routes

1. No Hardcoded URLs

javascript
// ❌ Hardcoded path - fragile
router.push('/user/john/posts?page=1')

// ✅ Named route - maintainable
router.push({ 
  name: 'user-posts', 
  params: { username: 'john' },
  query: { page: 1 }
})

2. Automatic Parameter Encoding

javascript
const username = 'john doe' // Contains space
const postTitle = 'Hello & Welcome!' // Contains special characters

// ✅ Automatic encoding with named routes
router.push({ 
  name: 'post-detail',
  params: { username, title: postTitle }
})
// Results in: /user/john%20doe/posts/Hello%20%26%20Welcome!

// ❌ Manual encoding required with paths
router.push(`/user/${encodeURIComponent(username)}/posts/${encodeURIComponent(postTitle)}`)

3. Avoid URL Typos

javascript
// ❌ Easy to make typos
router.push('/user/john/setings') // Typo: "setings"

// ✅ IDE can catch typos in route names
router.push({ name: 'user-settings' }) // IDE autocomplete helps

4. Path Independence

If you change the path structure, you only need to update the route definition:

javascript
const routes = [
  {
    // Change path without breaking navigation code
    path: '/profile/:username', // Changed from '/user/:username'
    name: 'user-profile',
    component: UserProfile
  }
]

// Navigation code remains unchanged
router.push({ name: 'user-profile', params: { username: 'john' } })

Advanced Usage

Nested Named Routes

javascript
const routes = [
  {
    path: '/user/:username',
    name: 'user',
    component: User,
    children: [
      {
        path: '',
        name: 'user-home',
        component: UserHome
      },
      {
        path: 'profile',
        name: 'user-profile',
        component: UserProfile
      },
      {
        path: 'posts/:postId',
        name: 'user-post',
        component: UserPost
      }
    ]
  }
]

Navigation to nested routes:

javascript
// Navigate to user home
router.push({ name: 'user-home', params: { username: 'john' } })

// Navigate to user profile  
router.push({ name: 'user-profile', params: { username: 'john' } })

// Navigate to specific post
router.push({ 
  name: 'user-post', 
  params: { username: 'john', postId: '123' }
})

Dynamic Route Names

Generate route names dynamically for similar patterns:

javascript
const createUserRoutes = (userType) => [
  {
    path: `/${userType}/:id`,
    name: `${userType}-detail`,
    component: UserDetail,
    props: { userType }
  },
  {
    path: `/${userType}/:id/edit`,
    name: `${userType}-edit`, 
    component: UserEdit,
    props: { userType }
  }
]

const routes = [
  ...createUserRoutes('admin'),
  ...createUserRoutes('customer'),
  ...createUserRoutes('vendor')
]

// Navigate to different user types
router.push({ name: 'admin-detail', params: { id: '123' } })
router.push({ name: 'customer-edit', params: { id: '456' } })

Best Practices

1. Use Descriptive Names

javascript
// ✅ Good: Descriptive and clear
const routes = [
  { path: '/products', name: 'product-list', component: ProductList },
  { path: '/products/:id', name: 'product-detail', component: ProductDetail },
  { path: '/products/:id/edit', name: 'product-edit', component: ProductEdit },
  { path: '/cart', name: 'shopping-cart', component: ShoppingCart },
  { path: '/checkout', name: 'checkout-process', component: Checkout }
]

// ❌ Avoid: Vague or abbreviated names
const routes = [
  { path: '/products', name: 'list', component: ProductList },
  { path: '/products/:id', name: 'detail', component: ProductDetail },
  { path: '/products/:id/edit', name: 'edit', component: ProductEdit },
  { path: '/cart', name: 'cart', component: ShoppingCart },
  { path: '/checkout', name: 'co', component: Checkout }
]

2. Consistent Naming Convention

javascript
// ✅ Consistent kebab-case convention
const routes = [
  { name: 'user-profile', /* ... */ },
  { name: 'user-settings', /* ... */ },
  { name: 'user-posts', /* ... */ },
  { name: 'admin-dashboard', /* ... */ },
  { name: 'admin-users', /* ... */ }
]

// ❌ Inconsistent naming
const routes = [
  { name: 'userProfile', /* ... */ },
  { name: 'user_settings', /* ... */ },
  { name: 'UserPosts', /* ... */ },
  { name: 'admin-dashboard', /* ... */ },
  { name: 'adminusers', /* ... */ }
]
javascript
// ✅ Grouped by feature/module
const routes = [
  // User routes
  { name: 'user-list', /* ... */ },
  { name: 'user-detail', /* ... */ },
  { name: 'user-edit', /* ... */ },
  
  // Product routes
  { name: 'product-list', /* ... */ },
  { name: 'product-detail', /* ... */ },
  { name: 'product-edit', /* ... */ },
  
  // Order routes
  { name: 'order-list', /* ... */ },
  { name: 'order-detail', /* ... */ },
  { name: 'order-tracking', /* ... */ }
]

4. Create Navigation Helpers

javascript
// utils/navigation.js
export const navigateToUser = (router, username, section = 'profile') => {
  const routeMap = {
    profile: 'user-profile',
    posts: 'user-posts',
    settings: 'user-settings'
  }
  
  router.push({
    name: routeMap[section],
    params: { username }
  })
}

// In component
import { navigateToUser } from '@/utils/navigation'

const handleUserClick = (username) => {
  navigateToUser(router, username, 'profile')
}

TypeScript Support

Define route names as constants for better type safety:

typescript
// types/routes.ts
export const ROUTE_NAMES = {
  USER_PROFILE: 'user-profile',
  USER_POSTS: 'user-posts',
  USER_SETTINGS: 'user-settings',
  PRODUCT_LIST: 'product-list',
  PRODUCT_DETAIL: 'product-detail'
} as const

export type RouteName = typeof ROUTE_NAMES[keyof typeof ROUTE_NAMES]

// routes.ts
import { ROUTE_NAMES } from './types/routes'

const routes = [
  {
    path: '/user/:username',
    name: ROUTE_NAMES.USER_PROFILE,
    component: UserProfile
  }
]

// In component
router.push({ 
  name: ROUTE_NAMES.USER_PROFILE, 
  params: { username: 'john' } 
})

Common Pitfalls

1. Duplicate Route Names

javascript
// ❌ Duplicate names - only the last one will be kept
const routes = [
  { path: '/admin/users', name: 'users', component: AdminUsers },
  { path: '/public/users', name: 'users', component: PublicUsers } // Overwrites the first
]

// ✅ Unique names
const routes = [
  { path: '/admin/users', name: 'admin-users', component: AdminUsers },
  { path: '/public/users', name: 'public-users', component: PublicUsers }
]

2. Missing Parameters

javascript
// ❌ Missing required parameter
router.push({ name: 'user-profile' }) // username parameter missing

// ✅ Provide all required parameters
router.push({ name: 'user-profile', params: { username: 'john' } })

3. Incorrect Parameter Types

javascript
// ❌ Wrong parameter type
router.push({ 
  name: 'user-profile', 
  params: { username: { id: 123 } } // Object instead of string
})

// ✅ Correct parameter type
router.push({ 
  name: 'user-profile', 
  params: { username: '123' } // String
})

Debugging Named Routes

1. Check Route Registration

javascript
// Check if route is registered
const route = router.resolve({ name: 'user-profile' })
console.log('Route exists:', route.name !== undefined)

2. List All Route Names

javascript
// Get all registered route names
const routeNames = router.getRoutes().map(route => route.name).filter(Boolean)
console.log('Registered routes:', routeNames)

3. Validate Navigation

javascript
const navigateWithValidation = (name, params = {}) => {
  try {
    const resolved = router.resolve({ name, params })
    if (resolved.name) {
      router.push({ name, params })
    } else {
      console.error(`Route "${name}" not found`)
    }
  } catch (error) {
    console.error('Navigation error:', error)
  }
}

Next Steps

🚀 Vue Router - 让前端路由变得简单而强大 | 构建现代化单页应用的最佳选择