嵌套路由

一些应用程序的 UI 由多层嵌套的组件组成。

在这种情况下,URL 的片段通常对应于特定的嵌套组件结构,例如:

  [plaintext]
1
2
3
4
5
6
7
8
/user/johnny/profile /user/johnny/posts +------------------+ +-----------------+ | User | | User | | +--------------+ | | +-------------+ | | | Profile | | +------------> | | Posts | | | | | | | | | | | +--------------+ | | +-------------+ | +------------------+ +-----------------+

通过 Vue Router,你可以使用嵌套路由配置来表达这种关系。

接着上节创建的 app :

  [xml]
1
2
3
<div id="app"> <router-view></router-view> </div>
  [js]
1
2
3
4
5
6
const User = { template: '<div>User </div>', } // 这些都会传递给 `createRouter` const routes = [{ path: '/user/:id', component: User }]

这里的 <router-view> 是一个顶层的 router-view。它渲染顶层路由匹配的组件。

同样地,一个被渲染的组件也可以包含自己嵌套的 <router-view>

例如,如果我们在 User 组件的模板内添加一个 <router-view>

  [js]
1
2
3
4
5
6
7
8
const User = { template: ` <div class="user"> <h2>User </h2> <router-view></router-view> </div> `, }

要将组件渲染到这个嵌套的 router-view 中,我们需要在路由中配置 children:

  [js]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const routes = [ { path: '/user/:id', component: User, children: [ { // 当 /user/:id/profile 匹配成功 // UserProfile 将被渲染到 User 的 <router-view> 内部 path: 'profile', component: UserProfile, }, { // 当 /user/:id/posts 匹配成功 // UserPosts 将被渲染到 User 的 <router-view> 内部 path: 'posts', component: UserPosts, }, ], }, ]

注意,以 / 开头的嵌套路径将被视为根路径。

这允许你利用组件嵌套,而不必使用嵌套的 URL。

如你所见,children 配置只是另一个路由数组,就像 routes 本身一样。因此,你可以根据自己的需要,不断地嵌套视图。

此时,按照上面的配置,当你访问 /user/eduardo 时,在 User 的 router-view 里面什么都不会呈现,因为没有匹配到嵌套路由。

也许你确实想在那里渲染一些东西。

在这种情况下,你可以提供一个空的嵌套路径:

  [js]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const routes = [ { path: '/user/:id', component: User, children: [ // UserHome will be rendered inside User's <router-view> // when /user/:id is matched // 当 /user/:id 匹配成功 // UserHome 将被渲染到 User 的 <router-view> 内部 { path: '', component: UserHome }, // ...其他子路由 ], }, ]

这个例子的 demo 可以在这里找到

参考资料

https://next.router.vuejs.org/zh/guide/essentials/nested-routes.html