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

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

问题

假如有个组件 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. ## 本篇文章对linux常用的一些命令做一下总结,如有需要补充以及不懂得地方,请在下方留言 适合于linux初学者,以及对命令掌握不牢的用来备忘

    本篇文章对linux常用的一些命令做一下总结,如有需要补充以及不懂得地方,请在下方留言 适合于linux初学者,以及对命令掌握不牢的用来备忘一,磁盘管理1.显示当前目录位置 pwd2.切换目录 cd ...

  2. javaweb + websocket实现客户端

    最近需要完成一个javaweb项目,但是没有和数据库连接而是通过websocket通讯实现和服务器端数据交互.我搜了好多,网上大部分都是通过页面websocket连接本地服务器或连接异地服务器,但是这 ...

  3. 通过Hutool 调用远程API接口(POST/GET)

    背景:需要调用第三方接口,开启某项任务,用Hutool代替了HttpClient 调用第三方接口,简单粗暴. 代码如下: import java.util.Date; import org.apach ...

  4. jQuery内容过滤选择器与子元素过滤选择器用法实例分析

    jQuery选择器内容过滤 一.:contains(text) 选择器::contains(text)描述:匹配包含给定文本的元素返回值:元素集合 示例: ? 1 2 $("div.mini ...

  5. Git日常须知

    基本操作: git init 初始化环境 git add . 管理文件 git status 查看状态 git diff 文件名 查看修改内容 git commit -m '' 提交文件 git lo ...

  6. 关于图片适配不同尺寸的image View(实战)

    分享人:广州华软 佐罗 一. 前言 在前端开发过程中,设计稿中往往只提供一张图片,但是app内需要用到的尺寸各种各样. 同时图片不仅是信息的直接表达,也会为网站起到美观点缀的作用,图片的变形.过分裁切 ...

  7. Git安装教程(windows)

    Git是当今最流行的版本控制软件,它包含了许多高级工具,这里小编就讲一下Git的安装. 下载地址:https://git-scm.com/downloads 首先如下图:(点击next) 第二步:文件 ...

  8. (一) Keras 一元线性回归

    视频学习来源 https://www.bilibili.com/video/av40787141?from=search&seid=17003307842787199553 笔记 环境为 an ...

  9. Centos6搭建vsftpd

    CentOS 6.5下安装Vsftp,虚拟用户一.安装:1.安装Vsftpd服务相关部件:[root@localhost ~]# yum install vsftpd*Loaded plugins: ...

  10. iBatis第二章:搭建一个简单的iBatis开发环境

    使用 iBatis 框架开发的基本步骤如下:1.新建项目(iBatis是持久层框架,可以运用到java工程或者web工程都可以) 这里我们建立一个 web 工程测试. 2.导入相应的框架 jar 包 ...