使用vue-router在Vue页面之间传递数据的方法


Posted in Javascript onJuly 15, 2019

前言

几周前,我写了关于 Vue 路由的使用和在 Vue 页面导航的文章。这是在应用程序中探索的一个基本例子。

通常,在将导航构建到应用程序中时,您会发现需要将数据从一个页面传递到另一个页面。(不通顺)例如,您遵循 master-detail 模式,其中您有一个数据列表,通过更深入地挖掘可以获得关于列表中特定项的更多信息。

我们将学习如何使用路由和 URL参数以及查询参数在 Vue 页面之间传递数据。

如果你还没有读过我之前的教程或者不熟悉 vue-router 库,我建议你温习一下。

利用 URL 参数在不同页面中传递数据

假设您有一个 web 应用程序,它显示从某个数据库获得的用户列表。这个列表可能只包含姓名信息,但是数据库中的数据可能包含更多的信息,例如地址、电话等。

在典型的场景中,我们使用主键或其他标识符维护这个用户列表,并用于在请求详细信息时查询数据库时。这样的值可非常合适作为 URL 参数在不同页面传递。

为此,目标页面需要获取到 URL 参数。在前面的教程基础上,我们可以将项目 src/router/index.js 中的文件更改为如下所示

import Vue from 'vue'
import Router from 'vue-router'
import Page1 from '@/components/page1'
import Page2 from '@/components/page2'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: "/",
      redirect: {
        name: "Page1"
      }
    },
    {
      path: '/page1',
      name: 'Page1',
      component: Page1
    },
    {
      path: '/page2/:id',
      name: 'Page2',
      component: Page2
    }
  ]
})

注意,Page2 的路由中路径中包含一个 :id。这个冒号表示我们正在处理一个变量

打开项目src/components/page1.vue文件,将<template>块改为下面的样子,获取 URL 中的参数

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <router-link :to="{ name: 'Page2', params: { id: 1234 } }">Navigate to Page2</router-link>
  </div>
</template>

在上面的代码片段中,我们选择将参数传递给指定的路由。该 id 将匹配先前在路由定义的参数。您可以定义多个参数,但是要小心,因为它们很容易造成问题

在接收端,我们需要弄清楚如何获取和处理路由参数。

打开 src/components/page2.vue 文件:

<template>
  <div class="hello">
    <h1>{{ msg }}, your id is {{ id }}</h1>
    <a style="cursor: pointer; text-decoration: underline" v-on:click="navigate()">Navigate to Page1</a>
  </div>
</template>

<script>
  import router from '../router'

  export default {
    name: 'Page2',
    data () {
      return {
        id: 0,
        msg: 'Hey Nic Raboy'
      }
    },
    created() {
      this.id = this.$route.params.id;
    },
    methods: {
      navigate() {
        router.go(-1);
      }
    }
  }
</script>

<style scoped>
  h1, h2 {
    font-weight: normal;
  }

  ul {
    list-style-type: none;
    padding: 0;
  }

  li {
    display: inline-block;
    margin: 0 10px;
  }

  a {
    color: #42b983;
  }
</style>

与之前的例子相比,我们在上面的组件增加了一些内容

首先,您将注意到我们正在data方法中初始化一个id值。这是为了防止出现任何未定义的错误

每次创建组件时,Vue 都会调用其生命周期钩子的 Created 方法。在Created方法中,我们从$route获得传递的id值,并将其设置为局部变量。这个本地id变量在<template>块中

但是,如果我们需求传递更复杂的参数或者是可选参数,这时候就该换一种方式了

利用 Query 参数传递数据

Vue 中的查询参数与路由器参数的工作原理类似,但它们不是必需的,而且你并不需要事先修改路由

回到之前的src/components/page1.vue 文件上,其中 <template> 块如下:

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <router-link :to="{ name: 'Page2', params: { id: 1234 }, query: { debug: true }}">Navigate to Page2</router-link>
  </div>
</template>

注意,这一次我们将传递URL或路由器参数以及一组新的Query参数。这些Query参数可以是任意数量的键值对

我们来看一下在接受端怎么处理这些 Query 参数

打开src/components/page2.vue 文件, 修改<script> 如下:

<script>
  import router from '../router'

  export default {
    name: 'Page2',
    data () {
      return {
        debug: false,
        id: 0,
        msg: 'Hey Nic Raboy'
      }
    },
    created() {
      this.id = this.$route.params.id;
      if(this.$route.query.debug) {
        this.debug = this.$route.query.debug;
      }
    },
    methods: {
      navigate() {
        router.go(-1);
      }
    }
  }
