命名视图

有时候想同时 (同级) 展示多个视图,而不是嵌套展示,例如创建一个布局,有 sidebar (侧导航) 和 main (主内容) 两个视图,这个时候命名视图就派上用场了。你可以在界面中拥有多个单独命名的视图,而不是只有一个单独的出口。如果 router-view 没有设置名字,那么默认为 default

  1. <router-view class="view left-sidebar" name="LeftSidebar"></router-view>
  2. <router-view class="view main-content"></router-view>
  3. <router-view class="view right-sidebar" name="RightSidebar"></router-view>

一个视图使用一个组件渲染,因此对于同个路由,多个视图就需要多个组件。确保正确使用 components 配置 (带上 s):

  1. const router = createRouter({
  2. history: createWebHashHistory(),
  3. routes: [
  4. {
  5. path: '/',
  6. components: {
  7. default: Home,
  8. // LeftSidebar: LeftSidebar 的缩写
  9. LeftSidebar,
  10. // 它们与 `<router-view>` 上的 `name` 属性匹配
  11. RightSidebar,
  12. },
  13. },
  14. ],
  15. })

以上案例相关的可运行代码请移步这里.

嵌套命名视图

我们也有可能使用命名视图创建嵌套视图的复杂布局。这时你也需要命名用到的嵌套 router-view 组件。我们以一个设置面板为例:

  1. /settings/emails /settings/profile
  2. +-----------------------------------+ +------------------------------+
  3. | UserSettings | | UserSettings |
  4. | +-----+-------------------------+ | | +-----+--------------------+ |
  5. | | Nav | UserEmailsSubscriptions | | +------------> | | Nav | UserProfile | |
  6. | | +-------------------------+ | | | +--------------------+ |
  7. | | | | | | | | UserProfilePreview | |
  8. | +-----+-------------------------+ | | +-----+--------------------+ |
  9. +-----------------------------------+ +------------------------------+
  • Nav 只是一个常规组件。
  • UserSettings 是一个视图组件。
  • UserEmailsSubscriptionsUserProfileUserProfilePreview 是嵌套的视图组件。

注意我们先忘记 HTML/CSS 具体的布局的样子,只专注在用到的组件上。

UserSettings 组件的 <template> 部分应该是类似下面的这段代码:

  1. <!-- UserSettings.vue -->
  2. <div>
  3. <h1>User Settings</h1>
  4. <NavBar />
  5. <router-view />
  6. <router-view name="helper" />
  7. </div>

那么你就可以通过这个路由配置来实现上面的布局:

  1. {
  2. path: '/settings',
  3. // 你也可以在顶级路由就配置命名视图
  4. component: UserSettings,
  5. children: [{
  6. path: 'emails',
  7. component: UserEmailsSubscriptions
  8. }, {
  9. path: 'profile',
  10. components: {
  11. default: UserProfile,
  12. helper: UserProfilePreview
  13. }
  14. }]
  15. }

以上案例相关的可运行代码请移步这里.