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. apache的commons-fileupload中FileItem类和ServletFileUpload

    FileItem类的常用方法      1.boolean  isFormField().isFormField方法用来判断FileItem对象里面封装的数据是一个普通文本表单字段,还是一个文件表单字 ...

  2. IIS 承载的服务失败

    如果 IIS 承载的某个服务失败,则可能会看到以下症状之一: 当浏览到 .svc 文件时,不能识别该文件,浏览器显示空白页,或显示文件的文本而不是服务的帮助页,如下面的示例所示.     <%@ ...

  3. Android ADB被占用 重启 ADB方法

    前言 ADB 是 android sdk里面的一个工具,这个工具可以用于操作管理 Android 模拟器 和 真实Andriod手机设备.列如 : 执行安装 删除 应用的操作 , 执行 模拟点击屏幕 ...

  4. linux6.5 网卡绑定

    Linux网口绑定 通过网口绑定(bond)技术,可以很容易实现网口冗余,负载均衡,从而达到高可用高可靠的目的.前提约定: 2个物理网口分别是:eth0,eth1 绑定后的虚拟口是:bond0 服务器 ...

  5. Codeforces542E Playing on Graph 思维+DFS+BFS

    解法参考https://www.cnblogs.com/BearChild/p/7683114.html这位大佬的,这位大佬讲得很好了. 这道题还是有一定的思维的. 直接贴代码: #include&l ...

  6. QMap的key也可以是一个结构体类吗?

    QMap<usbsnvidpid, QVector<QString>> USBVIDPIDTIME; USBVIDPIDTIME.insert(m_vidpidsn, time ...

  7. poj 2752 kmp的next数组

    题目大意: 求一个字符串中某一个既是前缀又是后缀的前缀的结尾下标: 基本思路: 从_next[len]开始找_next[_next[len]],再找_next[_next[_next[len]]],一 ...

  8. 56. Map(双列集合)

    在生活中有些数据是以映射关系存在的,也就是成对出现的,比如:老公  老婆(key-->value) 双列集合:-------------------| Map    如果是实现了Map接口的集合 ...

  9. Java高并发网络编程(四)Netty

    在网络应用开发的过程中,直接使用JDK提供的NIO的API,比较繁琐,而且想要进行性能提升,还需要结合多线程技术. 由于网络编程本身的复杂性,以及JDK API开发的使用难度较高,所以在开源社区中,涌 ...

  10. PHP ftp_get_option() 函数

    定义和用法 The ftp_get_option() 函数返回 FTP 连接的各种运行时选项. 语法 ftp_get_option(ftp_connection,option) 参数 描述 ftp_c ...