欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Vue 嵌套路由使用总结

程序员文章站 2022-06-26 08:23:51
Vue 嵌套路由使用总结 by:授客 QQ:1033553122 开发环境 Win 10 node-v10.15.3-x64.msi 下载地址: https://nodejs.org/en/ 需求场景 如下图,我们希望点击导航栏不同菜单时,导航栏下方加载不同的组件,进而展示不同的页面内容 解决方案 ......

vue 嵌套路由使用总结

 

by:授客 qq1033553122

 

开发环境

 

win 10

 

node-v10.15.3-x64.msi

下载地址:

 

需求场景

如下图,我们希望点击导航栏不同菜单时,导航栏下方加载不同的组件,进而展示不同的页面内容

 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作为子页面组件

<template>

    <div>

        <h3>nav1 page</h3>

        <p>nav1 page content</p>

    </div>

</template>

 

<script>

 

export default {

    name: "nav1page",

 

};

</script>

 

<style scoped>

h3 {

    font-size: 30px;

}

</style>

 

新建index.vue作为父页面

<template>

    <div class="container">

        <div class="nav">

            <ul>

                <li>

                    <a @click="clickhome">首页</a>

                </li>

                <li>

                    <a @click="clicknav1">导航1</a>

                </li>

            </ul>

        </div>

        <div class="content">

            <router-view></router-view>

        </div>

    </div>

</template>

 

<script>

export default {

    methods: {

        clickhome() {

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

        },

        clicknav1() {

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

        }

    }

};

</script>

 

<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 {

    width: 100px;

    height: 26px;

    line-height: 28px;

    border: 1px solid red;

    color: red;

    background: #fff;

}

 

.content {

    position: absolute;

    top: 40px;

    bottom: 0px;

    right: 10px;

    left: 15px;

    background: rgb(176, 207, 180)

}

</style>

 

说明:

1、

    methods: {

        clickhome() {

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

        },

        clicknav1() {

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

        }

    }

 

点击对应“首页”菜单,“导航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>元素为对应的组件内容。

 

 

参考链接:

 

修改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对应的路由