>>分享Web前端开发技术,并对孙卫琴的《精通Vue.js:Web前端开发技术详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 21762 个阅读者 刷新本主题
 * 贴子主题:  Vue路由传递参数详细说明 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2021-02-04 00:15:51     消息  查看  搜索  好友  邮件  复制  引用

  
前言
最近我跟同事在做一个BI系统,采用前后端分离。整个系统包括数据分析系统、运营支持、系统设置等多个子系统。数据分析系统其实就是做各种数据报表、数据统计、实时数据的系统,这里面其实整个页面就是一个模板,最上面是filter、第二级是统计图、最下面是table数据。所以在数据分析子系统中,只要配置一个路由就可以匹配所有页面,在系统中,我把这个为公用路由。至于公用路由权限如何鉴定其实很简单:获取到用户权限列表后,渲染出所有的权限菜单,但注意每次跳转时一定要进行权限校验,具体原因自行思考。说着有点跑偏了,那么这个公用路由怎么可以匹配多个业务视图呢?(一个路由对应多个业务视图)

     很自然我们就会想通过路由传递参数,但进入到公用数据分析路由中时,组件可以获取路由信息,根据路由信息我们去获取filter\获取图表\获取table数据\当前视图名称,从而渲染出不同的数据分析报表、统计。

     备注:为了减低复杂度,我这里通过传递一个参数(数据请求接口)获取上面的所有数据,也就是通过一个接口把整个页面的数据都获取到,数据结构大致如下:    
{
    viewname: '留存数据',
    filters: [
        {
            ... // 具体filter类型及数据
        }
    ],
    echarts:[
        {
        .... // options
        }
    ],
    tables:[
        {
            ... // 表格数据,表头\数据等
        }
    ]
}

  那么这个时候我们就很清楚我们的业务需求是什么了。接下来我们看下我们队这个数据分析公用路由的配置,如下:    

// 路由配置
{
    path: '',
    component: Layout,
    children: [{
      path: '/data/config/:block/:page',
      component: () => import('@/views/data/common'),
      name: 'common',
      meta: { title: 'common', icon: 'common', noCache: true }
    }]
}
'''
path:中统一规范data/config/:block/:page
所有的参数进入到common组件中,在组件中获取到block\page参数,
然后作为一个api,这个api就是获取当前页面数据的接口。
'''

  分析:
那么这是一种vue中通过路由传递参数的方式,那么我们vue中路由参数传递都有哪些方式呢?这就是我这篇文章详细说明的主题。这个前言有点臭长了,sorry!我们马上进入正文。

Vue路由传参

我们可以先看下官方的文档:路由组件传参,这里面讲述了路由组件传参的所有方式,分别为: 布尔模式、对象模式、函数模式。光看名字还是不能明白,我们接下来结合案例代码一个一个解释一下。

     在讲各种模式传参之前,我们先了解一下路由是如何进行跳转和传递过来的参数是如何在组件中接收的,为什么要先说这些?因为这有利于理解设计者为啥要做这些模式的设计。我们用过的都知道,组件中: 通过this.$router.push进行编程式路由跳转、router-link中的to属性进行路由切换。通过this.$route.params/this.$route.query获取路由传递的参数。特别要留意this.$router和this.$route的区别,你可以把这两个对象打印出来看,或者自行查阅官方说明。

     总结:
1.this,$router.push进行编程式路由跳转
2.router-link进行页面按钮式路由跳转
3.this.$route.params获取路由传递参数
4.this.$route.query获取路由传递参数
5.params和query都是传递参数区别在于params不会再url上显示出现,
并且params参数是路由的一部分,是一定要存在的,否则无法显示视图。
query则是我们通常看到的url后面跟上的?后跟的显示参数

     案例代码:    

<template>
  <div class="hello">
    <label>Hello</label>
    <button type="button" @click="gotoD()">
    查看详细信息1
    </button>
    <router-link
      :to="{path:'/Detail/ckmike', params:{name:'Lily'},query:{sex:'女'},props:{age:18}}"
    >
    查看详细信息2
    </router-link>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data () {
    return {

    }
  },
  methods: {
    gotoD () {
      this.$router.push({path: '/Detail/ckmike', query: {sex: '男'}})
    }
  }
}
</script>
// 路由配置
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Detail from '@/components/Detail'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    },
    {
      path: '/Detail/:name',
      name: 'Detail',
      component: Detail,
      props: {
        age: 21
      }
    }
  ]
})

布尔模式

如果 props 被设置为 true,route.params 将会被设置为组件属性。    