</script>

就像使用路由器参数一样,我们在 data 方法中初始化了一个占位符变量。在Created方法中,我们检查Query参数中是否存在 debug 参数,如果存在,将其设置为本地变量

<template>
  <div class="hello">
    <h1>{{ msg }}, your id is {{ id }}</h1>
    <p>Debug mode is currently set to {{ debug }}</p>
    <a style="cursor: pointer; text-decoration: underline" v-on:click="navigate()">Navigate to Page1</a>
  </div>
</template>

在上面的<template> 块中,我们展示debug变量

总结

本文你学到了如何使用 URL 参数和Query参数在 Vue 应用程序中的路由之间传递数据。如果你没有读过我上一篇关于页面导航的文章,你看到的一些东西可能没有多大意义。如果你还没有看过,我建议你去看看

via: https://www.thepolyglotdeveloper.com/2017/11/pass-data-between-routes-vuejs-web-application/

译者:Alex1996a

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 获取当前时间戳的代码
Aug 05 Javascript
javascript中callee与caller的用法和应用场景
Dec 08 Javascript
extjs每个组件要设置唯一的ID否则会出错
Jun 15 Javascript
JS的location.href跳出框架打开新页面的方法
Sep 04 Javascript
jQuery+ajax中getJSON() 用法实例
Dec 22 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
Dec 29 Javascript
jQuery中unwrap()方法用法实例
Jan 16 Javascript
基于JS实现textarea中获取动态剩余字数的方法
May 25 Javascript
JS使用单链表统计英语单词出现次数
Jun 16 Javascript
js设置和获取自定义属性的方法
Oct 20 Javascript
jquery中封装函数传递当前元素的方法示例
May 05 jQuery
vue实例的选项总结
Jun 09 Javascript
微信小程序在其他页面监听globalData中值的变化
Jul 15 #Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
Jul 15 #Javascript
微信小程序全局变量改变监听的实现方法
Jul 15 #Javascript
vue draggable resizable 实现可拖拽缩放的组件功能
Jul 15 #Javascript
微信小程序如何使用canvas二维码保存至手机相册
Jul 15 #Javascript
如何给element添加一个抽屉组件的方法步骤
Jul 14 #Javascript
详解vuex的简单todolist例子
Jul 14 #Javascript
You might like
用cookies来跟踪识别用户
2006/10/09 PHP
php对二维数组按指定键值key排序示例代码
2013/11/26 PHP
destoon整合ucenter后注册页面不跳转的解决方法
2014/06/21 PHP
Zend Framework教程之模型Model用法简单实例
2016/03/04 PHP
php中10个不同等级压缩优化图片操作示例
2016/11/14 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
初学Javascript的一些总结
2008/11/03 Javascript
jQuery Dialog 弹出层对话框插件
2010/08/09 Javascript
ExtJs Excel导出并下载IIS服务器端遇到的问题
2011/09/16 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
2013/08/29 Javascript
js中prototype用法详细介绍
2013/11/14 Javascript
初始Nodejs
2014/11/08 NodeJs
Node.js中安全调用系统命令的方法(避免注入安全漏洞)
2014/12/05 Javascript
基于JavaScript实现瀑布流布局(二)
2016/01/26 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
JavaScript html5利用FileReader实现上传功能
2020/03/27 Javascript
js实现颜色阶梯渐变效果(Gradient算法)
2017/03/21 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
详解webpack + react + react-router 如何实现懒加载
2017/11/20 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
[02:30]DOTA2英雄基础教程 暗影恶魔
2013/12/17 DOTA
python通过函数属性实现全局变量的方法
2015/05/16 Python
django请求返回不同的类型图片json,xml,html的实例
2018/05/22 Python
Python根据文件名批量转移图片的方法
2018/10/21 Python
树莓派用python中的OpenCV输出USB摄像头画面
2019/06/22 Python
python如何将两张图片生成为全景图片
2020/03/05 Python
欧洲著名的二手奢侈品网站:Vestiaire Collective
2020/03/07 全球购物
什么是反射
2012/03/17 面试题
会计专业毕业生自我评价
2013/09/25 职场文书
纪念九一八事变83周年国旗下讲话稿
2014/09/15 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
中学生旷课检讨书2篇
2014/10/09 职场文书
2015新员工试用期工作总结
2014/12/12 职场文书
一年级语文上册复习计划
2015/01/17 职场文书
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android