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. Chisel3 - Tutorial - ShiftRegister

    https://mp.weixin.qq.com/s/LKiXUgSnt3DzgFLa9zLCmQ   简单的寄存器在时钟的驱动下,逐个往下传值.   参考链接: https://github.com ...

  2. MySQL 高级—— Join 、索引 、优化

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.Join 查询 1.SQL执行顺序(一般情况下) 1.1 手写顺序: SELECT DISTINCT ...

  3. Java实现 LeetCode 730 统计不同回文子字符串(动态规划)

    730. 统计不同回文子字符串 给定一个字符串 S,找出 S 中不同的非空回文子序列个数,并返回该数字与 10^9 + 7 的模. 通过从 S 中删除 0 个或多个字符来获得子字符序列. 如果一个字符 ...

  4. Java实现 洛谷 P1159 排行榜

    输入输出样例 输入 #1 5 HIGHHOPES UP LOWFEELINGS UP UPANDDOWN DOWN IAMSTILLSTANDING DOWN FOOLINGAROUND DOWN 输 ...

  5. java代码(10) ---Java8 Map中的computeIfAbsent方法

    Map中的computeIfAbsent方法 一.案例说明 1.概述 在JAVA8的Map接口中,增加了一个computeIfAbsent,此方法签名如下: public V computeIfAbs ...

  6. java代码(9) ---guava之Lists、Maps

     guava之Lists.Maps 谷歌提供了guava包里面有很多的工具类,Lists和Maps集合工具,集合操作做了些优化提升 一.概述 1.静态工厂方法 (1)Guava提供了能够推断泛型的静态 ...

  7. Linux 文件系统属性chattr权限

    chattr命令 格式:chattr [+-=] [选项] 文件或目录名,其中,+表示增加权限,-表示删除权限,=表示等于某权限(对超级用户root也有用),比如:chattr +i /project ...

  8. Grafana邮箱告警

    1.grafana-server 配置 smtp 服务器 vim /etc/grafana/grafana.ini #修改一下内容 ################################## ...

  9. yii2中的场景使用

    下面给大家介绍一下 yii2.0 场景的使用.小伙多唠叨一下了,就是担心有的人还不知道,举个简单的例子,现在在 post表里面有 title image content 三个的字段,当我创建一个 po ...

  10. sprintf 会自动追加’\0’至字符串末尾

    #define LEN_SERIAL_NUMBER (12) void C_CosemObjMeterInfo::SetSerialNum(U08 u08MeterId, U64 u64SerialN ...