清除vue中keep-alive 组件里的页面缓存

一、业务场景
  • 页面是通过el-tabs遍历出来的
  • keep-alive标签缓存数据,但是关闭tab,缓存未清理
二、实现方法
  • el-tabs所在页面

     <el-tabs v-model="activeTab" @tab-remove="removeTab" @tab-click="clickTab">
         <el-tab-pane
                  v-for="t in worktabs"
                    :key="t.path"
                    :label="t.title"
                    :name="t.path"
                    :closable="t.path !== '/readme'"
                    >
         </el-tab-pane>
    </el-tabs>
    
    // 方法
    removeTab(name) {
        this.$emit('close', {name: name})
    },
    
  • keep-alive所在页面

    <worktab @close="close"/>
    <div style="overflow: auto">
        <keep-alive>
            <router-view :key="key" v-if="$route.meta.keepAlive"></router-view>
        </keep-alive>
        <router-view v-else></router-view>
    </div>
    
    // 关闭tab方法
    close(event) {
        let list = this.$store.state.worktab.list
        const item = list.find(item => item.path === event.name)
        // 判断需要清空缓存的页面
        if (item.key) {
            const cache = item.key.$vnode.parent.componentInstance.cache
            // 拿到keep-alive的keys
            const key = item.key.$vnode.key
            delete cache[key]
        }
        // 调用状态缓存器里的方法
        this.$store.commit('worktabRemove', event.name)
    }
    
  • store状态缓存器

    // 移除tab
    worktabRemove(state, p) {
        // 关闭标签
        const index = state.worktab.list.findIndex(item => item.path === p)
        if (index > -1) {
            // 清理 keep alive - end
            state.worktab.list.splice(index, 1)
            // 返回到前一页
            if (state.worktab.list.length > 0 && index > 0) {
                router.push(state.worktab.list[index - 1].path).catch(err => {
                    //console.log(err)
                })
            } else {
                router.push('/readme').catch(err => {
                    //console.log(err)
                })
            }
        }
    },
        
    // 给需要清除缓存的tab赛对象
    addKeyRoute(state, p) {
        const index = state.worktab.list.findIndex(s => s.path === p.to)
        state.worktab.list[index].key = p.key
        state.worktab.current = state.worktab.list[index]
    },
    
  • 最后一步,在需要清缓存的组件条件,给对应路由赛对象

    mounted() {
        this.$store.commit('addKeyRoute', {to: this.$route.fullPath, key: this})
    },
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vuekeep-alive组件是用来进行组件缓存的。它可以在特定的场景下使用,比如需要缓存某个组件或者缓存所有组件。\[1\]要缓存某个组件,可以在该组件的外层嵌套一层<keep-alive>标签,并将需要缓存组件放在<keep-alive>标签内部。例如,在APP.vue缓存NativeBtn组件可以这样写:<keep-alive><NativeBtn /></keep-alive>。\[2\]如果需要缓存所有组件,可以将<keep-alive>标签放在根组件的外层,并将<router-view>放在<keep-alive>标签内部。例如,在APP.vue缓存所有组件可以这样写:<keep-alive><router-view /></keep-alive>。这样,在路由切换时,被缓存组件将会保留其状态,而不会重新渲染。 #### 引用[.reference_title] - *1* [vue使用keep-alive进行组件缓存(解决组件缓存问题)](https://blog.csdn.net/pipizhou16/article/details/126033711)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [vue缓存组件keep-alive](https://blog.csdn.net/Celester_best/article/details/125418259)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值