专栏首页授客的专栏Vue 嵌套路由使用总结

Vue 嵌套路由使用总结

开发环境

Win 10

node-v10.15.3-x64.msi

下载地址:

https://nodejs.org/en/

需求场景

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

解决方案

使用动态路由

新建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>元素为对应的组件内容。

参考链接:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 产品相关 做产品VS做项目

    由一组有起止日期的、协调和受控的活动组成的独特过程,该过程要达到符合包括时间、成本和资源约束条件在内的规定要求的目标

    授客
  • Python 基于Python实现批量创建目录

    path = os.path.normpath(path) # 去掉路径最右侧的 \\ 、/

    授客
  • Oracle 修改oracle数据库名

    2.确保数据库处于mount,非open状态,并且在加载前先以immediate方式关闭。如:

    授客
  • vue之vue-router实例

    本文转自: https://www.cnblogs.com/SamWeb/p/6610733.html

    开发架构二三事
  • 零碎笔记:移动Web特别样式处理

    高清图片跟我们平时下的那种电影高清图片是不一样的,移动Web的高清图片的概念是我这张图这么大,清晰度这么多,那么我们在移动设备上就该展示这么清晰。那么为什么会产...

    Dunizb
  • ESP8266 LUA脚本语言开发: 外设篇-串口

    https://nodemcu.readthedocs.io/en/master/modules/uart/

    杨奉武
  • 使用supervisor对程序的输出重定向

    超级大猪
  • webpack通用功能开发 原

    在util/mm.js下,包含ajax的数据请求,服务器地址的获取,url正则提取后的路径,html模板渲染的,成功、错误提示,字段的正则验证,对登录的统一处理...

    晓歌
  • Linux 删除文件夹和文件的命令

    -r 就是向下递归,不管有多少级目录,一并删除 -f 就是直接强行删除,不作任何提示的意思

    周小董
  • 高效 DevOps 的7个习惯

    很多人在 DevOps 文化和目标导向上过度纠结。请使用这个指南。 如果你问IT行业的高管,DevOps 对你的工作挑战最大的是哪方面?最近和 DevOps 手...

    DevOps时代

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动