浅谈针对Vue相同路由不同参数的刷新问题


Posted in Javascript onSeptember 29, 2018

在使用vue和vue-router开发spa应用时,我们会遇到这样一种问题。

当页面跳转时,组件本身并没有发生改变:

// 路由映射关系'/form/:type'
// 当前页面路由/form/shop1
this.$router.push({ name: 'form', params: { type: 'shop2' })

这时我们进行路由跳转后会发现组件并没有刷新,在前一个路由组件的数据都保留了下来,这并不是我们想要的效果。

对于简单的数据更新,我们可以直接监听路由参数并重新获取路由的初始化数据即可,
但是对于有很多子组件需要初始化或者reset的情况,我们还是有必要重新执行组件的生命周期。

针对这种情况可以使用三种方式解决:

1.为相同路由页面的跳转进行中间路由替换,在router上注册beforeEach全局守卫进行拦截,跳转到一个中间路由(例如empty),再从中间过渡路由跳转至要去的路由。

// 全局导航守卫
router.beforeEach((to, from, next) => {
 if (to.name === from.name && to.params.type !== from.params.type) {
  next({ name: 'empty', query: { toPath: to.fullPath } })
 } else {
  next()
 }
})

// 中间过渡路由
let toPath = this.$route.query.toPath
if (this.toPath) {
 this.$router.push({ path: this.toPath })
}

2.使用v-if重新渲染当前页面组件

// html部分
<div>
 <router-view v-if="showRouterView"/>
</div>

// script部分
export default {
 data () {
  return {
   isRouterAlive: true
  }
 },
 methods: {
  reload () {
   this.showRouterView = false
   this.$nextTick(() => (this.showRouterView = true))
  } 
 }
}

这样把方法注册到跟组件上,对于想刷新的组件直接调用reload方法即可。

3.使用vue文档组件绑定的key值来进行强制刷新

vue文档说明了当你需要

  • 完整地触发组件的生命周期钩子
  • 触发过渡

的时候可以利用更新组件绑定的key值来完成更详细的说明

这样直接为组件绑定与路由参数关联的值即可

<MyComponent :key="routeParams" />

综合来看,第三种方式最简单,推荐使用。

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

Javascript 相关文章推荐
分享20多个很棒的jQuery 文件上传插件或教程
Sep 04 Javascript
Javascript 中的 call 和 apply使用介绍
Feb 22 Javascript
如何将JS的变量值传递给ASP变量
Dec 10 Javascript
jquery 表单验证之通过 class验证表单不为空
Nov 02 Javascript
AngularJS 最常用的功能汇总
Feb 17 Javascript
JavaScript实现复制内容到粘贴板代码
Mar 31 Javascript
js原型链与继承解析(初体验)
May 09 Javascript
Node.js的npm包管理器基础使用教程
May 26 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
Jun 12 Javascript
图片懒加载插件实例分享(含解析)
Jan 09 Javascript
详解vue项目中使用token的身份验证的简单实践
Mar 08 Javascript
微信小程序连接服务器展示MQTT数据信息的实现
Jul 14 Javascript
vue init webpack 建vue项目报错的解决方法
Sep 29 #Javascript
详解React之key的使用和实践
Sep 29 #Javascript
vue给组件传递不同的值方法
Sep 29 #Javascript
vue动画之点击按钮往上渐渐显示出来的实例
Sep 29 #Javascript
浅谈vue项目打包优化策略
Sep 29 #Javascript
vue里input根据value改变背景色的实例
Sep 29 #Javascript
4个顶级开源JavaScript图表库
Sep 29 #Javascript
You might like
php 图片加水印与上传图片加水印php类
2010/05/12 PHP
php excel reader读取excel内容存入数据库实现代码
2012/12/06 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
Yii框架表单提交验证功能分析
2017/01/07 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
幻宇的层模拟窗口效果-提供演示和下载
2007/01/20 Javascript
jquery随机展示头像代码
2011/12/21 Javascript
jQuery简单几行代码实现tab切换
2015/03/10 Javascript
jquery实现图片随机排列的方法
2015/05/04 Javascript
详解nodejs与javascript中的aes加密
2016/05/22 NodeJs
JS实现异步上传压缩图片
2017/04/22 Javascript
[08:47]DOTA2每周TOP10 精彩击杀集锦vol.6
2014/06/25 DOTA
[01:10]DOTA2次级职业联赛 - U5战队宣传片
2014/12/01 DOTA
[40:19]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.18
2020/12/19 DOTA
python实现SMTP邮件发送功能
2020/06/16 Python
Python脚本实现12306火车票查询系统
2016/09/30 Python
Python3 加密(hashlib和hmac)模块的实现
2017/11/23 Python
numpy.random.seed()的使用实例解析
2018/02/03 Python
python实现黑客字幕雨效果
2018/06/21 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
2019/07/03 Python
Django 创建/删除用户的示例代码
2019/07/24 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
jupyter note 实现将数据保存为word
2020/04/14 Python
Python openpyxl 插入折线图实例
2020/04/17 Python
简单介绍HTML5中audio标签的使用
2015/09/24 HTML / CSS
日本网路线上商品代购服务:转送JAPAN
2016/08/05 全球购物
泰国折扣酒店预订:Hotels2Thailand
2018/03/20 全球购物
香港连卡佛百货官网:Lane Crawford
2019/09/04 全球购物
公司门卫岗位职责范本
2014/07/08 职场文书
幼儿园八一建军节活动方案
2014/08/27 职场文书
维稳工作承诺书
2015/01/20 职场文书
房地产项目合作意向书
2015/05/08 职场文书
Jupyter notebook 输出部分显示不全的解决方案
2021/04/24 Python
基于Python的EasyGUI学习实践
2021/05/07 Python
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL
Pandas实现DataFrame的简单运算、统计与排序
2022/03/31 Python