之前最常用的是 this.$router.go(0),类似直接点浏览器的刷新按钮,此类方法会导致 URL 刷新时闪烁且用户体验极差,这是强刷新。
解决方法
在 app.vue 页面内(如果根组件不叫这个,那就找路由出口 <router-view /> ),通过 v-if 条件渲染是在 DOM树中进行节点的删除和增加,所以浏览器会对其进行回流再渲染。将组件进行卸载,再挂载回去(这期间就会触发生命周期函数,进行请求,数据更新),进行页面的刷新。
在后台管理系统中,一些对话框组件,如果要传值也可以使用这个方法。
<template>
<div id="app">
<router-view v-if="isRouterAlive" />
</div>
</template>
<script>
export default {
name: 'App',
provide () {
return {
reload: this.reload
}
},
data () {
return {
isRouterAlive: true
}
},
methods: {
reload () {
this.isRouterAlive = false
this.$nextTick(function () {
this.isRouterAlive = true
})
}
}
}
</script>
然后就可以在任意一个组件内都可以使用 this.reload 方法,实现页面刷新
inject: ['reload'],
data () {
return {}
},