vue项目刷新当前页面

# 场景

有时候我们在vue项目页面做了一些操作,需要刷新一下页面。

# 解决方案

  1. this.$router.go(0)。这种方法虽然代码很少,只有一行,但是体验很差。页面会一瞬间的白屏,体验不是很好
  2. vue-router重新路由到当前页面,页面是不进行刷新的。
  3. location.reload()。这种也是一样,画面一闪,体验不是很好;
  4. 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

这种画面虽不会一闪,但是能看见路由快速变化。

# 控制<router-view>的显示隐藏

#provide / inject 组合

provide:选项应该是一个对象或返回一个对象的函数。该对象包含可注入其子孙的属性。

inject:一个字符串数组,或一个对象,对象的 key 是本地的绑定名

提示:provideinject 绑定并不是可响应的。这是刻意为之的。如果你传入了一个可监听的对象,那么其对象的属性还是可响应的。

**原理:**允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效;

用这种方式,在结合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

在需要用到刷新的页面。在页面注入App.vue组件提供(provide)的 reload 依赖,在逻辑完成之后(删除或添加...),直接this.reload()调用,即可刷新当前页面

# 直接修改数据

如果只是纯是更新页面数据的话,直接用 spliceVue.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
上次更新: 2022/04/15, 05:41:28
×