同一路由带参刷新,以及params和query两种方式传参的异同

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

需求及问题

今天做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

原文地址:https://www.cnblogs.com/datiangou/p/10121671.html

时间: 2024-09-30 22:55:51

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

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

初学vue的时候,不知道如何在方法中跳转界面并传参,百度过后,了解到两种方式,params 与 query.然后,错误就这么来了:  router文件下index.js里面,是这么定义路由的: { path:"/detail", name:"detail", component:home } 我想用params来传参,是这么写的,嗯~ this.$router.push({ path:"/detail", params:{ name:'nameV

Node params和query的Get请求传参

//1:加载http express框架//2:创建服务器const http = require("http");const express = require("express");var app = express();var server = http.createServer(app);server.listen(8080);//方式一:参数 /user?uid=10&loc=bjapp.get("/user",(req,res

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

Vue.js 路由可以通过不同的 URL 访问不同的内容,实现多视图的单页 Web 应用 1.通过 <router-link> 实现 <router-link> 组件用于设置一个导航链接,切换不同 HTML 内容 使用方法: 简单写法 <router-link to="demo2">demo2</router-link> 使用 v-bind 的写法 <router-link :to="'demo2'">de

C#使用WebClient获取给定地址的内容(POST方式传参)

见下方代码: 1 string url = "https://www.baidu.com";//源地址 2 System.Net.WebClient WebClient = new System.Net.WebClient(); 3 var parameter = "x=7&y=8&z=9";//参数 4 byte[] parameters = Encoding.UTF8.GetBytes(parameter);//UTF8编码 5 WebClien

Hibernate 带参数查询的两种方式

1.使用?通配符 public User validate(String userName, String password) { String hql = "from User u where u.userName = ? and u.password = ?"; User user = null; List<User> list = ht.find(hql, new Object[]{userName, password}); if (list.size()!=0){

PHP生成带logo图像二维码的两种方法

本文主要和大家分享PHP生成带logo图像二维码的两种方法,主要以文字和代码的形式和大家分享,希望能帮助到大家. 一.利用Google API生成二维码Google提供了较为完善的二维码生成接口,调用API接口很简单,以下是调用代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 $urlToEncode="http://www.php.cn"; generateQRfromGoogle($urlToEncode); /**

SpringMVC的五种请求传参方式

1.传统传参方式 方法参数中使用request,通过request.getParameter("参数名"),再封装到bean中 @RequestMapping("/test01") public ModelAndView test01(HttpServletRequest request){ String username = request.getParameter("username"); String password = request.

(尚043) vue_向路由组件传递数据+vue param和query两种传参方式

效果展示: ============================================================================ 应写成下图这种形式: :id为占位 现在是通过什么路径向路由组件传递数据的? 通过请求参数${message.id}传递的 请求参数有两种: 1).Param 2).Query  (?后面,类似于get) ================================================================

React路由安装使用和多种方式传参

安装路由 npm i react-router-dom -S 引入路由 import { BowserRouter as Router, Route, Switch, ... } from "react-router-dom" 整个项目顶层需要用<Router>包裹 并且 <Router>组件内只能有一个直接子级元素 例如: let App = props => (<Router> <div> <Route path=&quo