Vue 嵌套路由使用总结(推荐)


Posted in Javascript onJanuary 13, 2020

开发环境

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

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

以上所述是小编给大家介绍的Vue 嵌套路由使用总结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
根据地区不同显示时间的javascript代码
Aug 13 Javascript
对xmlHttp对象的理解
Jan 17 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
Mar 05 Javascript
js二级地域选择的实现方法
Jun 17 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
Dec 04 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
Aug 18 Javascript
js实现搜索框关键字智能匹配代码
Mar 26 Javascript
Angularjs添加排序查询功能的实例代码
Oct 24 Javascript
微信小程序自定义音乐进度条的实例代码
Aug 28 Javascript
javascript验证form表单数据的案例详解
Mar 25 Javascript
轻松解决JavaScript定时器越走越快的问题
May 13 Javascript
vue中的mescroll搜索运用及各种填坑处理
Oct 30 Javascript
优化Vue中date format的性能详解
Jan 13 #Javascript
JS document文档的简单操作完整示例
Jan 13 #Javascript
JavaScript数组排序小程序实现解析
Jan 13 #Javascript
JS document form表单元素操作完整示例
Jan 13 #Javascript
JS校验与最终登陆界面功能完整示例
Jan 13 #Javascript
vue+vant实现商品列表批量倒计时功能
Jan 13 #Javascript
JS表格的动态操作完整示例
Jan 13 #Javascript
You might like
DC这些乐高系列动画电影你看过几部?
2020/04/09 欧美动漫
德劲1104的电路分析与改良
2021/03/01 无线电
用PHP 快速生成 Flash 动画的方法
2007/03/06 PHP
gd库图片下载类实现下载网页所有图片的php代码
2012/08/20 PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
解析如何在PHP下载文件名中解决乱码的问题
2013/06/20 PHP
PHP开发微信支付的代码分享
2014/05/25 PHP
php封装实现钉钉机器人报警接口的示例代码
2020/08/08 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
jQuery实现可拖动的浮动层完整代码
2013/05/27 Javascript
jquery实现table鼠标经过变色代码
2013/09/25 Javascript
JS随机漂浮广告代码具体实例
2013/11/19 Javascript
JavaScript面向对象之私有静态变量实例分析
2016/01/14 Javascript
jQuery Validate设置onkeyup验证的实例代码
2016/12/09 Javascript
javascript简写常用的12个技巧(可以大大减少你的js代码量)
2020/03/28 Javascript
vue router仿天猫底部导航栏功能
2017/10/18 Javascript
关于js陀螺仪的理解分析
2019/04/11 Javascript
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
vue实现简单跑马灯效果
2020/05/25 Javascript
[05:26]2014DOTA2西雅图国际邀请赛 iG战队巡礼
2014/07/07 DOTA
[02:49:21]2019完美盛典全程录像
2019/12/08 DOTA
python创建线程示例
2014/05/06 Python
Python简单进程锁代码实例
2015/04/27 Python
python实现实时监控文件的方法
2016/08/26 Python
python numpy 矩阵堆叠实例
2020/01/17 Python
在matplotlib中改变figure的布局和大小实例
2020/04/23 Python
python selenium xpath定位操作
2020/09/01 Python
python查询MySQL将数据写入Excel
2020/10/29 Python
python 实现批量图片识别并翻译
2020/11/02 Python
世界顶级足球门票网站:Live Football Tickets
2017/10/14 全球购物
物流专业大学生的自我鉴定
2013/11/13 职场文书
公司成本主管岗位责任制
2014/02/21 职场文书
学校爱国卫生月活动总结
2014/06/25 职场文书
普通党员自我剖析材料
2014/10/07 职场文书
redis 查看所有的key方式
2021/05/07 Redis
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL