同一路由应该不叫跳转了吧,就先叫刷新好了。

需求及问题

今天做web课设有这样一个需求

在导航栏中一项叫做教师队伍一级菜单下,有三个二级菜单,分别为教授、副教授、讲师。这三个二级菜单分别对应一个页面。但是由于显示的排版相同,只是教师信息不同,故想用同一页面,通过选择不同的菜单,传入不同的参数,显示不同的信息。

刚开始的想法是,在实例创建阶段,也就是created阶段将导航栏传给子组件的参数获取到

父组件:


this.$router.push({
path: '/jsjj',
query:{
id:index
}
})

子组件:


created(){
this.id = this.$route.query.id;
console.log(this.id);
},

但是我错了。当第一次跳转复用路由时,created确实可以获取到父组件传递的值,但当带参数刷新当前路由时,created没有被调用。原因是组件已经被创建。

然后尝试了在 Vue 生命周期各个步骤,只有在创建前后,挂载前后可以获取到参数。同样,当路由刷新时又获取不到了。

这可怎么办。后来查阅了度娘,才想起来还有 Vue Router 导航守卫 这么个东西。导航即路由正在发生变化。(哎,还是代码敲得少)

文档中明确说到:

记住参数或查询的改变并不会触发进入/离开的导航守卫。你可以通过观察 $route 对象来应对这些变化,或使用 beforeRouteUpdate 的组件内守卫。

所以要用 beforeRouteUpdate 这个方法来获取当前刷新路由的参数:


beforeRouteUpdate(to, from, next){
this.id = to.query.id;
console.log(this.id);
next();
}

其中 next() 方法一定要加,否则路由跳转不会向下执行。

然后又遇到问题,只用 beforeRouteUpdate 方法,当第一次跳转到这个复用路由的时候,又获取不到参数了,原因是只有刷新路由时才会调用这个方法,当第一次进入到路由时不会调用这个方法,所以又获取不到。

那么在第一次跳转进来的时候再获取一下不就好了嘛~把我之前写的 created 方法和 beforeRouteUpdate 方法结合一下,大功告成!


Create(){
this.id = this.$route.query.id;
console.log('a');
console.log(this.id);
},
beforeRouteUpdate(to, from, next){
this.id = to.query.id;
console.log('b');
console.log(this.id);
next();
// this.id = this.$route.params.id;
},

但是这样写总感觉有点难受,毕竟一个是 Vue 的生命周期函数,一个是 Vue Router 的类似钩子函数的函数。

然后发现其实也可以用 Vue Router 的 beforeRouteEnter 函数来实现 Created 里的功能。

解决办法

父组件:


this.$router.push({
path: '/jsjj',
query:{
id:index
}
})

子组件:


beforeRouteEnter(to, from, next){
console.log('g');
console.log(to);
console.log(to.query.id);
next();
},
beforeRouteUpdate(to, from, next){
this.id = to.query.id;
console.log('b');
console.log(this.id);
next();
},

其中还有个问题要注意,一定要使用 query 方式传参,params 方式传餐无效。

强迫症的我得到了解脱!

params 和 query 在路由传值的异同

  1. query 要用 path 来引入,params 要用 name 来引入,接收参数都是类似的,分别是this.$route.query.namethis.$route.params.name。


    this.$router.push({
    name:"detail", // 要对应router.js里面的name名称
    params:{
    name:'nameValue',
    code:10011
    }
    }); // 获取参数
    this.$route.params.name this.$router.push({
    name:"/detail",
    query:{
    name:'nameValue',
    code:10011
    }
    }); // 获取参数
    this.$route.query.name
  2. query 更加类似于我们 ajax 中 get 传参,params 则类似于 post,说的再简单一点,前者在浏览器地址栏中显示参数,后者则不显示:

query:

params:

总结

  • 在路由复用时,分为两个阶段,一个是进入此路由的阶段,也就是 beforeRouteEnter 阶段,另一个是更新路由的阶段,即 beforeRouteUpdate 阶段。
  • 没有区分 Vue 和 Vue Router 的概念,导致在路由上的操作还停留在 Vue 生命周期上。
  • 文档读的不够详细,其实现如今技术上碰到的问题,文档上基本都有写,以后遇事一定要多!看!文!档!!!

原文地址:https://segmentfault.com/a/1190000017306664

