vue(19)巢狀路由

Silent丿丶黑羽發表於2021-07-19

巢狀路由

有時候在路由中,主要的部分是相同的,但是下面可能是不同的。比如訪問首頁,裡面有新聞類的/home/news,還有資訊類的/home/message。這時候就需要使用到巢狀路由。專案結構如下:
vue(19)巢狀路由
我們建立了3個元件,分別是Home.vueHomeNews.vueHomeMessage.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 的出口是不會渲染任何東西。
vue(19)巢狀路由

這是因為沒有匹配到合適的子路由。如果你想要渲染點什麼,可以提供一個 空的 子路由:

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的資訊
vue(19)巢狀路由

相關文章