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


    1.场景

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

    2.遇到的问题

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

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

    3.解决方法

    provide / inject 组合

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

    使用 provide和inject

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

    vi设计http://www.maiqicn.com 办公资源网站大全https://www.wode007.com

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

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

    <!--页面级Vue组件-->
    <template>
    <div id="app">
    <keep-alive>
    <router-view v-if="isRouterAlive"></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(function () {
    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>
  • 相关阅读:
    如何创建线程详解(二)
    JAVA 多线程和进程概念的引入
    JMeter压力测试
    建模揭秘----构建用户模型
    浅谈“领域驱动设计”
    Restlet 学习笔记
    实则以数据库为中心---其实数据库不存在
    基于可重用构件的软件开发过程模型
    四层架构设计模型驱动
    架构
  • 原文地址:https://www.cnblogs.com/xiaonian8/p/13705103.html
Copyright © 2020-2023  润新知