1、定义路由

  routes: [

    {
path: '/product', //第一层路由
name: 'product',
component: Vproductcontent,//父组件渲染的是子组件的内容<routerview/>写在父组件中
children:[
{
path: '/product/hotproduct', //第二层路由
name: 'hotproduct',
component: Vhotproduct,
children:[
{
path: '/product/hotproduct/detail/:id(\\d+)', //第三层路由
component: Vhotproductdetail,
}
]
}, ]
}, ]

2、使用 router-link 组件来导航

在左侧菜单栏的Vleft组件中使用router-link

    <ul class="nav nav-sidebar">
<router-link tag="li" to="/product"><a href="#">产品管理</a></router-link>
</ul>

2.1 加入默认样式

默认选中的样式是在li标签上加上class="active"

 #将其渲染成以下样式,这是默认选中的样式
<ul class="nav nav-sidebar">
<li class="active"><a href="#">产品管理</a></li>
</ul>

2.1.1 tag

如果想要 <router-link> 渲染成某种标签,例如 <li>。 可以使用 tag prop 类指定何种标签,同样它还是会监听点击,触发导航。

    <ul class="nav nav-sidebar">
<router-link tag="li" to="/product"><a href="#">产品管理</a></router-link>
</ul>

2.1.2 active-class

设置 链接激活时使用的 CSS 类名。默认值可以通过路由的构造选项 linkActiveClass 来全局配置。比如:li标签上渲染出class="active"

  • 可在 <router-link> 上使用 active-class 属性,指定渲染后生成其他类名
 <router-link  tag="li" to="/product" active-class=“active”><a href="#">产品管理</a></router-link>

但是这样需要没一个router-link上都需要加,可以使用全局配置,避免麻烦

  • 可以通过路由的构造选项 linkActiveClass 来全局配置
//在router文件夹下的index.js中配置

export default new Router({
// 全局配置 router-link 标签生成的 CSS 类名
linkActiveClass: 'active',
routes: [
]
})

2.1.3 exact

  如果完成上述配置后,会发现不管点击哪一个链接根路由(/)一直有高亮背景, 因为 /product都会去模糊匹配 / 和 /product, 所以 / 一直有高亮 ,可在router-link 标签上使用 exact 属性,针对根路由(/)开启精确匹配。

 <router-link  tag="li" to="/" exact><a href="#">首页</a></router-link>

此时就完成了点击哪个,哪个就会激活有背景色。

3、router-view渲染

这里注意每一层的路由最后渲染都应该渲染在它上一层录有对应的组件中,例如:

    {
path: '/product',
name: 'product',
component: Vproductcontent,
children:[
{
path: '/product/hotproduct',
name: 'hotproduct',
component: Vhotproduct,
         }
     ]
   }
children下的组件都应该渲染在Vproductcontent组件中,所以在Vproductcontent下写router-view的渲染出口。
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
<div class="header clearfix headeradd">
<nav>
<ul class="nav nav-pills">
<router-link :to="{name:'hotproduct'}" tag="li"> //路由跳转连接
<a>热销产品</a>
</router-link>
</ul>
</nav>
<hr>
</div> <router-view></router-view> //渲染出口 </div>

4、路由配置默认选中

