浅谈针对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分页插件AmSetPager(自写)
Apr 15 Javascript
javascript内存管理详细解析
Nov 11 Javascript
javascript搜索框效果实现方法
May 14 Javascript
javascript中的Function.prototye.bind
Jun 25 Javascript
jQuery Ajax全解析
Feb 13 Javascript
详解React native全局变量的使用(跨组件的通信)
Sep 07 Javascript
JS实现的简单表单验证功能完整实例
Oct 14 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
Apr 03 Javascript
详解React中setState回调函数
Jun 14 Javascript
如何把vuejs打包出来的文件整合到springboot里
Jul 26 Javascript
javascript自定义日期比较函数用法示例
Jul 22 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
Feb 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 date与gmdate的获取日期的区别
2010/02/08 PHP
php设计模式 Template (模板模式)
2011/06/26 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
2013/04/28 PHP
php中过滤非法字符的具体实现
2013/10/29 PHP
PHP连接MySQL进行增、删、改、查操作
2017/02/19 PHP
jquery分页对象使用示例
2014/04/01 Javascript
Egret引擎开发指南之视觉编程
2014/09/03 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
IE6浏览器中window.location.href无效的解决方法
2014/11/20 Javascript
js实现模拟银行卡账号输入显示效果
2015/11/18 Javascript
jquery无限级联下拉菜单简单实例演示
2015/11/23 Javascript
JS实现按比例缩放图片的方法(附C#版代码)
2015/12/08 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
全面了解js中的script标签
2016/07/04 Javascript
jQuery选择器总结之常用元素查找方法
2016/08/04 Javascript
jQuery实现的表格展开伸缩效果实例
2016/09/07 Javascript
js实现点击图片自动提交action的简单方法
2016/10/16 Javascript
javascript 的变量、作用域和内存问题
2017/04/19 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
2017/06/20 Javascript
javascript回调函数详解
2018/02/06 Javascript
Node.js + express实现上传大文件的方法分析【图片、文本文件】
2019/03/14 Javascript
使用webpack将ES6转化ES5的实现方法
2019/10/13 Javascript
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
2019/08/23 Python
Python 下载Bing壁纸的示例
2020/09/29 Python
python开发一款翻译工具
2020/10/10 Python
CSS3 animation ? steps 函数详解
2019/08/30 HTML / CSS
日本面向世界,国际级的免税在线购物商城:DOKODEMO
2017/02/01 全球购物
struct和class的区别
2015/11/20 面试题
好的自荐信的要求
2013/10/30 职场文书
2014全国两会学习心得体会1000字
2014/03/10 职场文书
公司前台接待岗位职责
2015/04/03 职场文书
施工单位工程部经理岗位职责
2015/04/09 职场文书
侵犯商业秘密的律师函
2015/05/27 职场文书
2015国庆节66周年标语
2015/07/30 职场文书
安全生产学习心得体会
2016/01/18 职场文书
乡镇干部学习心得体会
2016/01/23 职场文书