Vue Router(5)


命名路由

const routes = [
  {
    path: '/user/:username',
    name: 'user',
    component: User
  }
]
<router-link :to="{ name: 'user', params: { username: 'erina' }}">
  User
router-link>

  等价于

router.push({ name: 'user', params: { username: 'erina' } })

命名视图

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

<router-view class="view left-sidebar" name="LeftSidebar">router-view>
<router-view class="view main-content">router-view>
<router-view class="view right-sidebar" name="RightSidebar">router-view>

一个视图使用一个组件渲染,因此对于同个路由,多个视图就需要多个组件,

const router = createRouter({
  history: createWebHashHistory(),
  routes: [
    {
      path: '/',
      components: {
        default: Home,
        // LeftSidebar: LeftSidebar 的缩写
        LeftSidebar,
        // 它们与 `` 上的 `name` 属性匹配
        RightSidebar,
      },
    },
  ],
})

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

/settings/emails                                       /settings/profile
+-----------------------------------+                  +------------------------------+
| UserSettings                      |                  | UserSettings                 |
| +-----+-------------------------+ |                  | +-----+--------------------+ |
| | Nav | UserEmailsSubscriptions | |  +------------>  | | Nav | UserProfile        | |
| |     +-------------------------+ |                  | |     +--------------------+ |
| |     |                         | |                  | |     | UserProfilePreview | |
| +-----+-------------------------+ |                  | +-----+--------------------+ |
+-----------------------------------+                  +------------------------------+
 

  Nav 只是一个常规组件。
  UserSettings 是一个视图组件。
  UserEmailsSubscriptions、UserProfile、UserProfilePreview 是嵌套的视图组件。


<div>
  <h1>User Settingsh1>
  <NavBar />
  <router-view />
  <router-view name="helper" />
div>
{
  path: '/settings',
  // 你也可以在顶级路由就配置命名视图
  component: UserSettings,
  children: [{
    path: 'emails',
    component: UserEmailsSubscriptions
  }, {
    path: 'profile',
    components: {
      default: UserProfile,
      helper: UserProfilePreview
    }
  }]
}