vue项目刷新当前页面
# 场景
有时候我们在vue
项目页面做了一些操作,需要刷新一下页面。
# 解决方案
this.$router.go(0)
。这种方法虽然代码很少,只有一行,但是体验很差。页面会一瞬间的白屏,体验不是很好- 用
vue-router
重新路由到当前页面,页面是不进行刷新的。 location.reload()
。这种也是一样,画面一闪,体验不是很好;- 用
provide
/inject
组合;
# 实践
# this.$router.go(0)
this.$router.go(0)
:这种方法页面会一瞬间的白屏,体验不是很好,虽然只是一行代码的事;
# location.reload()
location.reload()
:这种也是一样,画面一闪,效果总不是很好;
# 跳转空白页再跳回原页面
在需要页面刷新的地方写上:this.$router.push('/emptyPage'),跳转到一个空白页。在emptyPage.vue里beforeRouteEnter 钩子里控制页面跳转,从而达到刷新的效果
beforeRouteEnter (to, from, next) {
next(vm => {
vm.$router.replace(from.path)
})
}
1
2
3
4
5
2
3
4
5
这种画面虽不会一闪,但是能看见路由快速变化。
# 控制<router-view>
的显示隐藏
# 用
provide
/inject
组合
provide:选项应该是一个对象或返回一个对象的函数。该对象包含可注入其子孙的属性。
inject:一个字符串数组,或一个对象,对象的 key 是本地的绑定名
提示:provide
和 inject
绑定并不是可响应的。这是刻意为之的。如果你传入了一个可监听的对象,那么其对象的属性还是可响应的。
**原理:**允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效;
用这种方式,在结合http,可以替换现在socketio中传递数据问题;跟socketio交互一致;
- 默认
<router-view v-if="isRouterAlive" />
isRouterAlive肯定是true,在需要刷新的时候把这个值设为false,接着再重新设为true: - 然后在需要刷新的页面引入依赖:inject: ['reload'];在需要的地方直接调用方法即可:this.reload()。
在App.vue
,声明reload
方法,控制router-view
的显示或隐藏,从而控制页面的再次加载。
<template>
<div id="app">
<router-view v-if="isRouterAlive"></router-view>
</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>
<template>
<button @click="refresh"></button>
</template>
<script>
export default{
name: 'refresh',
inject: ['reload'],
methods: {
refresh () {
this.reload()
}
}
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
在需要用到刷新的页面。在页面注入App.vue
组件提供(provide
)的 reload
依赖,在逻辑完成之后(删除或添加...),直接this.reload()
调用,即可刷新当前页面
# 直接修改数据
如果只是纯是更新页面数据的话,直接用 splice
、Vue.set (object, propertyName, value)
、或者eventBus;
sockets: {
sRefresh: function (value) {
// location.reload()
// this.reload()
const index = this.list.findIndex(item => value.id === item.id)
if (index >= 0) {
this.list.splice(index, 1, value)
}
}
},
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
上次更新: 2022/04/15, 05:41:28