当路由到某个组件时,由于组件会复用,所以生命周期函数不会再次执行,

如果这个组件是模板组件,靠传入不同数据来显示的.那么,可能会发生参数变化了但页面数据却不变化.

问题

假如有个组件 info.vue

路由path如下

1. /user/info/23  // 23是参数,下面34也是参数

2. /user/info/34

希望通过参数来刷新组件页面数据.刷新数据的方法在Vue生命周期函数的created方法里调用.

当改变参数时,页面并没有变化.因为,路由只是参数变化了,path并没变化,组件还是这个info.vue组件.

此时,组件复用,生命周期函数不再执行,所以刷新数据的方法也就没机会执行了.

原因见管网描述 https://router.vuejs.org/zh/guide/advanced/navigation-guards.html#%E5%85%A8%E5%B1%80%E5%89%8D%E7%BD%AE%E5%AE%88%E5%8D%AB

研究

官网上推荐使用watch,监控路由变化,将取数据方法在watch中调用,

或者是 beforeRouteUpdate 这个路由生命周期函数,https://router.vuejs.org/zh/guide/advanced/navigation-guards.html#%E7%BB%84%E4%BB%B6%E5%86%85%E7%9A%84%E5%AE%88%E5%8D%AB

经过测试,当路由的参数变化之后,数据刷新了,

但是出了个新问题,就是当路由改变时,再回到改变前的路由时,又不刷新了.

假设当前路由是

/user/info/34

跳到路由

/home

然后再跳回来到

/user/info/34

这里,页面又不动了.

经过研究发现,配合使用这两个路由周期函数,能解决这问题

beforeRouteEnter 和 beforeRouteUpdate
前者在进入路由所在组件时(路由发生变化)执行,
后者在路由的参数变化时执行
 
在这两个方法里执行刷新数据,两者时机对应两种切换路由操作.经过实践,要两者配合才行.否则会有bug.
如果只用其一,那么,当路由不变,只变参数时,就刷新不了列表
如果只用其二,那么,当路由地址变化时,就刷新不了列表
 
最后,没有使用watch,而是使用了下面的方法

总结

这两个路由周期函数的时机正好是在路由不变参数变化时执行和路由变化时执行.所以能解决上述BUG.

// 这个方法不用调用this,因为此时机组件还没生成,所以无this
// 要调用刷新数据方法时,需要写在next回调里,
// next是在组件生成后会调用
beforeRouteEnter(to: any, from: any, next: any) {
next((vm: any) => {
vm.updateList(to.params.id);
});
} // 这个方法是路由不变,只变参数时执行
private beforeRouteUpdate(to: any, from: any, next: any) {
this.updateList(to.params.id);
next();
} // 更新数据方法
private updateList(userId: string) { }

vue路由参数变化刷新数据的更多相关文章

  1. 【问题】VUE 同一页面路由参数变化,数据不刷新

    依赖路由的params参数获取写在created生命周期里面,因为相同路由二次甚至多次加载的关系 没有达到监听,退出页面再进入另一个页面并不会运行created组件生命周期,导致数据还是第一次进入的数 ...

  2. vue 路由参数变化,页面不更新的问题

    监控$route 在vue项目中,假使我们在同一个路由下,只是改变路由后面的参数值,如果不监听路由参数值的变化,页面无数据刷新,需手动刷新浏览器,这样做就不是我们的预期效果. 举例:当前路由为  /p ...

  3. VUE 路由参数改变重新刷新数据

    VUE 路由参数改变重新刷新数据 App.vue 里面使用路由,然后通过App.vue文件中的搜索功能搜索刷新路由文件中的列表. 修改 index.js 文件 首先在路由文件 index.js 文件中 ...

  4. Vue路由参数

    vue路由参数 1.参数router-link vue.prototype.xxx = {add:fn}`所有组件中,使用this.xxx就能拿到这个对象2.查询字符串 (1)配置: :to=&quo ...

  5. vue中监听路由参数变化

    今天遇到一个这样的业务场景:在同一个路由下,只改变路由后面的参数值, 比如在这个页面  /aaa?id=1 ,在这个页面中点击一个按钮后 跳转到 /aaa?id=2 , 但从“/aaa?id=1”到“ ...

  6. vue路由传参刷新丢失

    没有系统学习过vue,以前使用路由传参都是直接this.$router.push({name:'main',params:{'id': 123}})的,没有在路由定义中配置参数,如下: router: ...

  7. vue路由参数的获取、添加和替换

    获取路由参数 getUrlKey(name){//获取url 参数 return decodeURIComponent((new RegExp('[?|&]'+name+'='+'([^&am ...

  8. VUE 同一页面路由参数变化,视图不刷新的解决方案

    1.监听路由处理 watch: { $route(to, from) { // 逻辑 // 重新调用数据接口 } }, 2.beforeRouteUpdate导航守卫 路由更新时触发 beforeRo ...

  9. vue同一个路由,但参数发生变化,页面不刷新的问题(vue监听路由参数变化重新渲染页面)

    watch: { $route: function(newVal, oldVal) { console.log(oldVal); //oldVa 上一次url console.log(newVal); ...

随机推荐

  1. MySQL 笔记整理(13) --为什么数据表删掉一半,表文件大小不变?

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 13) --为什么数据表删掉一半,表文件大小不变? 我们还是以MySQL ...

  2. c# Lambda操作类封装

    using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; us ...

  3. 学习笔记—JDBC

    JDBC的概念 JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言 ...

  4. Cookie 数据浅谈

    Cookie 是一些数据, 存储于你电脑上的文本文件中. 当 web 服务器向浏览器发送 web 页面时,在连接关闭后,服务端不会记录用户的信息.   Cookie 的作用就是用于解决 "如 ...

  5. 【20190220】HTTP-知识点整理:TCP/IP与HTTP

    TCP/IP是互联网相关的各类协议族的总称,HTTP属于它内部的一个子集. 一.TCP/TP的分层管理 1. 应用层 应用层决定了向用户提供应用服务时通信的活动.TCP/IP 协议族内预存了各类通用的 ...

  6. su和sudo的区别

    首先来说一下su 然后是sudo

  7. Vue源码实现

    链接1:https://www.cnblogs.com/tiedaweishao/p/8933153.html 链接2:https://www.cnblogs.com/erbingbing/p/647 ...

  8. json-sever 配置与应用

    先安装 node.js. 全局安装 json-server: npm install json-server -g 检查是否安装成功: json-server -h 安装好后,json-server的 ...

  9. Jmeter调用自定义jar包

    一. 场景 在测试过程中, 可能需要调用第三方jar包来生成测试数据或者使用java工具类来实现业务场景, 普遍的做法是手动调用jar包, 再把这些值赋给jmeter中的某个参数, 以满足业务测试需求 ...

  10. Git 密钥对处理

    生成密钥对: ssh-keygen -t rsa cd .ssh ls      id_rsa          私钥      id_rsa.pub   公钥