命名视图
有时候想同时(同级)呈现多个视图,而不是嵌套呈现,例如创建一个布局,有 headbar
(导航)、sidebar
(侧边栏)和 main
(主内容)3 个视图,这时命名视图就派上用场了。可以在界面中拥有多个单独命名的视图,而不是只有一个单独的出口。简单来说,命名视图就是给 <router-view> 设置名字,从而达到不同的 <route-view> 显示不同的内容,如示例代码7-6-1所示。
<div id="app">
<router-view name="headbar"></router-view>
<router-view name="sidebar"></router-view>
<div class="container">
<router-view></router-view>
</div>
</div>
...
const Main = {
template: '<div>Main</div>',
}
const HeadBar = {
template: '<div>Header</div>',
}
const SideBar = {
template: '<div>SideBar</div>',
}
// 配置路由信息
const router = VueRouter.createRouter({
history: VueRouter.createWebHashHistory(),
routes: [
{
path: '/',
components: { // 采用components设置项
default: Main,
headbar: HeadBar,
sidebar: SideBar,
}
}
]
})
在上面的代码中,针对一个路由设置了多个视图作为组件来渲染,<router-view name="headbar"></route-view> 中的 name
属性和 components
对象中的 key
要对应,表示这个 <route-view> 会被替换成组件的内容,default
表示如果没有指定 name
属性,就选择默认的组件来替换对应的 <route-view>。这样就实现了一个页面中有多个不同的视图。
但是,这种在同一个页面使用多个 <route-view> 的情况,特别是在单页应用中,对于大多数业务来说并不常见,一般要抽离出一个经常变动的内容,将它放入 <route-view>,而对于那些不变的内容,例如 headbar
或者 sidebar
,可以单独封装成一个组件,在根组件中将它们作为子组件来导入。代码如下:
<div id="app">
<headerbar></headerbar>
<sidebar></sidebar>
<div class="container">
<router-view class="view"></router-view>
</div>
</div>
命名视图的重点在于浏览器访问同一个 URL
可以匹配到多个视图组件,当切换路由时,这些组件可以同步变化,但是具体在哪些场合使用,还需要根据业务来决定,代码如下:
const router = VueRouter.createRouter({
history: VueRouter.createWebHashHistory(),
routes: [
{
path: '/', // 不同路径
components: {
default: Main,
headbar: HeadBar,
sidebar: SideBar,
}
},
{
path: '/other', // 不同路径
components: {
default: OtherMain,
headbar: OtherHeadBar,
sidebar: OtherSideBar,
}
}
]
})