zoukankan      html  css  js  c++  java
  • vue中利用provide和inject实现页面刷新(无白屏)重载组件

    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>
  • 相关阅读:
    keras环境搭建
    通过程序自动设置网卡的“internet共享”选项
    编译pjsip源码
    电商开发必备,淘宝商品和类目体系是如何设计的
    pom.xml成了普通xml文件
    springboot application.properties不生效
    SpringBoot进阶教程(七十二)整合Apollo
    SpringBoot进阶教程(七十一)详解Prometheus+Grafana
    SpringBoot进阶教程(七十)SkyWalking
    Java8 lamda表达式
  • 原文地址:https://www.cnblogs.com/yehuisir/p/14860967.html
Copyright © 2011-2022 走看看