码迷,mamicode.com
首页 > 其他好文 > 详细

vue中利用provide和inject实现页面刷新(无白屏)重载组件

时间:2021-06-08 22:38:07      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:pre   关系   default   mount   method   --   fun   round   detail   

1.场景
在处理列表时,常常有删除一条数据或者新增数据之后需要重新刷新当前页面的需求。

 

2.遇到的问题
1. 用vue-router重新路由到当前页面,页面是不进行刷新的

2.采用window.reload(),或者router.go(0)刷新时,整个浏览器进行了重新加载,闪烁,体验不好

 

3.解决方法
provide / inject 组合

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

 

 

使用 provide和inject
这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。

 

简单来说就是子孙组件可以访问到祖先的对象方法。

在 App.vue 文件里写入provide的方法

<!--页面级vue组件-->
<template>
    <div id="app" v-if="isRouterAlive">
        <keep-alive> 
            <router-view ></router-view>
        </keep-alive>
    </div>
</template>
 
<script>
export default {
  name: App,
  provide () {  // 在祖先组件中通过 provide 提供变量
    return {
      reload: this.reload  //  声明一个变量
    }
  },
  data () {
    return {
      isRouterAlive: true  // 控制 router-view 是否显示达到刷新效果
    }
  },
  methods: {
    // provide中声明的变量
    reload () {
      // 通过 this.isRouterAlive 控制 router-view 达到刷新效果
      this.isRouterAlive = false 
      this.$nextTick(()=> {
        this.isRouterAlive = true
      })
    }
  }
}
</script>
 
<style>
</style>

然后在需要刷新的子孙组件中用inject注入 App.vue 中provide声明的变量

<template>
<div class="page">
    <button @click="reloadFun">刷新</button>
</div>
</template>
 
<script>
import vue from vue;
 
export default {
    inject:[reload], // 使用 inject 注入 reload 变量 
    data(){
        return{
 
        }
    },
    methods: {
        reloadFun(){
            this.reload();  // 直接使用
        }
      },
    
    mounted() {}
    
}
</script>
 
<style>
</style>

转载:https://blog.csdn.net/z591102/article/details/107244569

 

-----------------------------------------------------------注意!!!-----------------------------------------------------------------------------------------------

注意!!!!!

这个写法错误的!!!
<template>
  <div id="app" >
    <keep-alive>
      <router-view v-if="isRouterAlive"></router-view>
    </keep-alive>
  </div>
</template>
正确的写法!!!

<template>
  <div id="app" v-if="isRouterAlive">
    <keep-alive>
      <router-view></router-view>
    </keep-alive>
  </div>
</template>

 

vue中利用provide和inject实现页面刷新(无白屏)重载组件

标签:pre   关系   default   mount   method   --   fun   round   detail   

原文地址:https://www.cnblogs.com/yehuisir/p/14860967.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!