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

3.8.1.动态路由匹配

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

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

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

  1. <template>
  2. <div class="page">
  3. <router-link :to="'/user/'+item.id" v-for="(item, index) in userList" :key="index">{{item.username}}</router-link>
  4. </div>
  5. </template>
  6. <script type="text/javascript">
  7. let userData = [
  8. {
  9. id: '1',
  10. username: 'nodeing1',
  11. level: 'vip1'
  12. },
  13. {
  14. id: '2',
  15. username: 'nodeing2',
  16. level: 'vip1'
  17. },
  18. {
  19. id: '3',
  20. username: 'nodeing3',
  21. level: 'vip2'
  22. },
  23. {
  24. id: '4',
  25. username: 'nodeing4',
  26. level: 'vip3'
  27. }]
  28. export default {
  29. data () {
  30. return {
  31. userList: userData
  32. }
  33. },
  34. components: {
  35. }
  36. }
  37. </script>
  38. <style scoped>
  39. a{
  40. display: inline-block;
  41. padding: 20px 60px;
  42. text-decoration: none;
  43. }
  44. </style>

路由配置:

  1. routes: [
  2. {
  3. path: '/user/:id?',
  4. component: User
  5. }
  6. ]

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

方式1: 使用 beforeRouteUpdate 钩子函数

  1. <template>
  2. <div class="page">
  3. <router-link :to="'/user/'+item.id" v-for="(item, index) in userList" :key="index">{{item.username}}</router-link>
  4. <hr>
  5. <h3>用户名: {{userInfo.username}}</h3>
  6. <h3>会员级别: {{userInfo.level}}</h3>
  7. <h3>id: {{userInfo.id}}</h3>
  8. </div>
  9. </template>
  10. <script type="text/javascript">
  11. let userData = [
  12. {
  13. id: '1',
  14. username: 'nodeing1',
  15. level: 'vip1'
  16. },
  17. {
  18. id: '2',
  19. username: 'nodeing2',
  20. level: 'vip1'
  21. },
  22. {
  23. id: '3',
  24. username: 'nodeing3',
  25. level: 'vip2'
  26. },
  27. {
  28. id: '4',
  29. username: 'nodeing4',
  30. level: 'vip3'
  31. }]
  32. export default {
  33. data () {
  34. return {
  35. userList: userData,
  36. userInfo: {}
  37. }
  38. },
  39. components: {
  40. },
  41. beforeRouteUpdate (to, from, next) {
  42. this.userInfo = this.userList.filter((item) => to.params.id === item.id)[0]
  43. }
  44. }
  45. </script>
  46. <style scoped>
  47. a{
  48. display: inline-block;
  49. padding: 20px 60px;
  50. text-decoration: none;
  51. }
  52. </style>

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

  1. watch: {
  2. $route () {
  3. console.log(this.$route)
  4. }
  5. }

路由信息对象$route

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

3.8.2.路由组件传参

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

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

  1. routes: [
  2. {
  3. path: '/user/:id?',
  4. component: User,
  5. props: true
  6. }
  7. ]

在组件中使用props的值

  1. <template>
  2. <div class="page">
  3. <router-link :to="'/user/'+item.id" v-for="(item, index) in userList" :key="index">{{item.username}}</router-link>
  4. <hr>
  5. <button @click="fn">显示信息</button>
  6. <h3>用户名: {{userInfo.username}}</h3>
  7. <h3>会员级别: {{userInfo.level}}</h3>
  8. <h3>id: {{userInfo.id}}</h3>
  9. </div>
  10. </template>
  11. <script type="text/javascript">
  12. let userData = [
  13. {
  14. id: '1',
  15. username: 'nodeing1',
  16. level: 'vip1'
  17. },
  18. {
  19. id: '2',
  20. username: 'nodeing2',
  21. level: 'vip1'
  22. },
  23. {
  24. id: '3',
  25. username: 'nodeing3',
  26. level: 'vip2'
  27. },
  28. {
  29. id: '4',
  30. username: 'nodeing4',
  31. level: 'vip3'
  32. }]
  33. export default {
  34. data () {
  35. return {
  36. userList: userData,
  37. userInfo: {}
  38. }
  39. },
  40. components: {
  41. },
  42. props: ['id'],
  43. methods: {
  44. fn () {
  45. let id = this.id
  46. this.userInfo = this.userList.filter((item) => id === item.id)[0]
  47. console.log(this.userInfo)
  48. }
  49. }
  50. }
  51. </script>
  52. <style scoped>
  53. a{
  54. display: inline-block;
  55. padding: 20px 60px;
  56. text-decoration: none;
  57. }
  58. </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. 一:HTTP协议解析

    一:HTTP协议解析 1.HTTP协议即超文本传输协议,是一种详细规定了浏览器和万维网服务器之间互相通信的规则,他是万维网交换信息的基础,它允许将HTML(超文本标记语言)文档从web服务器传送到we ...

  2. Java 第十一届 蓝桥杯 省模拟赛十六进制转换成十进制

    问题描述 请问十六进制数1949对应的十进制数是多少?请特别注意给定的是十六进制,求的是十进制. 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一个整数,在提交答案时只填写这 ...

  3. Java 第十一届 蓝桥杯 省模拟赛 小明植树(DFS)

    小明植树 题目 问题描述 小明和朋友们一起去郊外植树,他们带了一些在自己实验室精心研究出的小树苗. 小明和朋友们一共有 n 个人,他们经过精心挑选,在一块空地上每个人挑选了一个适合植树的位置,总共 n ...

  4. Java实现蓝桥杯模拟空地长草

    问题描述 小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1. 小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地. 这些草长得很快,每个月,草都会向外长出一 ...

  5. Java实现 蓝桥杯VIP 算法提高 色盲的民主

    算法提高 色盲的民主 时间限制:1.0s 内存限制:256.0MB  色盲的民主 问题描述 n个色盲聚在一起,讨论一块布的颜色.尽管都是色盲,却盲得各不相同.每个人都有自己的主张,争论不休.最终,他 ...

  6. Linux权限管理命令chmod详解

    命令chmod详解 命令chmod(英文原意:change permissions mode of a file),所在路径为: 可以看到,它的路径为:/usr/bin/chmod,因此,它的执行权限 ...

  7. JSP+SSM+Mysql实现的学生成绩管理系统

    项目简介 项目来源于:https://gitee.com/z77z/StuSystem 本系统是基于JSP+SSM+Mysql实现的学生成绩管理系统.主要实现的功能有教师管理.学生管理.课程管理.学生 ...

  8. 3.keras-简单实现Mnist数据集分类

    keras-简单实现Mnist数据集分类 1.载入数据以及预处理 import numpy as np from keras.datasets import mnist from keras.util ...

  9. Vue点击改变属性(改变文字颜色)

    <template> <div class="tab-control"> <div v-for="(item , index) in tit ...

  10. PMBOK 基础知识(1)

    启动.结束过程 项目管理计划 第一章  引论 第2章项目运行环境 第3章 项目经理的角色 第4章 项目整合管理 第5章 项目范围管理 第6章 项目进度管理 第7章 项目成本管理 第8章 项目质量管理  ...