vue-router菜鸟进阶!(嵌套路由VS命名路由)

本文详细介绍了Vue Router的嵌套路由和命名路由概念。嵌套路由允许组件内部拥有自己的<router-view>进行层级展示,通过children配置实现。注意全路径开始的嵌套路由表示根路径。命名路由则提供了通过名称标识路由的便利,方便在链接和路由跳转时使用,可通过to属性的对象形式在router-link和router.push()中引用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

嵌套路由

一个被渲染组件可以包含自己的嵌套< router-view >。

在嵌套的出口中渲染组件,需要在VueRouter的参数中使用children配置:

<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>

<div id="app">
  <p>
    <router-link to="/user/foo">/user/foo</router-link>
    <router-link to="/user/foo/profile">/user/foo/profile</router-link>
    <router-link to="/user/foo/posts">/user/foo/posts</router-link>
  </p>
  <router-view></router-view>
</div>
const User = {
  template: `
    <div class="user">
      <h2>User {{ $route.params.id }}</h2>
      <router-view></router-view>
    </div>
  `
}

const UserHome = { template: '<div>Home</div>' }
const UserProfile = { template: '<div>Profile</div>' }
const UserPosts = { template: '<div>Posts</div>' }

const router = new VueRouter({
  routes: [
    { path: '/user/:id', component: User,
      children: [
        // UserHome will be rendered inside User's <router-view>
        // when /user/:id is matched
        { path: '', component: UserHome },

        // UserProfile will be rendered inside User's <router-view>
        // when /user/:id/profile is matched
        { path: 'profile', component: UserProfile },

        // UserPosts will be rendered inside User's <router-view>
        // when /user/:id/posts is matched
        { path: 'posts', component: UserPosts }
      ]
    }
  ]
})

const app = new Vue({ router }).$mount('#app')

要注意,以 / 开头的嵌套路径会被当作根路径。 这让你充分的使用嵌套组件而无须设置嵌套的路径。


命名路由

有时候,通过一个名称来标识一个路由显得更方便一些,特别是在链接一个路由,或者是执行一些跳转的时候。可以在创建Router实例的时候,在routes配置中给某个路由设置名称。

const router = new VueRouter({
    routes: [
        {
            path: '/user/:user:id',
            name: 'user',
            component: User
        }
    ]
})

要链接到一个命名路由,可以给router-link的to属性传一个对象:

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

跟代码调用 router.push()是一回事:

router.push({ name: 'user', params: { userId: 123 }})

这两种方式都会把路由导航到/user/123路径。

For example:

import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

const Home = { template: '<div>This is Home</div>' }
const Foo = { template: '<div>This is Foo</div>' }
const Bar = { template: '<div>This is Bar {{ $route.params.id }}</div>' }

const router = new VueRouter({
    mode: 'history',
    base: __dirname,
    routes: [
        { path: '/',  name: 'home', component: Home },
        { path: '/foo', name: 'foo', component: Foo },
        { path: '/bar', name: 'bar', component: Bar }
        ]
    })

new Vue({
    router,
    template: `
        <div id="app">
            <h1>Named Routes</h1>
            <p>Current route name: {{ route.name }}</p>
            <ul>
                <li><router-link :to="{ name: 'home' }">Home</router-link></li>
                <li><router-link :to="{ name: 'foo' }">foo</router-link></li>
                <li><router-link :to="{ name: 'bar', params: { id: 123 }}">bar</router-link></li>
            </ul>
            <router-view class="view"></router-view>
        </div>
    `
}).$.mount('#app')
Vue.js 项目中引入和配置路由,通常使用的是 Vue Router,它是 Vue 官方的路由管理器,能够实现单页应用(SPA)中的页面切换和导航功能。 ### 安装 Vue Router 首先,需要在项目中安装 Vue Router。可以通过 npm 或 yarn 进行安装: ```bash npm install vue-router # 或者 yarn add vue-router ``` ### 创建路由配置文件 接下来,建议在项目中创建一个专门用于管理路由的模块,通常命名为 `router/index.js`。在这个文件中,可以定义各个页面的路由规则。 ```javascript import Vue from 'vue'; import Router from 'vue-router'; import HelloWorld from '@/components/HelloWorld'; import Login from '@/pages/login'; Vue.use(Router); export default new Router({ routes: [ { path: '/', name: 'HelloWorld', component: HelloWorld }, { path: '/login', name: 'Login', component: Login } ] }); ``` ### 在 Vue 应用中引入路由 在项目的入口文件 `main.js` 中引入并使用上面定义的路由器: ```javascript import Vue from 'vue'; import App from './App.vue'; import router from './router'; new Vue({ el: '#app', router, render: h => h(App) }); ``` ### 在组件中使用 `<router-view>` 和 `<router-link>` 在主组件 `App.vue` 中,放置 `<router-view>` 标签,用于渲染匹配到的路由组件: ```vue <template> <div id="app"> <nav> <router-link to="/">首页</router-link> <router-link to="/login">登录</router-link> </nav> <router-view></router-view> </div> </template> ``` 通过 `<router-link>` 标签,可以实现页面间的导航,而 `<router-view>` 会根据当前的路由路径动态渲染对应的组件[^1]。 ### 路由模式 Vue Router 支持两种路由模式:Hash 模式和 History 模式。 - **Hash 模式**:URL 中会带有 `#` 符号,例如 `http://example.com/#/login`。这种模式兼容性较好,适用于大多数服务器环境。 - **History 模式**:URL 更加美观,例如 `http://example.com/login`。但需要服务器配置支持,否则刷新页面可能会出现 404 错误。 可以通过在创建路由器时配置 `mode` 属性来选择路由模式: ```javascript export default new Router({ mode: 'history', routes }); ``` ### 动态路由匹配 如果需要实现动态路由,例如 `/user/:id` 这样的路径,可以在路由配置中使用参数: ```javascript { path: '/user/:id', name: 'User', component: UserComponent } ``` 在组件中可以通过 `this.$route.params.id` 获取动态参数。 ### 嵌套路由 对于复杂的应用结构,可以使用嵌套路由来组织页面层次。例如: ```javascript { path: '/user', component: UserLayout, children: [ { path: 'profile', component: UserProfile }, { path: 'settings', component: UserSettings } ] } ``` 这样,`/user/profile` 和 `/user/settings` 将分别渲染 `UserProfile` 和 `UserSettings` 组件,同时它们的父组件 `UserLayout` 会保持不变。 ### 懒加载组件 为了提升应用的性能,可以使用懒加载的方式加载组件,只在需要时才加载对应的模块: ```javascript { path: '/about', name: 'About', component: () => import('@/views/About.vue') } ``` 这种方式可以减少初始加载时间,提高用户体验。 ### 路由守卫 Vue Router 提供了导航守卫功能,可以用于控制路由的跳转逻辑。例如,可以在路由配置中添加 `beforeEnter` 钩子: ```javascript { path: '/dashboard', name: 'Dashboard', component: Dashboard, beforeEnter: (to, from, next) => { if (store.getters.isAuthenticated) { next(); } else { next('/login'); } } } ``` 此外,还可以在全局范围内使用 `beforeEach` 来统一处理导航逻辑: ```javascript router.beforeEach((to, from, next) => { // 全局导航逻辑 next(); }); ``` ### 总结 通过以上步骤,可以在 Vue.js 项目中成功引入和配置 Vue Router,从而实现页面导航、动态路由嵌套路由等功能。合理的路由配置不仅有助于提升用户体验,还能使项目结构更加清晰、易于维护[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值