此时只需要在路由中加入,点击产品管理,默认跳转到热销产品即可。

    {
path: '/product',
name: 'product',
component: Vproductcontent,//父组件渲染的是子组件的内容<routerview/>写在父组件中
children:[
{
path: '/product/hotproduct',
name: 'hotproduct',
component: Vhotproduct,
children:[
{
path: '/product/hotproduct/detail/:id(\\d+)',
component: Vhotproductdetail,
}
]
}, //点击产品管理默认选中
{
path: '/product',
redirect: '/product/hotproduct',
}

5、keep-alive

<keep-alive>  可缓存渲染的路由组件实例,比如一个form表单的组件,输入完成后切换到其它组件,回来后内容仍然存在

    <!-- <keep-alive缓存form表单的输入数据 -->
<keep-alive>
<router-view></router-view>
</keep-alive>

6、路由传参

6.1 定义路由

6.1.1 接收参数(变量占位符)

用于接收路由参数的,可用于接收不同类型

    //路由将匹配id是整型的,params后面可以跟正则
{ path: '/params-with-regex/:id(\\d+)' }, // * 可以匹配任何东西
{ path: '/asterisk/*' }, // params用冒号“:”表示
{path : ' / params /:foo /:bar ' }, //通过添加“?”可以使param成为可选项
{path : ' / optional-params /:foo?' },

详情参考:https://github.com/vuejs/vue-router/blob/dev/examples/route-matching/app.js

6.2 传参

       <ul>
<li v-for="(product, index) in hotProductArray" :key="product.id">
<router-link :to="'/product/hotproduct/detail/' + product.id">
{{product.name}}
</router-link>
</li>
</ul>
 <ul>
<li v-for="(product, index) in hotProductArray" :key="product.id">
<button @click="pushId(id)"> //相当于点击路由链接(后退1步,会返回当前路由界面)
{{product.name}}
</button>
</li>
</ul> //
methods:{
pushId(id){
this.$router.push(`/product/hotproduct/detail/${id}`)
}
},

编程式传参

其余编程式路由API:

this.$router.push(path)      //相当于点击路由链接(后退1步,会返回当前路由界面)
this.$router.replace(path) // 用新路由替换当前路由(后退1步,不可返回到当前路由界面)
this.$router.back() //后退回上一个记录路由
this.$router.go(n) // 参数 n 指定步数
this.$router.go(-1) // 后退回上一个记录路由
this.$router.go(1) //向前进下一个记录路由

6.3 获取对应id的对象

 methods:{
getProductById(){
this.id=this.$route.params.id-0 //注意:获取路径上的id,减0是为了变成整型,路径上的id是字符 //获取指定的对象,防止页面刷新数据丢失,存在localStorage,先去这里取值,因为页面刷新,重新生成Vue实例,内存的数据丢失
let detailProduct= window.localStorage.getItem('detailProduct');
if(!detailProduct) {
this.detailProduct = this.$store.getters['pm/getHotProductById'](this.id) //获取指定id的对象
} else {
window.localStorage.setItem('detailProduct', this.detailProduct)
} }
},

在创建这个组件时就应该获取id,否则页面刚开始会没有数据

      created(){
//只会调用一次,创建时就会调用方法,获取id
this.getProductById(); },

点击不同的对象就应该监听路由变化,随时获取不同的id

      watch:{
//监视路由变化,只要变化就会调用方法,重新获取id
'$route':function () {
this.getProductById()
}
}

id和对象初始化

data:function(){
return {
id:null,
detailProduct:{}
}
},

渲染数据

  <div class="jumbotron">
<h1>{{ id }}</h1>
<h1>{{ detailProduct }}</h1> </div>

6.4 路由传参关系图

参考文档:https://router.vuejs.org/zh/

vue之vue-router嵌套路由的更多相关文章

  1. vue(19)嵌套路由

    嵌套路由 有时候在路由中,主要的部分是相同的,但是下面可能是不同的.比如访问首页,里面有新闻类的/home/news,还有信息类的/home/message.这时候就需要使用到嵌套路由.项目结构如下: ...

  2. Vue(基础六)_嵌套路由(续)

    一.前言                  1.路由嵌套里面的公共路由                  2.keep-alive路由缓存                  3.导航守卫 二.主要内容 ...

  3. vue +ts 在router的路由中import报错的解决方案

    在router.ts中引入.vue文件,会提示打不到module,但是编译可能成功,运行也不报错 找了好久,发现了这个答案 https://segmentfault.com/a/11900000167 ...

  4. vue 中 this.$router.push() 路由跳转传参 及 参数接收的方法

    传递参数的方法:1.Params 由于动态路由也是传递params的,所以在 this.$router.push() 方法中 path不能和params一起使用,否则params将无效.需要用name ...

  5. vue中this.$router.push()路由传值和获取的两种常见方法

    1.路由传值   this.$router.push() (1) 路由跳转使用router.push()方法,这个方法会向history栈添加一个新纪录,所以,当用户点击浏览器后退按钮时,会回到之前的 ...

  6. VUE温习:nextTick、$refs、嵌套路由、keep-alive缓存、is特性、路由属性用法、路由钩子函数

    一.$nextTick 1.vue的dom执行异步更新,只要观察到数据变化,vue将开启一个队列,并缓冲在同一事件循环中发生的所有数据改变. 2.vue.$nextTick(cb),数据发生变化,更新 ...

  7. vue路由(一个包含重定向、嵌套路由、懒加载的main.js如下)and 路由跳转传参的query和params的异同

    import Vue from 'vue'import VueRouter from 'vue-router'import App from './App'Vue.use(VueRouter)cons ...

  8. vue嵌套路由--params传递参数

    在嵌套路由中,父路由向子路由传值除了query外,还有params,params传值有两种情况,一种是值在url中显示,另一种是值不显示在url中. 1.显示在url中index.html <d ...

  9. vue嵌套路由总结

    嵌套路由就是在一个被路由过来的页面下可以继续使用路由,嵌套也就是路由中的路由的意思. 比如在vue中,我们如果不使用嵌套路由,那么只有一个<router-view>,但是如果使用,那么在一 ...

  10. Vue中使用children实现路由的嵌套

    Vue中使用children实现路由的嵌套 相关Html: <!DOCTYPE html> <html lang="en"> <head> &l ...

随机推荐

  1. 前端学习(三)css选择器(笔记)

    字体样式:    color:red:    font-size:12px:    font-weight:bold/normal;    font-style:italic/normal;    f ...

  2. 3、Python 基础类型 -- List 列表类型

    2.更新列表:list.append() 3.删除列表元素 del 

  3. 路由网关--spring cloud zuul

    路由网关--spring boot Zuul 1.为什么需要Zuul? Zuul Ribbon 以及 Eureka 相结合,可以实现智能路由和负载均衡的功能, Zuul 能够将请求流量按某种策略分发到 ...

  4. CF566E Restoring Map

    题意:乱序给你树上的每一个节点与之相距<=2的节点集合(并不知道这具体是哪个节点). 还原整棵树. 标程: #include<bits/stdc++.h> #define P pai ...

  5. 使用Git实现Laravel项目的自动化部署

    简介 不知道大家一开始是怎么使用 git 进行开发的,反正我个人是先将代码提交到 github 仓库,然后用 SSH 登录到服务器,然后进行克隆或者版本更新.听起来就很麻烦,当然实际操作中也很麻烦,那 ...

  6. Delphi 常用API 函数列表

    Delphi 常用API 函数 AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小AnyPopup 判断屏幕上是否存在任何弹出式窗口ArrangeIconicWi ...

  7. 快速求排列C(m,n)加取模

    快速求排列组合C(m,n)%mod 写在前面: 1. 为防止产生n和m的歧义,本博文一律默认n >= m 2. 本博文默认mod = 10^6+3 3. 本博文假设读者已知排列组合公式 C(m, ...

  8. bzoj1047题解

    [解题思路] (p.s.:刚看的时候一脸懵逼..没看见N已经给定了,还以为要用某些高明的方法..果然还是太naive了..) 两遍预处理,第一遍处理出f[i][j][0/1]表示第i行从j-n+1~j ...

  9. 分治维护dp——19南昌网络赛C/cf750E

    南昌网络赛,是cf的原题 第一次做到这种题,所以认真想了下,每次给一个询问[L,R],要求出这个区间里有2017子序列,但是不能有2016子序列需要删掉的最少元素个数 首先如果我们之询问一小段区间[L ...

  10. SELinux导致PHP连接MySQL异常Can't connect to MySQL server的解决方法

    原文摘自:http://www.jb51.net/article/52581.htm 这篇文章主要介绍了SELinux导致PHP连接MySQL异常Can't connect to MySQL serv ...