巢狀路由
有時候在路由中,主要的部分是相同的,但是下面可能是不同的。比如訪問首頁,裡面有新聞類的/home/news
,還有資訊類的/home/message
。這時候就需要使用到巢狀路由。專案結構如下:
我們建立了3個元件,分別是Home.vue
,HomeNews.vue
,HomeMessage.vue
,程式碼如下:
Home.vue
<template>
<div class="home">
<h1>Home</h1>
<router-link to="/home/news">新聞類</router-link> // 注意這裡一定要寫完整路徑不能只寫/news,需要加上/home
<router-link to="/home/message">資訊類</router-link>
<router-view></router-view>
</div>
</template>
<script>
export default {
name: "Home",
};
</script>
<style scoped>
</style>
HomeNews
<template>
<div class="homeNews">
<ul>
<li>新聞1</li>
<li>新聞2</li>
<li>新聞3</li>
<li>新聞4</li>
</ul>
</div>
</template>
<script>
export default {
name: "HomeNews"
}
</script>
<style scoped>
</style>
HomeMessage
<template>
<div class="homeMessage">
<ul>
<li>訊息1</li>
<li>訊息2</li>
<li>訊息3</li>
<li>訊息4</li>
</ul>
</div>
</template>
<script>
export default {
name: "HomeMessage"
}
</script>
<style scoped>
</style>
元件寫完以後,我們在router
資料夾下的index.js
檔案中配置路由
import Vue from "vue";
import VueRouter from "vue-router";
Vue.use(VueRouter);
// 這裡還是使用路由懶載入
const Home = () => import('../views/Home')
const HomeNews = () => import('../views/HomeNews')
const HomeMessage = () => import('../views/HomeMessage')
const routes = [
{
path: "/home",
name: "Home",
component: Home,
// 子路由的寫法
children: [
{
path: "news",
name: "HomeNews",
component: HomeNews
},
{
path: "message",
name: "HomeMessage",
component: HomeMessage
},
]
},
{
path: "",
redirect: "home"
}
];
const router = new VueRouter({
routes,
mode: 'history',
});
export default router;
巢狀路由的寫法很簡單,你會發現,children
配置就是像 routes
配置一樣的路由配置陣列,所以呢,你可以巢狀多層路由。
此時,基於上面的配置,當你訪問 /home/
時,home 的出口是不會渲染任何東西。
這是因為沒有匹配到合適的子路由。如果你想要渲染點什麼,可以提供一個 空的
子路由:
const routes = [
{
path: "/home",
name: "Home",
component: Home,
children: [
{
path: "news",
name: "HomeNews",
component: HomeNews
},
{
path: "message",
name: "HomeMessage",
component: HomeMessage
},
// 新增空的子路由
{
path: "",
redirect: "news"
}
]
},
{
path: "",
redirect: "home"
}
];
這樣頁面就預設會重定向到news
頁面,會展示news
的資訊