在 Vue.js 中使用嵌套路由

在 Vue.js 中使用嵌套路由

瘋狂的技術宅 前端先鋒 css

翻譯:瘋狂的技術宅
做者:Parthiv Mohan
來源:alligator.io
正文共:2408 字
預計閱讀時間:7 分鐘html

在 Vue.js 中使用嵌套路由

隨着 Vue.js 單頁應用(SPA)變得至關複雜,你開始須要 Vue 路由以及嵌套路由。嵌套路由容許更復雜的用戶界面以及相互嵌套的組件。讓咱們建立一個相對簡單的用例,來展現 Vue Router 中嵌套路由的實用性。前端

用 Vue CLI 進行設置

若是還沒有安裝,請運行如下命令全局安裝 Vue CLI:vue

1$ npm install -g @vue/cli

或者web

1$ yarn global add @vue/cli

如今你能從命令行運行 vue 命令了。讓咱們建立一個名爲 alligator-nest 的 Vue 應用:vue-router

1$ vue create alligator-nest

在提示符下選擇默認預設(按 Enter 鍵)。以後,運行如下命令:vue-cli

1$ npm install vue-router

而後,在你選擇的編輯器中打開 alligator-nest 目錄。npm

基本代碼

如下 CSS 將幫助咱們爲 UI 定位元素。將其做爲樣式表文件添加到 public/ 文件夾中,並在 public/index.html 中引用它。爲此,咱們將使用 CSS grid:瀏覽器

grid.cssapp

1.row1 {
 2  grid-row-start: 1;
 3  grid-row-end: 2;
 4}
 5
 6.row12 {
 7  grid-row-start: 1;
 8  grid-row-end: 3;
 9}
10
11.row123 {
12  grid-row-start: 1;
13  grid-row-end: 4;
14}
15
16.row2 {
17  grid-row-start: 2;
18  grid-row-end: 3;
19}
20
21.row23 {
22  grid-row-start: 2;
23  grid-row-end: 4;
24}
25
26.row3 {
27  grid-row-start: 3;
28  grid-row-end: 4;
29}
30
31.col1 {
32  grid-column-start: 1;
33  grid-column-end: 2;
34}
35
36.col12 {
37  grid-column-start: 1;
38  grid-column-end: 3;
39}
40
41.col123 {
42  grid-column-start: 1;
43  grid-column-end: 4;
44}
45
46.col1234 {
47  grid-column-start: 1;
48  grid-column-end: 5;
49}
50
51.col2 {
52  grid-column-start: 2;
53  grid-column-end: 3;
54}
55
56.col23 {
57  grid-column-start: 2;
58  grid-column-end: 4;
59}
60
61.col234 {
62  grid-column-start: 2;
63  grid-column-end: 5;
64}
65
66.col3 {
67  grid-column-start: 3;
68  grid-column-end: 4;
69}
70
71.col34 {
72  grid-column-start: 3;
73  grid-column-end: 5;
74}
75
76.col4 {
77  grid-column-start: 4;
78  grid-column-end: 5;
79}

接下來,讓咱們對 vue-cli 添加的默認文件進行一些更改。

從 src/components 文件夾中刪除 HelloWorld.vue,並從 src/App.vue 中刪除全部與其相關的東西。對 App.vue 中的 HTML 標記和 CSS 樣式進行如下修改。

1<template>
 2  <div id="app">
 3    <h1 class="row1 col12">Alligator Nest</h1>
 4    <a class="row1 col3">Travels</a>
 5    <a class="row1 col4">About</a>
 6    <div class="row2 col234"></div>
 7  </div>
 8</template>
 9html, body {
10  height: 100vh;
11  width: 100vw;
12  padding: 0;
13  margin: 0;
14}
15
16#app {
17  font-family: Avenir, Helvetica, Arial, sans-serif;
18  -webkit-font-smoothing: antialiased;
19  -moz-osx-font-smoothing: grayscale;
20  color: #2c3e50;
21  padding: 2%;
22  height: 100%;
23  display: grid;
24  grid-template-rows: 20% 80%;
25  grid-template-columns: 25% 25% 25% 25%;
26}

若是你在項目的根目錄中運行 npm run serve,則能夠將鼠標懸停在瀏覽器中的 localhost:8080 上,並查看框架佈局。那些 display:grid 屬性頗有用!如今咱們能夠開始建立路由了。

