Vue路由传递参数详细说明

前言
最近我跟同事在做一个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>

说明:使用path进行跳转时,params是不会被作为route属性传递给组件的。只有query属性会被放入组件属性中。
我们把path换成name来再看:

说明:使用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也可以传递参数,但传递的只能是静态参数。

原文地址:http://blog.51cto.com/4837471/2287066

时间: 2024-10-24 10:19:53

Vue路由传递参数详细说明的相关文章

Vue - 路由传递参数

Vue 2.0  路由传递参数 Vue 路由传递参数 有两种方式: 一.用name传递参数 两步完成用name传值并显示在模板里: 在路由文件src/router/index.js里配置name属性. 1 2 3 4 5 6 7 routes: [ { path: '/', name: 'Hello', component: Hello } ] 模板里(src/App.vue)用$router.name的形势接收,比如直接在模板中显示: 1 <p>{{ $route.name}}</p&

vue-router路由传递参数 + get传值query获取

[步骤] (1)路由配置 或者 (2)传递参数 或者 (3)接收传递参数 或者 [二]步骤小结 [三]参数形式 (1)上面这种是/100形式传递过去 (2)另外还有?count=100的格式,这便是get传值,如下所示,看[四] [四]get传值 除了路由传值,也可以使用get传值 获取get传值 this.$route.query . 原文地址:https://www.cnblogs.com/jianxian/p/11965685.html

Vue路由传参及传参后刷新导致参数消失处理

参考:https://blog.csdn.net/qq_43103581/article/details/82260073(vue 路由传递参数,刷新页面后参数丢失) 项目功能需要,要从列表页跳转到第三方提供的URL上(这里第三方页面我是通过iframe引入在详情页,目的是点击返回时可以通过keepAlive让列表页不刷新,如果不通过iframe直接跳第三方链接,那么返回必然会重新拉取数据),一路百度,刚开始使用 this.$router.push({name:'list', params:{i

Vue 路由规则--传参数

1,query方法去获取参数 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compa

005 vue路由

一:元素的获取 1.ref元素获取 可以通过ref获取DOm,也可以获取组件的引用 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta

vue-router传递参数的几种方式

vue-router传递参数分为两大类 编程式的导航 router.push 声明式的导航<router-link> 编程式的导航router.push 传递参数分为两种类型:字符串,对象 字符串 字符串的方式是直接将路由地址以字符串的方式来跳转,这种方式简单但不能传递参数 this.$router.push("home"); 对象 想要传递参数主要就是以对象的方式来写,分为两种方式:命名路由,查询参数 1.命名路由 命名路由的前提是在注册路由的地方给路由命名如: 命名路由

vue-cli 配置路由之间跳转传递参数

1.有2种方式去传参,如下代码: <template> <div> <div>这里是首页</div> <router-link :to="{name:'reg',params:{user:text}}">注册reg</router-link> <router-link :to="'/reg/'+text">注册reg</router-link> </div>

vue路由获取路由参数

vue路由设置路由参数有2种方式: 1.通过query配置: <router-link :to="{ name:'login',query:{id:1} }">登录</router-link> 通过query配置的路径显示如下: 2.通过params配置: <router-link :to="{ name:'register',params:{'name':'San'} }">注册</router-link> 通过qu

[vue]传递参数与重定向

传递参数与重定向 Main.vue <!--name:对应index.js中router的name, params:传参--> <router-link :to="{name: 'UserProfile', params: {id: 1}}">个人信息</router-link> index.js的router { path: '/user/Profile/:id', name: 'UserProfile', component: UserProfi