技术文档中心
首页
React
Vue
TypeScript
Kotlin
React Native
Electron
Android
首页
React
Vue
TypeScript
Kotlin
React Native
Electron
Android
  • Vue2 基础

    • Vue 学习指南
    • Vue2 快速入门
    • Vue2 模板语法
    • Vue2 组件基础
    • Vue2 计算属性与侦听器
    • Vue2 生命周期
  • Vue2 进阶

    • Vue2 组件通信
    • Vue2 插槽详解
    • Vue2 混入与自定义指令
    • Vue2 过渡与动画
    • Vuex 状态管理
  • Vue2 高级

    • Vue2 性能优化
    • Vue2 服务端渲染(SSR)
    • Vue2 源码解析
  • Vue3 基础

    • Vue3 快速入门
    • Vue3 Composition API
    • Vue3 响应式系统
    • Vue3 组件基础
    • Vue3 生命周期
  • Vue3 进阶

    • Vue3 组合式函数
    • Vue3 组件通信
    • Vue3 Teleport 与 Suspense
    • Pinia 状态管理
    • Vue Router 4
  • Vue3 高级

    • Vue3 TypeScript
    • Vue3 性能优化
    • Vue3 测试
    • Vue3 SSR
    • Vue3 源码解析
  • 实战项目

    • Vue2 实战项目
    • Vue3 实战项目
    • Vue2 迁移 Vue3

Vue Router 4

安装

yarn add vue-router@4

基本配置

// router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import Home from '@/views/Home.vue'

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    component: () => import('@/views/About.vue')
  }
]

const router = createRouter({
  history: createWebHistory(),
  routes
})

export default router
// main.js
import { createApp } from 'vue'
import router from './router'
import App from './App.vue'

createApp(App)
  .use(router)
  .mount('#app')

路由配置

动态路由

{
  path: '/user/:id',
  component: User
}
<script setup>
import { useRoute } from 'vue-router'

const route = useRoute()
console.log(route.params.id)
</script>

嵌套路由

{
  path: '/user/:id',
  component: User,
  children: [
    {
      path: '',
      component: UserHome
    },
    {
      path: 'profile',
      component: UserProfile
    },
    {
      path: 'posts',
      component: UserPosts
    }
  ]
}

命名路由

{
  path: '/user/:id',
  name: 'user',
  component: User
}
<router-link :to="{ name: 'user', params: { id: 123 }}">
  User
</router-link>

命名视图

{
  path: '/',
  components: {
    default: Home,
    sidebar: Sidebar,
    footer: Footer
  }
}
<router-view></router-view>
<router-view name="sidebar"></router-view>
<router-view name="footer"></router-view>

编程式导航

<script setup>
import { useRouter } from 'vue-router'

const router = useRouter()

// 字符串路径
router.push('/users/eduardo')

// 带参数的对象
router.push({ path: '/users/eduardo' })

// 命名路由
router.push({ name: 'user', params: { id: 'eduardo' } })

// 带查询参数
router.push({ path: '/register', query: { plan: 'private' } })

// 带 hash
router.push({ path: '/about', hash: '#team' })

// 替换当前位置
router.replace({ path: '/home' })

// 前进/后退
router.go(1)
router.go(-1)
router.back()
router.forward()
</script>

路由守卫

全局前置守卫

router.beforeEach((to, from) => {
  if (to.meta.requiresAuth && !isAuthenticated) {
    return { name: 'Login' }
  }
})

全局后置钩子

router.afterEach((to, from) => {
  console.log('Navigation finished')
})

路由独享守卫

{
  path: '/users/:id',
  component: User,
  beforeEnter: (to, from) => {
    // 拒绝导航
    return false
  }
}

组件内守卫

<script setup>
import { onBeforeRouteLeave, onBeforeRouteUpdate } from 'vue-router'

onBeforeRouteLeave((to, from) => {
  const answer = window.confirm('确定要离开吗?')
  if (!answer) return false
})

onBeforeRouteUpdate(async (to, from) => {
  // 响应路由参数变化
})
</script>

路由元信息

{
  path: '/admin',
  component: Admin,
  meta: {
    requiresAuth: true,
    roles: ['admin']
  }
}
router.beforeEach((to, from) => {
  if (to.meta.requiresAuth) {
    // 检查认证
  }
})

滚动行为

const router = createRouter({
  history: createWebHistory(),
  routes,
  scrollBehavior(to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition
    } else {
      return { top: 0 }
    }
  }
})

路由懒加载

const routes = [
  {
    path: '/about',
    component: () => import('@/views/About.vue')
  }
]

Composition API

<script setup>
import { useRouter, useRoute } from 'vue-router'

const router = useRouter()
const route = useRoute()

// 访问路由信息
console.log(route.params)
console.log(route.query)
console.log(route.meta)

// 导航
const goToUser = (id) => {
  router.push({ name: 'user', params: { id } })
}
</script>
最近更新: 2026/1/27 15:51
Contributors: hailong
Prev
Pinia 状态管理