同一路由带参刷新,以及params和query两种方式传参的异同的更多相关文章

  1. vue 路由传参 params 与 query两种方式的区别

    初学vue的时候,不知道如何在方法中跳转界面并传参,百度过后,了解到两种方式,params 与 query.然后,错误就这么来了:  router文件下index.js里面,是这么定义路由的: { p ...

  2. python flask学习第2天 URL中两种方式传参

    新创建项目   自己写个url映射到自定义的视图函数 在url中传递参数 app.py from flask import Flask app = Flask(__name__) @app.route ...

  3. Node params和query的Get请求传参

    //1:加载http express框架//2:创建服务器const http = require("http");const express = require("ex ...

  4. C++两种字符串传参构造函数

    第一种: #include"iostream" #include"string" using namespace std; class Motor{ prote ...

  5. Vue路由实现页面跳转的两种方式(router-link和JS)

    Vue.js 路由可以通过不同的 URL 访问不同的内容,实现多视图的单页 Web 应用 1.通过 <router-link> 实现 <router-link> 组件用于设置一 ...

  6. ajax的data传参的两种方式

    ajax的data传参的两种方式 本文为转载. 1.[javascript] view plain copy /** * 订单取消 * @return {Boolean} 处理是否成功 */ func ...

  7. 二十一、springboot之定制URL匹配规则(项目中遇到的问题:get方式传参,带有小数点,被忽略)

    一.问题描述: get方式传参,在传送价格,积分时(带有小数点),debug后台微服务接受到的参数,却不带小数点,如:price是0.55,后台接受后却是0 二.解决 在WebConfiguratio ...

  8. 浅析使用vue-router实现前端路由的两种方式

    关于vue-router 由于最近的项目中一直在使用vue,所以前端路由方案也是使用的官方路由vue-router,之前在angularJS项目中也是用过UI-router,感觉大同小异,不过很显然v ...

  9. vue:子组件通过调用父组件的方法的方式传参

    在本案例中,由于子组件通过调用父组件的方法的方式传参,从而实现修改父组件data中的对象,所以需要啊使用$forceUpdate()进行强制刷新 父组件: provide() { return { s ...

随机推荐

  1. unittest详解(七) 自动生成测试报告

    用例执行完成后,执行结果默认是输出在屏幕上,其实我们可以把结果输出到一个文件中,形成测试报告. unittest自带的测试报告是文本形式的,如下代码: import unittest if __nam ...

  2. Spark译文(三)

    Structured Streaming Programming Guide(结构化流编程指南) Overview(概貌) ·Structured Streaming是一种基于Spark SQL引擎的 ...

  3. HAOI2018简要题解

    大概之后可能会重写一下,写的详细一些? Day 1 T1 简单的背包:DP 分析 可以发现,如果选出了一些数,令这些数的\(\gcd\)为\(d\),那么这些数能且仅能组合成\(\gcd(d,P)\) ...

  4. 堤堤云海外IDC

    http://www.ddyidc.com 堤堤云网络全球互联 堤堤云网络致力为客户提供优质的海外服务器租用服务,各种专线解决方案. 产品分类:服务器租用.IP租用.托管.专线传输.防御.优质回国CN ...

  5. vue项目使用cropperjs制作图片剪裁,压缩组件

    项目中裁剪图片效果 代码部分:(将上传部分 封装成一个组件直接调用当前组件) <template> <div id="demo"> <!-- 遮罩层 ...

  6. 后盾网lavarel视频项目---lavarel多表关联一对多操作实例

    后盾网lavarel视频项目---lavarel多表关联一对多操作实例 一.总结 一句话总结: 1.一对多中多那个部分的数据前端通过json弄到服务器 2.所有通过一操作多的时候,都要用上模型中定义的 ...

  7. spark streaming 1: SparkContex

    StreamingContext 和SparkContex的用途是差不多的,作为spark stream的入口,提供配置.生成DStream等功能. 总体来看,spark stream包括如下模块: ...

  8. Java-线程等待、唤醒与中断

    一.sleep() 与 wait() 两者都会让当前线程进入等待状态.唤醒后都需要等待 CPU 资源,不一定会立即执行.若在等待期间被调用此线程的的 interrupt() 方法,将会产生 Inter ...

  9. ad2014注册出现:注册 - 激活错误 (0015.111)

    将安装包内的(adlmact.dll & adlmact_libFNP.dll)这两个文件取出并覆盖即可.安装包内文件具体位置:在安装包内搜索“adlmact”出现的两个文件“adlmact_ ...

  10. Ubuntu系统下各种报错杂烩(持续更新)

    在Github时报Permanently added the RSA host key for IP address '192.30.252.128' to the list of known hos ...