Vue Router 命名视图

  • 定义和用法

    有时候想同时 (同级) 展示多个视图,而不是嵌套展示,例如创建一个布局,有 sidebar (侧导航) 和 main (主内容) 两个视图,这个时候命名视图就派上用场了。你可以在界面中拥有多个单独命名的视图,而不是只有一个单独的出口。如果 router-view 没有设置名字,那么默认为 default
    <router-view class="view one"></router-view>
    <router-view class="view two" name="a"></router-view>
    <router-view class="view three" name="b"></router-view>
    
    一个视图使用一个组件渲染,因此对于同个路由,多个视图就需要多个组件。确保正确使用 components 配置 (带上 s):
    const router = new VueRouter({
         routes: [
              {
                   path: '/',
                   components: {
                        default: Foo,
                        a: Bar,
                        b: Baz
                   }
              }
         ]
    })
    
  • 嵌套命名视图

    我们也有可能使用命名视图创建嵌套视图的复杂布局。这时你也需要命名用到的嵌套 router-view 组件。我们以一个设置面板为例:
    /settings/emails                                       /settings/profile
    +-----------------------------------+                  +------------------------------+
    | UserSettings                      |                  | UserSettings                 |
    | +-----+-------------------------+ |                  | +-----+--------------------+ |
    | | Nav | UserEmailsSubscriptions | |  +------------>  | | Nav | UserProfile        | |
    | |     +-------------------------+ |                  | |     +--------------------+ |
    | |     |                         | |                  | |     | UserProfilePreview | |
    | +-----+-------------------------+ |                  | +-----+--------------------+ |
    +-----------------------------------+                  +------------------------------+
    

    解析说明

    • Nav 只是一个常规组件。
    • UserSettings 是一个视图组件。
    • UserEmailsSubscriptions、UserProfile、UserProfilePreview 是嵌套的视图组件。
    注意:我们先忘记 HTML/CSS 具体的布局的样子,只专注在用到的组件上。
    UserSettings 组件的 <template> 部分应该是类似下面的这段代码:
    <div>
       <h1>User Settings</h1>
       <NavBar/>
       <router-view/>
       <router-view name="helper"/>
    </div>
    
    嵌套的视图组件在此已经被忽略了,但是你可以在 这里 找到完整的源代码。
    然后你可以用这个路由配置完成该布局:
    {
       path: '/settings',
       // 你也可以在顶级路由就配置命名视图
       component: UserSettings,
       children: [{
            path: 'emails',
            component: UserEmailsSubscriptions
       }, {
            path: 'profile',
            components: {
            default: UserProfile,
            helper: UserProfilePreview
            }
       }]
    }
    
  • 命名路由

    有时候,通过一个名称来标识一个路由显得更方便一些,特别是在链接一个路由,或者是执行一些跳转的时候。你可以在创建 Router 实例的时候,在 routes 配置中给某个路由设置名称。
    const router = new VueRouter({
         routes: [
              {
              path: '/user/:userId',
              name: 'user',
              component: User
              }
         ]
    })
    
    要链接到一个命名路由,可以给 router-linkto 属性传一个对象:
    <router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>
    这跟代码调用 router.push() 是一回事:
    router.push({ name: 'user', params: { userId: 123 }})