天天看點

Vue 嵌套路由使用總結

Vue 嵌套路由使用總結

by:授客 QQ:1033553122

開發環境

Win 10

node-v10.15.3-x64.msi

下載下傳位址:

https://nodejs.org/en/

需求場景

如下圖,我們希望點選導航欄不同菜單時,導航欄下方加載不同的元件,進而展示不同的頁面内容

Vue 嵌套路由使用總結

解決方案

使用動态路由

建立home.vue作為子頁面元件

<template>

    <div>

        <h3>home Page</h3>

        <p>home page content</p>

    </div>

</template>

<script>

export default {

    name: "homePage",

};

</script>

<style scoped>

h3 {

    font-size: 30px;

}

</style>

建立nav1.vue作為子頁面元件

        <h3>nav1 Page</h3>

        <p>nav1 page content</p>

    name: "nav1Page",

建立index.vue作為父頁面

    <div class="container">

        <div class="nav">

            <ul>

                <li>

                    <a @click="clickHome">首頁</a>

                </li>

                    <a @click="clickNav1">導航1</a>

            </ul>

        </div>

        <div class="content">

            <router-view></router-view>

    methods: {

        clickHome() {

            this.$router.push("/index/home");

        },

        clickNav1() {

            this.$router.push("nav1");

        }

    }

<style>

.nav ul {

    width: 100%;

    height: 30px;

    margin: 5px;

    padding: 0;

.nav ul li {

    float: left; /*橫排顯示*/

    list-style-type: none; /*去掉前面的點*/

.nav ul li a {

    width: 100px;

    display: block; /*設定為block,width才起作用*/

    height: 28px;

    line-height: 28px;

    background: grey;

    color: #fff;

    margin: 0px 1px;

    font-size: 18px;

    text-align: center;

    text-decoration: none;

.nav ul li a:hover {

    height: 26px;

    border: 1px solid red;

    color: red;

    background: #fff;

.content {

    position: absolute;

    top: 40px;

    bottom: 0px;

    right: 10px;

    left: 15px;

    background: rgb(176, 207, 180)

說明:

1、

點選對應“首頁”菜單,“導航1”時分别觸發調用這裡定義了兩個方法clickHome()和clickNav1(),兩個方法的實作都是調用this.$router.push(),航到不同的 UR(跳轉到不同的頁面)。另外,push這個方法會向 history 棧添加一個新的記錄,是以,當使用者點選浏覽器後退按鈕時,可以回到之前的頁面

需要注意的是,這裡給push方法提供的代表路徑的字元串。如果該字元串不以“/”打頭,則表示相對路徑,相對于父級路由的path。如果該字元串以“/”打頭,則表示絕對路徑的,相對于根路徑“/”

例中,觸發clickNav1()調用時,提供的路徑字元串為“nav1”,為相對路徑,父級路由路徑為/index,是以點選後跳轉的url路徑為/index/nav1。

例中,觸發clickHome()調用時,提供的路徑字元串為“/index/home”,為絕對路徑,是以點選後跳轉的url路徑為/index/home。

2、

<div class="content">

<router-view></router-view>

</div>

這裡通過在父頁面,即index.vue元件中添加<router-view></router-view>實作動态加載不同元件頁面。點選導航菜單時,會自動加載對應的元件,然後替換<router-view>元素為對應的元件内容。

參考連結:

https://router.vuejs.org/zh/guide/essentials/navigation.html

https://router.vuejs.org/zh/guide/essentials/nested-routes.html

修改router/index.js

import Vue from "vue"

import Router from "vue-router"

import index from "@/views/index"

import home from "@/views/home"

import nav1 from "@/views/nav1"

Vue.use(Router)

export default new Router({

  mode: "history",

  routes: [

    {

      path: "/index",

      name: "index",

      component: index,

      children: [

        {

          path: "/index/home",

          name: "home",

          component: home

          path: "nav1",

          name: "nav1",

          component: nav1

      ]

  ]

})

1、vue路由通過children實作路由嵌套。個人了解,嵌套路由控制内容子元件内容的展示區:實作父元件的内容展示區保持不變,子元件内容展示區動态變化。

2、同this.$router.push(path),這裡的path也分相對路徑(相對于父級路由的path路徑),和絕對路徑(相對于“/”)。如上,/index/home為絕對路徑,nav1為相對路徑(其絕對路徑為/index/nav1)。注意,這裡path是否為絕對路徑,不影響是否嵌套路由,是否嵌套路由,是通過children決定的,隻是影響路由比對。如上,如果path: "nav1",寫成path: "/nav1",,那麼執行this.$router.push("nav1")時,跳轉的url為/index/nav1,将找不到比對的路由

3、this.$router.push(path) 和這裡routes的關系:

個人了解,執行this.$router.push(path)後,程式自動擷取需要跳轉的絕對url,暫且稱之為toPath,然後在routes中進行比對,如果比對到則加載對應的元件。

總結

通過router-view實作在目前指定容器中動态加載不同元件,展示不同頁面的大緻實作思路:

1、 在目前頁面(這裡稱之為父頁面).vue檔案template模闆中的指定位置(“包含”子元件内容的容器),添加<router-view></router-view>元素

2、 router/index.js中給父頁面路徑所在的路由,添加子路由:子元件的加載url對應的路由

作者:授客

QQ:1033553122

全國軟體測試QQ交流群:7156436

Git位址:https://gitee.com/ishouke

友情提示:限于時間倉促,文中可能存在錯誤,歡迎指正、評論!

作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額随意,您的支援将是我繼續創作的源動力,打賞後如有任何疑問,請聯系我!!!

           微信打賞                       

支付寶打賞                  全國軟體測試交流QQ群  

Vue 嵌套路由使用總結
Vue 嵌套路由使用總結
Vue 嵌套路由使用總結