vue2前进刷新后退不刷新

网上关于前进刷新后退不刷新的代码很多,但是在项目里面都用不起来,感觉没办法真正实现该功能。我这边简单粗暴的监听window的popstate事件搞定。

首先在store里面定义好缓存相关的对象和操作

import Vue from 'vue';
import Vuex from "vuex";

Vue.use(Vuex);

export default new Vuex.Store({
    state:{
        keepAlivePages:[],
    },
    mutations:{           
        //增加缓存
        pushKeepAlivePages(state,pageName){
            
            if(state.keepAlivePages.includes(pageName)){
                console.log('此页面已在缓存中')
            }
            else {
                state.keepAlivePages.push(pageName)
            }
          
        },
        //移除最近一个缓存
        popKeepAlivePages(state){
          
            if(state.keepAlivePages.length>0){
                state.keepAlivePages.pop();
            }

        },
        //移除缓存
        removeKeepAlivePages(state,pageName){
           
            let index = state.keepAlivePages.findIndex((item) => {
                return item === pageName
            })
            if(index !== -1) {
                state.keepAlivePages.splice(index, 1)
            } else {
                console.log('该页面未被缓存')
            }
            
        },
    }
});

然后app.vue中将需要缓存的组件用keepAlive包裹,include的列表指向store里面的缓存对象

<template>
    <div id="app">
        
        <keep-alive :include="keepAlivePages">
            <router-view/>
        </keep-alive>
    </div>
</template>
<script>
import Vue from 'vue';

export default {
    data(){
        return{
            
        }
    },
    computed:{
        keepAlivePages:{
            get (){
                return this.$store.state.keepAlivePages;
            },
        },
    },
};
</script>

接下来在main.js中做好前进加入缓存列表后退删除缓存列表的操作即可

import Vue from 'vue'
import App from './App.vue'
import router from './router';
import store from "./store";

//路由守卫
router.beforeEach((to, from, next) => {
    //前进缓存   
    if (to.path !== from.path) {            
        store.commit('pushKeepAlivePages', to.name);
    }
    next();
})

window.addEventListener("popstate", (e)=> {
    //后退删除缓存
    store.commit('removeKeepAlivePages',router.currentRoute.name)
}, false);


//构建vue
new Vue({
    router: router,
    store: store,
    render: h => h(App),
}).$mount('#app');

目前应付手机h5应用中没有太多复杂跳转的简单页面是够了。

### Vue3 中前进刷新后退时的页面缓存解决方案 #### 使用 `vcat-history` 插件 对于 Vue3 应用,推荐使用 `vcat-history` 轻量级插件来处理前进刷新后退时的页面缓存问题。该插件仅支持 TypeScript 和 Vue3,而且能够提供平滑的过渡动画效果[^1]。 ```bash npm install vcat-history ``` 安装完成后,在项目的入口文件中引入并配置: ```javascript import { createApp } from 'vue'; import App from './App.vue'; import VCatHistory from 'vcat-history'; const app = createApp(App); app.use(VCatHistory, { cache: true, animation: true, }); app.mount('#app'); ``` #### 结合 `keep-alive` 组件优化缓存策略 为了更精细地控制哪些页面应该被缓存以及何时更新数据,可以在路由配置中结合 `keep-alive` 组件使用。这样仅可以减少必要的网络请求,还能提升用户体验。 定义需要缓存的视图组件: ```html <template> <div id="app"> <router-view v-slot="{ Component }"> <transition :name="$store.state.transitionName"> <component :is="Component" /> </transition> </router-view> </div> </template> <script setup lang="ts"> // ... </script> ``` 在路由配置里指定要缓存的具体路径: ```javascript { path: '/example', name: 'ExamplePage', component: ExampleComponent, meta: { keepAlive: true // 设置此属性表示允许缓存 } } ``` 当从详情页返回列表页时希望加载新的数据,则可在目标组件内监听激活状态变化事件,并据此决定是否重载数据: ```typescript export default defineComponent({ data() { return { list: [], isUseCache: false, }; }, activated() { const fromRoute = this.$route.matched.find((record) => record.path === this.$route.meta.fromPath); if (fromRoute?.meta.noReload || !this.isUseCache) { this.list = []; this.fetchData(); } this.isUseCache = false; }, methods: { fetchData() { // 实现具体的数据拉取逻辑... }, }, }); ``` 针对某些特殊情况下的缓存失效现象(比如首次访问之后再次进入),可以通过检测当前实例的状态来进行适当调整。例如,在离开某个特定页面前保存其滚动位置或其他重要参数;下次再回到相同页面时恢复这些值以保持一致性的体验[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值