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 相关文章推荐
js为数字添加逗号并格式化数字的代码
Aug 23 Javascript
js实现日历可获得指定日期周数及星期几示例分享(js获取星期几)
Mar 14 Javascript
jquery判断元素是否隐藏的多种方法
May 06 Javascript
JQuery弹出层示例可自定义
May 19 Javascript
JavaScript学习心得之概述
Jan 20 Javascript
JavaScript编程中布尔对象的基本使用
Oct 25 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
Feb 13 Javascript
完美解决浏览器跨域的几种方法(汇总)
May 08 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
Nov 15 Javascript
JavaScript数组去重的几种方法
Apr 07 Javascript
小程序封装wx.request请求并创建接口管理文件的实现
Apr 29 Javascript
微信小程序使用车牌号输入法的示例代码
Aug 20 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
搜索和替换文件或目录的一个好类--很实用
2006/10/09 PHP
让PHP支持断点续传的源码
2010/05/16 PHP
php阿拉伯数字转中文人民币大写
2015/12/21 PHP
Javascript 写的简单进度条控件
2008/01/22 Javascript
JS input文本框禁用右键和复制粘贴功能的代码
2010/04/15 Javascript
js中eval详解
2012/03/30 Javascript
js 火狐下取本地路径实现思路
2013/04/02 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
2014/03/22 Javascript
jQuery实现预加载图片的方法
2015/03/17 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
2015/09/20 Javascript
jQuery阻止移动端遮罩层后页面滚动
2017/03/15 Javascript
vuejs如何配置less
2017/04/25 Javascript
vue中如何动态绑定图片,vue中通过data返回图片路径的方法
2018/02/07 Javascript
基于Vue实现关键词实时搜索高亮显示关键词
2018/07/21 Javascript
解决vue的 v-for 循环中图片加载路径问题
2018/09/03 Javascript
JS手写一个自定义Promise操作示例
2020/03/16 Javascript
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
2020/07/20 Javascript
python 线程的暂停, 恢复, 退出详解及实例
2016/12/06 Python
Python中防止sql注入的方法详解
2017/02/25 Python
Pandas 数据处理,数据清洗详解
2018/07/10 Python
Python参数类型以及常见的坑详解
2019/07/08 Python
Python socket服务常用操作代码实例
2020/06/22 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
HTML5新特性之用SVG绘制微信logo
2016/02/03 HTML / CSS
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
浅谈amaze-ui中datepicker和datetimepicker注意的几点
2020/08/21 HTML / CSS
大学在校生求职信范文
2013/11/21 职场文书
2014年基层党建工作总结
2014/11/11 职场文书
2014初中数学教研组工作总结
2014/12/19 职场文书
幼儿园毕业致辞
2015/07/29 职场文书
车间班组长竞聘书
2015/09/15 职场文书
幼儿园教师心得体会范文
2016/01/21 职场文书
如何利用python和DOS获取wifi密码
2021/03/31 Python