vue3如何通過動(dòng)態(tài)綁定exclude在退出登錄時(shí)清除keepAlive緩存
vue: 3.2.13 (script setup模式)
在vue開發(fā)中使用keepAlive來緩存組件是比較常見的做法,但是當(dāng)我們需要實(shí)現(xiàn)退出登錄功能時(shí)就會(huì)發(fā)現(xiàn),跳轉(zhuǎn)到登錄頁面后再次登錄還殘留著上一個(gè)用戶緩存的數(shù)據(jù)
故障分析
上一個(gè)登錄的用戶操作的數(shù)據(jù)被keepAlive緩存了,這個(gè)用戶退出登錄后沒有清除緩存,再次登錄的用戶頁面會(huì)加載上一個(gè)用戶的緩存數(shù)據(jù)
解決方案
- 通過動(dòng)態(tài)綁定exclude屬性來決定需要排除哪些組件不需要緩存
- 使用vuex來存放需要排除緩存的組件名稱
退出登錄按鈕邏輯部分
import {useStore} from 'vuex'
import {useRouter} from 'vue-router'
import {ref} from "vue";
const store = useStore()
const router = useRouter()
//將需要清除緩存的組件名存放在exclude中(<script setup>模式下只需填寫vue組件名,不需要寫文件后綴名)
//也可以存放一個(gè)正則表達(dá)式讓所有.vue文件緩存刪除,具體根據(jù)實(shí)際業(yè)務(wù)需求來設(shè)置
const exclude = ref<string>("Goods,Home,Order,Type,User,Login")
const out = () => {
//清除用戶token
sessionStorage.removeItem('o_m_s')
//通過store.commit提交修改vuex中exclude數(shù)據(jù),并將上面定義的exclude傳遞給vuex
store.commit('changeExcludeOut', exclude.value)
//清除權(quán)限列表
store.commit('out')
//跳轉(zhuǎn)到登錄頁或自定義頁面(跳轉(zhuǎn)登錄操作放在最后執(zhí)行)
router.replace('/')
}vuex部分邏輯
import {createStore} from 'vuex'
export default createStore({
state() {
return {
//用戶信息和權(quán)限列表
info: null,
//默認(rèn)排除組件列表
exclude: "Login"
}
},
getters: {},
mutations: {
//清除權(quán)限列表
out(state) {
state.info = null
},
//清除keepAlive緩存,用于退出登錄
changeExcludeOut(state, value) {
state.exclude = value
},
//重新設(shè)置排除列表,用于跳轉(zhuǎn)到登錄頁
changeExcludeLogin(state){
state.exclude = "Login"
}
},
actions: {},
modules: {}
})app.vue部分
<template>
<nav-bar v-if="route.meta.navBar"></nav-bar>
<router-view v-slot='{Component}'>
<!-- 使用v-bind動(dòng)態(tài)綁定exclude,數(shù)據(jù)從vuex中提取 -->
<keep-alive :exclude="store.state.exclude">
<component :is='Component'></component>
</keep-alive>
</router-view>
</template>import {useStore} from 'vuex'
const store = useStore()登錄頁邏輯部分
import {onBeforeMount} from 'vue'
import {useStore} from 'vuex'
const store = useStore()
//在login組件掛載前通過store.commit重新修改vuex中的排除列表
onBeforeMount(() => {
store.commit('changeExcludeLogin')
})總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue實(shí)現(xiàn)驗(yàn)證碼按鈕倒計(jì)時(shí)功能
最近項(xiàng)目結(jié)束,空閑時(shí)間比較多,今天小編抽時(shí)間給大家使用vue寫一個(gè)小例子,就決定做驗(yàn)證碼倒計(jì)時(shí)功能,具體實(shí)例代碼大家參考下本文2018-04-04
Vue實(shí)現(xiàn)在線預(yù)覽pdf文件功能(利用pdf.js/iframe/embed)
項(xiàng)目要求需要預(yù)覽pdf文件,網(wǎng)上找了很久,發(fā)現(xiàn)pdf.js的效果,這篇文章主要給大家介紹了關(guān)于Vue實(shí)現(xiàn)在線預(yù)覽pdf文件功能,主要利用pdf.js/iframe/embed來實(shí)現(xiàn)的,需要的朋友可以參考下2021-06-06
Vue使用axios發(fā)送請(qǐng)求簡(jiǎn)單實(shí)現(xiàn)代碼
axios是一個(gè)基于Promise的,發(fā)送http請(qǐng)求的一個(gè)工具庫,并不是vue中的第三方插件,使用時(shí)不能通過“Vue.use()”安裝插件,需要在原型上進(jìn)行綁定2023-04-04
vue 獲取到數(shù)據(jù)但卻渲染不到頁面上的解決方法
這篇文章主要介紹了vue 獲取到數(shù)據(jù)但卻渲染不到頁面上的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
vue中父子組件傳值,解決鉤子函數(shù)mounted只運(yùn)行一次的操作
這篇文章主要介紹了vue中父子組件傳值,解決鉤子函數(shù)mounted只運(yùn)行一次的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07
使用Vue和ECharts創(chuàng)建交互式圖表的代碼示例
在現(xiàn)代 Web 應(yīng)用中,數(shù)據(jù)可視化是一個(gè)重要的組成部分,它不僅能夠幫助用戶更好地理解復(fù)雜的數(shù)據(jù),還能提升用戶體驗(yàn),本文給大家使用Vue和ECharts創(chuàng)建交互式圖表的示例,需要的朋友可以參考下2024-11-11

