浅谈针对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 相关文章推荐
JavaScript高级程序设计 XML、Ajax 学习笔记
Sep 10 Javascript
javascript针对DOM的应用分析(三)
Apr 15 Javascript
js修改input的type属性问题探讨
Oct 12 Javascript
javascript特殊文本输入框网页特效
Sep 13 Javascript
Bootstrap3 多选和单选框(checkbox)
Dec 29 Javascript
Angular2监听页面大小变化的解决方法
Oct 09 Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
Feb 06 Javascript
使用JavaScript中的lodash编写双色球效果
Jun 24 Javascript
解决vue 引入子组件报错的问题
Sep 06 Javascript
layui框架与SSM前后台交互的方法
Sep 12 Javascript
JS实现纵向轮播图(初级版)
Jan 18 Javascript
vue+echarts实现动态折线图的方法与注意
Sep 01 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
经典的星际争霸,满是回忆的BGM
2020/04/09 星际争霸
德生9700DX电路分析
2021/03/02 无线电
php操作xml
2013/10/27 PHP
ThinkPHP中的三大自动简介
2014/08/22 PHP
用PHP代码在网页上生成图片
2015/07/01 PHP
PHP实现对图片的反色处理功能【测试可用】
2018/02/01 PHP
Javascript中的var_dump函数实现代码
2009/09/07 Javascript
javascript smipleChart 简单图标类
2011/01/12 Javascript
Extjs中的GridPanel隐藏列会显示在menuDisabled中解决方法
2013/01/27 Javascript
node.js中的console.trace方法使用说明
2014/12/09 Javascript
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
基于JavaScript操作DOM常用的API小结
2015/12/01 Javascript
vue.js评论发布信息可插入QQ表情功能
2017/08/08 Javascript
Bootstrap框架建立树形菜单(Tree)的实例代码
2017/10/30 Javascript
关于 angularJS的一些用法
2017/11/29 Javascript
Vue Autocomplete 自动完成功能简单示例
2019/05/25 Javascript
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
2020/08/03 Javascript
在vue项目中promise解决回调地狱和并发请求的问题
2020/11/09 Javascript
python中的函数用法入门教程
2014/09/02 Python
python批量提交沙箱问题实例
2014/10/08 Python
python 开发的三种运行模式详细介绍
2017/01/18 Python
pandas的object对象转时间对象的方法
2018/04/11 Python
TensorFlow实现卷积神经网络
2018/05/24 Python
详解python中Numpy的属性与创建矩阵
2018/09/10 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
Python中pass的作用与使用教程
2020/11/13 Python
python如何调用php文件中的函数详解
2020/12/29 Python
美国球鞋寄卖网站:Stadium Goods
2018/05/09 全球购物
下述程序的作用是计算机数组中的最大元素值及其下标
2012/11/26 面试题
房屋继承公证书
2014/04/10 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
学雷锋的心得体会
2014/09/04 职场文书
2015年仓库管理工作总结
2015/05/25 职场文书
导游词创作书写原则以及开场白技巧怎么学?
2019/09/25 职场文书
关于mysql中string和number的转换问题
2022/06/14 MySQL