Vue项目,通过状态控制整个页面刷新

如题,页面刷新

很多时候,页面数据可能会频繁整体刷新,基本原理都是通过定时器来刷新,至于具体方法,每个人都有不同的方法。

下面是我比较习惯用的方式: 写了两种,Vue2.0 和 Vue3.0 的。

定义一个变量,定时控制这个变量的变化,在需要刷新的地方监控这个变量,一旦变化立即重新加载数据。不多说,还是直接上代码吧。

Vue2.0 使用Vue.observable 返回一个对象的响应式代理

定义data.js

export let state = Vue.observable({
    refreshRequest:0
});

const mutation = {
    setRefreshRequest(value) {
        state.refreshRequest = value;
    },
}

export const getter = {

};

export const action = {
    // 刷新
    updateRefreshRequest:mutation.setRefreshRequest,
}

在页面引入,定时刷新,控制状态变化
<template>
    <div></div>
</template>

<script>
    import { state,action } from './data';

    export default {
        computed: {
            // 刷新
            refreshRequest:()=> state.refreshRequest,
        },
        mounted() {
            /**开启数据刷新 */
            this.autoRefreshFn();
        },
        beforeDestroy() {
            this.autoRefresh && clearInterval(this.autoRefresh );
            this.autoRefresh = null;
        },
        methods: {
            /**状态控制全局request刷新 */
            autoRefreshFn(){
                this.autoRefresh && clearInterval(this.autoRefresh );
                this.autoRefresh = null;
                // 具体多久刷新一次,看你自己需求,我这里示例5分钟刷新一次
                this.autoRefresh = setInterval( ()=>{
                    action.updateRefreshRequest( this.refreshRequest?0:1 );
                }, 5*1000*60); 
            },
        }
    }
</script>

<style lang="less" scoped></style>
在整个页面所有子组件中引入,监控状态变化,一旦变化立即重载数据
<template>
    <panel :config="panelConfig" class="right-panel-wrap">
        
    </panel>
</template>

<script>
    import { state, action } from '../../data';
    import Api from "./api";

    export default {
        computed: {
            // 刷新
            refreshRequest:()=> state.refreshRequest
        },
        watch: {
            /**数据刷新机制 */
            refreshRequest: {
                async handler(e) {
                    //重载数据函数
                    this.loadData();
                },
                immediate: false
            }
        },
        mounted() {
            //加载数据
            this.loadData();
        },
        methods: {
            async loadData(){
            
            }
        }
    }
</script>
是不是非常简单实用,哪里需要重载数据,哪里就监控状态变化。不需要导出开启定时器,而且控制起来方便,不需要到处开定时器刷新接口数据。

Vue3.0 使用reactive 返回一个对象的响应式代理

定义 data.js

import { reactive } from 'vue';

export const state = reactive({
    refreshRequest:0,
    dataInfo:{
        name:'测试'
    }
})

export const getter = {

}

export const mutation = {
    setRefreshRequest(value){
        state.refreshRequest = value;
    },
    setDataInfo(value){
        state.dataInfo = value;
    }
}

export const action = {
    updateRefreshRequest:mutation.setRefreshRequest,
    updateDataInfo:mutation.setDataInfo,
}

使用,定时控制变化

<script setup>
    import { ref,computed,onMounted,onBeforeUnmount } from 'vue';
    import { state,action } from './data';

    const refreshRequest = computed({
        get: () => state.refreshRequest,
        set: (value) => action.updateRefreshRequest(value)
    })
    onMounted( () => {
        // 开启定时刷新
        autoRefershFn()
    } )
    let autoRefresh = ref(null);
    const autoRefershFn = () => {
        autoRefresh && clearInterval(autoRefresh );
        autoRefresh = null;
        // 具体多久刷新一次,看你自己需求,我这里示例5分钟刷新一次
        autoRefresh = setInterval( ()=>{
            refreshRequest.value = !refreshRequest.value;
            // 也可以这样
            // action.updateRefreshRequest( !refreshRequest.value );
        }, 5*1000*60); 
    }
    // 组件销户清理定时器
    onBeforeUnmount( () => {
        autoRefresh && clearInterval(autoRefresh );
        autoRefresh = null;
    } )
</script>

在需要刷新数据的地方引入,刷新数据

<script setup>
    import { computed,watch } from 'vue';
    import { state,action } from '../../data';
    const refreshRequest = computed( () => state.refreshRequest )
    const dataInfo = computed( () => state.dataInfo )
    watch( refreshRequest, (newValue,oldValue) => {
        console.log(newValue);
        //加载数据
        //this.loadData();
    } )
</script>

以上,结束。

在送大家一个小组件,不仅能显示刷新时间,而且还能手动点击刷新。不过是vue2的,有空在更新vue3的.

配合这个状态使用非常舒服,在状态变化刷新数据的时候,这里会监控,显示刷新时间,同时也能手动点击来刷新,鼠标移入也会显示自动刷新频次,效果如下:

image.png
直接上组件代码
<template>
    <el-tooltip effect="dark" content="数据每5分钟更新" placement="bottom">
        <div class="data-refresh-time">
            <div class="icon" @click="clickRefresh">
                // 这里是项目需求,我那里是svg小图标,你可以随便用别的代替
                <icon-svg name="refresh-time"></icon-svg>
            </div>
            <div class="name">{{timerStr}}</div>
        </div>
    </el-tooltip>
</template>

<script>
    export default {
        props: {
            // 页面自动刷新 状态
            isUpdateTime:{
                typr:Boolean,
                default:function() {
                    return false;
                }
            }
        },
        data() {
            return {
                timerStr:(new Date()).format('HH:mm')
            }
        },
        watch: {
            // 状态变化更新刷新时间
            isUpdateTime(){
                this.timerStr = (new Date()).format('HH:mm');
            }
        },
        methods: {
            //手动点击刷新
            clickRefresh(){
              this.$emit( 'update:isUpdateTime',!this.isUpdateTime )
            }
        }
    }
</script>

<style lang="less" scoped>
    .data-refresh-time{
        position: absolute;
        z-index: 1004;
        top:15px;
        right:15px;
        width:80px;
        display: flex;
        flex-direction: row;
        align-items: center;
        justify-content: flex-end;
        user-select: none;
        .icon{
            width: 20px;
            height: 14px;
            cursor: pointer;
            display: flex;
            flex-direction: row;
            align-items: center;
            justify-items: center;
            .icon-svg{
                font-size: 30px;
                color: @color-primary;
            }
        }
        .name{
            line-height: 100%;
            font-size: 14px;
            font-weight: 400;
            color: @text-color-primary;
            margin-left: 8px;
            text-shadow: 
                0 0 4px rgba(255,255,255,0.4), 
                0 0 4px rgba(255,255,255,0.4), 
                0 0 4px rgba(255,255,255,0.4);
        }
    }
</style>

使用组件
<template>
    <div class="container">
        <!-- 刷新 这里传入 状态 和 事件  -->
        <data-refresh :isUpdateTime.sync="refreshRequest"></data-refresh>
    </div>
</template>

<script>
    import DataRefresh from 'components/data-refresh-time';
    import { state, action } from '../../store';

    export default {
        components: {
            DataRefresh
        },
        computed: {
            // 刷新
            refreshRequest:()=> state.refreshRequest,
         },
        watch: {
            refreshRequest(){
                // 干你该干的事情
            }
        },
    };
</script>

<style lang="less" scoped>
    @deep: ~'>>>';
</style>
以上,结束!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容