3.8.动态路由匹配和路由组件传参

3.8.1.动态路由匹配

动态路由意味着不固定,具有某种模式,我们希望通过某种匹配方式,把这种不固定的路由形势映射到同一个组件,例如:一个User组件,不同的ID表示不同的用户,即/user/1、/user/2、/user/3,这些不同用户所对应的路由,我们都希望用一个User组件来渲染。vue-router中提供了动态路径参数来实现这种需求,动态路径参数写法:

routes: [
// 动态路径参数 以冒号开头
{ path: '/user/:id', component: User }
]

这里的id类似于一个变量,id可以是1、2、3等具体的值

<template>
<div class="page">
<router-link :to="'/user/'+item.id" v-for="(item, index) in userList" :key="index">{{item.username}}</router-link>
</div>
</template> <script type="text/javascript">
let userData = [
{
id: '1',
username: 'nodeing1',
level: 'vip1'
},
{
id: '2',
username: 'nodeing2',
level: 'vip1'
},
{
id: '3',
username: 'nodeing3',
level: 'vip2'
},
{
id: '4',
username: 'nodeing4',
level: 'vip3'
}]
export default {
data () {
return {
userList: userData
}
},
components: { }
}
</script> <style scoped>
a{
display: inline-block;
padding: 20px 60px;
text-decoration: none;
}
</style>

路由配置:

routes: [
{
path: '/user/:id?',
component: User
}
]

如何监听/响应动态参数的变化?

方式1: 使用 beforeRouteUpdate 钩子函数

<template>
<div class="page">
<router-link :to="'/user/'+item.id" v-for="(item, index) in userList" :key="index">{{item.username}}</router-link>
<hr>
<h3>用户名: {{userInfo.username}}</h3>
<h3>会员级别: {{userInfo.level}}</h3>
<h3>id: {{userInfo.id}}</h3>
</div>
</template> <script type="text/javascript">
let userData = [
{
id: '1',
username: 'nodeing1',
level: 'vip1'
},
{
id: '2',
username: 'nodeing2',
level: 'vip1'
},
{
id: '3',
username: 'nodeing3',
level: 'vip2'
},
{
id: '4',
username: 'nodeing4',
level: 'vip3'
}]
export default {
data () {
return {
userList: userData,
userInfo: {}
}
},
components: { },
beforeRouteUpdate (to, from, next) {
this.userInfo = this.userList.filter((item) => to.params.id === item.id)[0]
}
}
</script> <style scoped>
a{
display: inline-block;
padding: 20px 60px;
text-decoration: none;
}
</style>

方式2: 在组件中对 $route 进行 watch(监听)

watch: {
$route () {
console.log(this.$route)
}
}

路由信息对象$route

path   对应当前路由的路径
params 保护动态路由参数
query url查询参数
hash 当前路由的hash值
fullPath 完整的url路径,包含查询参数和hash
matched 包含当前路由的所有嵌套路径片段的路由记录
name 当前路由的名称

3.8.2.路由组件传参

在组件中使用 $route 会使之与其对应路由形成高度耦合,从而使组件只能在某些特定的 URL 上使用,限制了其灵活性,我们需要做的是通过传参将组件与路由解耦,使得组件的使用更加灵活,这里需要使用到props

路由配置里面我们需要改成这样

routes: [
{
path: '/user/:id?',
component: User,
props: true
}
]

在组件中使用props的值

<template>
<div class="page">
<router-link :to="'/user/'+item.id" v-for="(item, index) in userList" :key="index">{{item.username}}</router-link>
<hr>
<button @click="fn">显示信息</button>
<h3>用户名: {{userInfo.username}}</h3>
<h3>会员级别: {{userInfo.level}}</h3>
<h3>id: {{userInfo.id}}</h3>
</div>
</template> <script type="text/javascript">
let userData = [
{
id: '1',
username: 'nodeing1',
level: 'vip1'
},
{
id: '2',
username: 'nodeing2',
level: 'vip1'
},
{
id: '3',
username: 'nodeing3',
level: 'vip2'
},
{
id: '4',
username: 'nodeing4',
level: 'vip3'
}]
export default {
data () {
return {
userList: userData,
userInfo: {}
}
},
components: { },
props: ['id'],
methods: {
fn () {
let id = this.id
this.userInfo = this.userList.filter((item) => id === item.id)[0]
console.log(this.userInfo)
}
}
}
</script> <style scoped>
a{
display: inline-block;
padding: 20px 60px;
text-decoration: none;
}
</style>

螺钉课堂视频课程地址:http://edu.nodeing.com

