vuex如何重置所有state(可定制)
在正式場景中我們經(jīng)常遇到一個(gè)問題,就是登出頁面或其他操作的時(shí)候,我們需要重置所有的vuex,讓其變?yōu)槌跏紶顟B(tài),
那么,就涉及到了多種方法:
1、頁面刷新:
window.location.reload()
這個(gè)方法通過路由判斷優(yōu)化或是邏輯優(yōu)化,始終頁面時(shí)重新加載,就會(huì)導(dǎo)致用戶體驗(yàn)很差,對(duì)瀏覽器來說也是一種不必要的負(fù)擔(dān),所以我嘗試之后就放棄了。
2、寫一個(gè)重置的方法然后調(diào)取
actions.resetVuex = function() {
store.commit(state.a, null)
store.commit(state.b, null)
store.commit(state.c, null)
...
}
store.dispatch('resetVuex')
這樣又會(huì)出現(xiàn)多個(gè)module,多個(gè)state,需要手動(dòng)添加多個(gè),工作量巨大且不易維護(hù),而且如果我們state初始是個(gè)個(gè)數(shù)組,一個(gè)對(duì)象這些更不好操作,更優(yōu)最多就是我們初始的時(shí)候深拷貝一份,但是也需要每個(gè)module里進(jìn)行操作和封裝
這兩種方法是可以解決問題的,但是我還是沒有采用這兩種方式,因?yàn)楦杏X已經(jīng)犧牲了某些東西來達(dá)成目的了,通過我反復(fù)的實(shí)踐,和摸索我采取了以下方法:
首先頁面加載,第一次加載引入store的時(shí)候,store的所有state肯定是初始值,那么我就做一個(gè)本地緩存記錄下來:
這里我采用了store插件(引用方式參考 https://github.com/nbubna/store)
在main.js創(chuàng)建vue實(shí)例之前:
import _store from 'store'
import createStore from './store'
...
const store = createStore() //我創(chuàng)建好的 vuex庫
_store({ initState: store.state }) //緩存一個(gè)名為initState的初始狀態(tài)
我們知道m(xù)ain.js是頁面載入的時(shí)候執(zhí)行一次的那么緩存的initState就是自己最開始創(chuàng)建store里的state狀態(tài)
(包含了module里的所有state);
然后我們?cè)趕tore創(chuàng)建的全局寫一個(gè)mutation方法
這里我采用了store插件(引用方式參考 https://github.com/nbubna/store)
這里我采用了lodash插件(引用方式參考 https://www.lodashjs.com/)
import _ from 'lodash'
import _store from 'store2'
...
const store = new Vuex.Store({
state: {
token: ''
},
mutations: {
resetAllState (state, payload) {
if (payload instanceof Array === false) { // 驗(yàn)證傳入的是一個(gè)數(shù)組
return
}
const initState = _store('initState') // 取出初始值的緩存
const _initState = payload.length ? _.omit(initState, payload) : initState // 判斷傳入值有無數(shù)據(jù),有數(shù)據(jù)剔除相對(duì)應(yīng)的值
_.extend(state, _initState)
}
},
modules: {
...
}
})
這個(gè)名叫resetAllState的mutation方法里就是講全局的state替換成我們緩存的state。
這里為什么 payload 是一個(gè)數(shù)組呢?
因?yàn)檫@就是標(biāo)題所描述的可定制,如果頁面內(nèi)重置絕大部分狀態(tài),但需要保留其中一些狀態(tài)的時(shí)候我們可以通過我們傳遞過來的state值來剔除相應(yīng)的state,使其不被更新。
當(dāng)然我們也可以傳入值來更新相應(yīng)值,其他所有值不進(jìn)行更新(這里我們就不詳細(xì)說明)
以上就是我實(shí)踐思考出來的方法,可能有不足的地方,歡迎大家提問、交流或提出更好的建議。也希望大家多多支持腳本之家。
相關(guān)文章
Vue.js實(shí)現(xiàn)點(diǎn)擊左右按鈕圖片切換
這篇文章主要為大家詳細(xì)介紹了Vue.js實(shí)現(xiàn)點(diǎn)擊左右按鈕圖片切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
vue3二次封裝element-ui中的table組件的過程詳解
這篇文章主要給大家介紹了vue3二次封裝element-ui中的table組件的過程,文中通過代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友跟著小編一起來學(xué)習(xí)吧2024-01-01
Avue和Element-UI動(dòng)態(tài)三級(jí)表頭的實(shí)現(xiàn)
本文主要介紹了Avue和Element-UI動(dòng)態(tài)三級(jí)表頭的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Vue3中reactive函數(shù)toRef函數(shù)ref函數(shù)簡介
這篇文章主要介紹了Vue3中的三種函數(shù),分別對(duì)reactive函數(shù)toRef函數(shù)以及ref函數(shù)原理及使用作了簡單介紹,有需要的朋友可以借鑒參考下2021-09-09
如何利用SpringBoot與Vue3構(gòu)建前后端分離項(xiàng)目
在當(dāng)前的互聯(lián)網(wǎng)時(shí)代,前后端分離架構(gòu)已經(jīng)成為構(gòu)建應(yīng)用系統(tǒng)的主流方式,本文將詳細(xì)介紹如何利用 SpringBoot 與 Vue3 構(gòu)建一個(gè)前后端分離的項(xiàng)目,感興趣的小伙伴可以了解下2025-04-04
Vue 自定義動(dòng)態(tài)組件實(shí)例詳解
vue的ui組件庫很多種,但是這么多的組件庫也不能滿足我們的開發(fā)需求,所以需要我們根據(jù)自己需求自己寫一個(gè)插件,下文小編通過兩個(gè)栗子給大家介紹js自定義組件的方法,感興趣的朋友一起看看吧2018-03-03

