浅谈针对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 相关文章推荐
JQuery上传插件Uploadify使用详解及错误处理
Apr 27 Javascript
js去除重复字符串两种实现方法
Jan 09 Javascript
5分钟理解JavaScript中this用法分享
Nov 09 Javascript
jQuery时间轴插件使用详解
Jul 16 Javascript
第一次接触神奇的Bootstrap菜单和导航
Aug 01 Javascript
谈谈target=_new和_blank的不同之处
Oct 25 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
Feb 23 Javascript
less简单入门(CSS 预处理语言)
Mar 08 Javascript
微信小程序媒体组件详解(视频,音乐,图片)
Sep 19 Javascript
JavaScript判断浏览器运行环境的详细方法
Jun 30 Javascript
微信小程序实现手势滑动卡片效果
Aug 26 Javascript
详解vue中使用transition和animation的实例代码
Dec 12 Vue.js
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
ThinkPHP跳转页success及error模板实例教程
2014/07/17 PHP
php实现XSS安全过滤的方法
2015/07/29 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
2015/12/23 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
php简单随机字符串生成方法示例
2017/04/19 PHP
PHP类的自动加载与命名空间用法实例分析
2020/06/05 PHP
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
jQuery 弹出层插件(推荐)
2016/05/24 Javascript
ES6学习之变量的解构赋值
2017/02/12 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
基于jQuery实现一个marquee无缝滚动的插件
2017/03/09 Javascript
vue router使用query和params传参的使用和区别
2017/11/13 Javascript
解决easyui日期时间框ie的兼容的问题
2018/03/01 Javascript
解决npm管理员身份install时出现权限的问题
2018/03/16 Javascript
基于jQuery实现无缝轮播与左右点击效果
2018/05/13 jQuery
Js中将Long转换成日期格式的实现方法
2018/06/05 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
vue+php实现的微博留言功能示例
2019/03/16 Javascript
IntelliJ IDEA编辑器配置vue高亮显示
2019/09/26 Javascript
vue.js实现只能输入数字的输入框
2019/10/19 Javascript
github配置使用指南
2014/11/18 Python
Python获取任意xml节点值的方法
2015/05/05 Python
浅谈Python中用datetime包进行对时间的一些操作
2016/06/23 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
罗马尼亚在线杂货店:Pilulka.ro
2019/09/28 全球购物
销售人员个人求职信
2013/09/26 职场文书
毕业生机械建模求职信
2013/10/14 职场文书
中学优秀班主任事迹材料
2014/05/01 职场文书
一年级语文下册复习计划
2015/01/17 职场文书
2015年八一建军节演讲稿
2015/03/19 职场文书
2015年父亲节寄语
2015/03/23 职场文书
2015年国庆节寄语
2015/08/17 职场文书