vue全家桶(2.5)的更多相关文章

  1. 用 Vue 全家桶二次开发 V2EX 社区

    一.开发背景 为了全面的熟悉Vue+Vue-router+Vuex+axios技术栈,结合V2EX的开放API开发了这个简洁版的V2EX. 在线预览 (为了实现跨域,直接npm run dev部署的, ...

  2. Vue全家桶

    简介 “简单却不失优雅,小巧而不乏大匠”. Vue.js 是一个JavaScriptMVVM库,是一套构建用户界面的渐进式框架.它是以数据驱动和组件化的思想构建的,采用自底向上增量开发的设计. 为什么 ...

  3. 从零开始系列之vue全家桶(3)安装使用vuex

    什么是vuex? vuex:Vue提供的状态管理工具,用于同一管理我们项目中各种数据的交互和重用,存储我们需要用到数据对象. 即data中属性同时有一个或几个组件同时使用,就是data中共用的属性. ...

  4. 使用vue全家桶制作博客网站

    前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue.vue-router.vuex.v ...

  5. 转载: 使用vue全家桶制作博客网站 HTML5 移动网站制作的好教程

    使用vue全家桶制作博客网站   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue. ...

  6. Vue全家桶介绍

    一直不清楚全家桶是什么玩意,上网搜了一下,才知道就是平时项目中使用的几个依赖包,下面分享一下 Vue 全家桶介绍 Vue有著名的全家桶系列,包含了vue-router(http://router.vu ...

  7. 一个简单的假vue全家桶(vue+vue-router+require)

    首先说明我觉得这是一个比较好理解的vue全家桶(虽然是假的),模块化也是用require来做的,而且如果后期有必要压缩我也会用gulp来做 1.依赖个个本地模块,require只是用来载入page,这 ...

  8. Vue 全家桶 + Electron 开发的一个跨三端的应用

    代码地址如下:http://www.demodashi.com/demo/11738.html GitHub Repo:vue-objccn Follow: halfrost · GitHub 利用 ...

  9. Vue全家桶了解一下(待补充)

    vue全家桶了解一下 一.vue+vue-router+vuex+axios1.vue:使用vue-cli,生成最基本的vue项目2.vue-router:vue项目中的路由管理插件3.vuex:vu ...

  10. 升级vue全家桶过程记录

    背景 如果你使用了element-ui的el-tabs组件,并且想要单独升级element-ui至2.10.0,你会发现,使用了el-tabs组件的页面只要打开就卡死.原因是element-ui~2. ...

随机推荐

  1. Rocket - diplomacy - Node相关类

    https://mp.weixin.qq.com/s/BvK3He3GWon8ywG8Jdmcsg   介绍Node相关的类.   ​​   1. BaseNode   BaseNode是所有节点类的 ...

  2. LeetCode 73,为什么第一反应想到的解法很有可能是个坑?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode第42篇文章,我们来看看LeetCode第73题矩阵置零,set matrix zeroes. 这题的难度是Mediu ...

  3. 【Mybatis】mybatis3入门

    mybatis简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可 ...

  4. break 与 continue 的作用 详解

    1.break 用break语句可以使流程跳出switch语句体,也可以用break语句在循环结构终止本层循环体,从而提前结束本层循环. 使用说明: (1)只能在循环体内和switch语句体内使用br ...

  5. Python环境搭建—安利Python小白的Python和Pycharm安装详细教程

    人生苦短,我用Python.众所周知,Python目前越来越火,学习Python的小伙伴也越来越多.最近看到群里的小伙伴经常碰到不会安装Python或者不知道去哪下载Python安装包等系列问题,为了 ...

  6. Java实现 蓝桥杯VIP 算法训练 JAM计数法

    题目描述 Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小 写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文 ...

  7. Java实现 LeetCode 485 最大连续1的个数

    485. 最大连续1的个数 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数 ...

  8. java实现金额组合

    某财务部门结账时发现总金额不对头.很可能是从明细上漏掉了某 1 笔或几笔. 如果已知明细账目清单,能通过编程找到漏掉的是哪 1 笔或几笔吗? 如果有多种可能,则输出所有可能的情况. 我们规定:用户输入 ...

  9. java实现第六届蓝桥杯立方尾不变

    立方尾不变 立方尾不变 有些数字的立方的末尾正好是该数字本身. 比如:1,4,5,6,9,24,25,- 请你计算一下,在10000以内的数字中(指该数字,并非它立方后的数值),符合这个特征的正整数一 ...

  10. lambda表达式操作DataTable番外篇

    using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Text; ...