const User = {
  props: ['id'],
  template: '<div>User {{ id }}</div>'
}
const router = new VueRouter({
  routes: [
    { path: '/user/:id', component: User, props: true },

    // 对于包含命名视图的路由,你必须分别为每个命名视图添加 `props` 选项:
    {
      path: '/user/:id',
      components: { default: User, sidebar: Sidebar },
      props: { default: true, sidebar: false }
    }
  ]
})

对象模式

如果 props 是一个对象,它会被按原样设置为组件属性。当 props 是静态的时候有用。    

const router = new VueRouter({
  routes: [
    { path: '/promotion/from-newsletter', component: Promotion, props: { newsletterPopup: false } }
  ]
})

函数模式

你可以创建一个函数返回 props。这样你便可以将参数转换成另一种类型,将静态值与基于路由的值结合等等。    

const router = new VueRouter({
  routes: [
    { path: '/search', component: SearchUser, props: (route) => ({ query: route.query.q }) }
  ]
})

  上面是官方给出的说明文档,更多详细可进入官方文档。

     接下来我们来测试一下params和query有啥区别:    

<template>
  <div class="hello">
    <label>Hello</label>
    <button type="button" @click="gotoD()">
    查看详细信息1
    </button>
    <router-link
      :to="{path:'/Detail', params:{name:'Lily', age: 18},query:{sex:'女'}, props: true}"
    >
    查看详细信息2
    </router-link>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  data () {
    return {

    }
  },
  methods: {
    gotoD () {
      this.$router.push({path: '/Detail', query: {sex: '男'}, params: {name: 'ckmike', age: 21}, props: true})
    }
  }
}
</script>
// 路由配置
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Detail from '@/components/Detail'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    },
    {
      path: '/Detail',
      name: 'Detail',
      component: Detail,
      props: true
    }
  ]
})
// 信息页面
<template>
  <div class="detail">
    <label>详细信息:</label>
    <br>
    <label>姓名:{{name}}</label>
    <br>
    <label>性别:{{sex}}</label>
    <br>
    <label>年龄:{{age}}</label>
  </div>
</template>

<script>
export default {
  name: 'Detail',
  data () {
    return {

    }
  },
  computed: {
    name () {
      return this.$route.params.name
    },
    sex () {
      return this.$route.query.sex
    },
    age () {
      return this.$route.params.age
    }
  }
}
</script>

  点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

     说明:使用path进行跳转时,params是不会被作为route属性传递给组件的。只有query属性会被放入组件属性中。
我们把path换成name来再看:
点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小
说明:使用name进行跳转时,params生效,被传递给组件,页面显示出信息,但是这个params的信息一旦属性页面就会丢失。query不会

     params参数类似于post方式,而query则类似于get方式,一旦路由的props设置为true时,那么组件中刻意通过props拿到参数,这个就是布尔模式。

     如果给props传递一个对象,那么在组件中刻意获取到路由中props的参数,一般用于静态参数,这个不管你在router-link或者router.push改变对应参数值,你获取时都是路由配置中的值。

     总结:
1.params传递参数,需要使用name进行路由跳转,否则无法传递。
2.params传递参数刷新会丢失数据,/router/:id方式上的id除外
3.query显示拼接在url上,刷新不丢失,不是必须有,router/:id方式则必须有id参数,否则无法正确进入视图。
4.props也可以传递参数,但传递的只能是静态参数。



----------------------------
原文链接:https://blog.51cto.com/4837471/2287066

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 javathinker 在 2021-02-15 13:39:43 重新编辑]
  Java面向对象编程-->多线程(下)
  JavaWeb开发-->JavaWeb应用入门(Ⅱ)
  JSP与Hibernate开发-->数据库事务的概念和声明
  Java网络编程-->Java反射机制
  精通Spring-->Vue CLI脚手架工具
  Vue3开发-->Vue Router路由管理器
  不可错过的几种JS优化技巧
  qs.parse()、qs.stringify()、JSON.stringify() 用法及区别
  本以为精通Vue,没想到被前阿里大佬虐哭了......
  JavaScript实现睡眠函数
  CSS的style样式的三种用法
  js判断上传图片大小及尺寸
  HTML表单元素的用法
  JavaScript的HTML DOM Parameter 对象
  JavaScript中的HTML DOM Label 对象
  JavaScript 正则表达式RegExp 对象
  CSS3字体
  JavaScript Array(数组)对象
  JavaScript 对象 的创建和使用
  jQuery Mobile 方向改变事件
  Android 广播接收器(Broadcast Receivers)
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。