浅谈针对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 相关文章推荐
在多个页面使用同一个HTML片段《续》
Mar 04 Javascript
jquery 图片上传按比例预览插件集合
May 28 Javascript
简单常用的幻灯片播放实现代码
Sep 25 Javascript
jquery中交替点击事件的实现代码
Feb 14 Javascript
JS和函数式语言的三特性
Mar 05 Javascript
JavaScript匿名函数之模仿块级作用域
Dec 12 Javascript
js时间控件只显示年月
Jan 08 Javascript
jQuery仿IOS弹出框插件
Feb 18 Javascript
微信小程序 页面传值详解
Mar 10 Javascript
JS简单判断滚动条的滚动方向实现方法
Apr 28 Javascript
微信小程序 页面滑动事件的实例详解
Oct 12 Javascript
jQuery实现弹出层效果
Dec 10 jQuery
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
经典的星际争霸,满是回忆的BGM
2020/04/09 星际争霸
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
2020/01/23 PHP
javascript 学习之旅 (1)
2009/02/05 Javascript
javascript中onclick(this)用法介绍
2013/04/19 Javascript
巧用局部变量提升javascript性能
2014/02/24 Javascript
探究Javascript模板引擎mustache.js使用方法
2016/01/26 Javascript
js实现(全选)多选按钮的方法【附实例】
2016/03/30 Javascript
JavaScript继承学习笔记【新手必看】
2016/05/10 Javascript
数据结构中的各种排序方法小结(JS实现)
2016/07/23 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
bootstrap3 dialog 更强大、更灵活的模态框
2017/04/20 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
JavaScript中如何判断一个值的类型
2017/09/15 Javascript
javascript设计模式 ? 访问者模式原理与用法实例分析
2020/04/26 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
[05:05]DOTA2亚洲邀请赛 战队出场仪式
2015/02/07 DOTA
[04:26]DOTA2上海特锦赛小组赛第二日 TOP10精彩集锦
2016/02/27 DOTA
[42:20]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python使用QQ邮箱发送Email的方法实例
2017/02/09 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
2018/03/02 Python
详解Django+Uwsgi+Nginx的生产环境部署
2018/06/25 Python
python3爬虫怎样构建请求header
2018/12/23 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
2019/06/24 Python
Python OpenCV图像指定区域裁剪的实现
2019/10/30 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
python将YUV420P文件转PNG图片格式的两种方法
2021/01/22 Python
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
汽车专业大学生职业生涯规划范文
2014/01/07 职场文书
电子工程求职信
2014/07/17 职场文书
财政局党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
酒店保洁员岗位职责
2015/02/26 职场文书
2015年汽车销售工作总结
2015/04/07 职场文书
暑期家教宣传单
2015/07/14 职场文书
公司会议开幕词
2016/03/03 职场文书
解决pytorch-gpu 安装失败的记录
2021/05/24 Python