輸入 Vue 路由

在 /components 文件夾中建立一個名爲 AboutPage.vue 的組件。它看起來像這樣:

1<template>
 2  <div>
 3    <h2>About</h2>
 4    <p>Alligators were around during the time of the dinosaurs.</p>
 5  </div>
 6</template>
 7
 8<script>
 9  export default {
10    name: 'AboutPage',
11  }
12</script>
13
14<style scoped>
15
16</style>

如今咱們的 main.js 文件須要 /about 路由。它看起來像這樣。

1import VueRouter from 'vue-router';
 2import Vue from 'vue';
 3import App from './App.vue';
 4
 5Vue.config.productionTip = false;
 6
 7import VueRouter from 'vue-router';
 8Vue.use(VueRouter);
 9
10import AboutPage from './components/AboutPage.vue';
11
12const routes = [
13  { path: '/about', component: AboutPage },
14]
15
16const router = new VueRouter({
17  routes
18})
19
20new Vue({
21  render: h => h(App),
22  router
23}).$mount('#app');

最後,讓咱們回到 App.vue,並將 「About」 的錨標記更改成屬性爲 to="/about" 的 <router-link> 標籤。而後,將第二個 div 更改成 <router-view> 標籤。確保保持網格定位類屬性不變。

如今,咱們有了一個功能齊全的站點框架,併爲 「About」 頁面處理了路由。

咱們在此重點介紹路由功能,所以不會在樣式上話費太多時間。儘管如此,咱們也要讓Travels 頁面看起來更精緻一些。

首先,建立一個 TravelPage,方法與建立 AboutPage 相同。在 main.js 中引用它。

還須要建立如下兩個組件,這些組件最終將嵌套在 TravelPage.vue 中:

TravelAmericaPage.vue

1<template>
 2  <div>
 3    <p>Alligators can be found in the American states of Louisiana and Florida.</p>
 4  </div>
 5</template>
 6
 7<script>
 8  export default {
 9    name: 'TravelAmericaPage'
10  }
11</script>
12
13<style scoped>
14</style>

TravelChinaPage.vue

1<template>
 2  <div>
 3    <p>Alligators can be found in China's Yangtze River Valley.</p>
 4  </div>
 5</template>
 6
 7<script>
 8  export default {
 9    name: 'TravelChinaPage'
10  }
11</script>
12
13<style scoped>
14
15</style>

配置嵌套路由


如今,讓咱們同時更新 main.js 和 TravelPage.vue,以使用 children 來引用這些嵌套路由。必須將 main.js 更新爲對 routes 常量具備如下定義:

1const routes = [
 2  {
 3    path: '/travel', component: TravelPage,
 4    children: [
 5      { path: '/travel/america', component: TravelAmericaPage },
 6      { path: '/travel/china', component: TravelChinaPage}
 7    ]
 8  },
 9  {
10    path: '/about', component: AboutPage
11  }
12];

請注意,子級的嵌套能夠無限繼續下去。

而且 TravelPage.vue 能夠經過如下方式編寫:

TravelPage.vue

1<template>
 2  <div id="travel">
 3    <h2 class="row1">Travels</h2>
 4    <div class="flex-container row2">
 5      <router-link to="/travel/america">America</router-link>
 6      <router-link to="/travel/china">China</router-link>
 7    </div>
 8    <router-view class="row3"></router-view>
 9  </div>
10</template>
11
12<script>
13  export default {
14    name: 'TravelPage'
15  }
16</script>
17
18<style scoped>
19div {
20  text-align: center;
21}
22
23#travel {
24  display: grid;
25  grid-template-rows: 20% 40% 40%;
26}
27
28.flex-container {
29  display: flex;
30  justify-content: space-around;
31}
32</style>

檢出 localhost:8080,你將看到 Travels 頁面中包含 2 個子頁面!當你單擊任一連接時,咱們的 URL 也會相應更新。

總結

但願本教程對你瞭解如何使用嵌套路由有幫助!

關於該主題的其餘注意事項——咱們可使用動態段定義路由,例如 path:'/location/:id'。而後在這些路由的視圖上,能夠將該 id 引用爲 this.$route.params。當你但願在網站和應用上顯示更多特定類型的數據(用戶、圖片等)時,此功能很是有用。

原文連接

https://alligator.io/vuejs/nested-routes/

相關文章
相關標籤/搜索