摘要:為了做到頁面的極致優(yōu)化,我們需要將那些閑置的狀態(tài)重置,以減小占用的內(nèi)存空間。不如當路由改變時去重置中的所有狀態(tài)。這里只是提供一種重置狀態(tài)的一種方案,如果有更好方案還請各位看官留言。
前言
大型單頁應用(后面都是指spa),我們往往會通過使用狀態(tài)管理器 vuex 去解決組件間狀態(tài)共享與狀態(tài)傳遞等問題。這種應用少則幾十個單頁,多則上百個單頁。隨著路由的頻繁切換,每個路由對應的 vuex 中的狀態(tài)將越來越多。為了做到頁面的極致優(yōu)化,我們需要將那些閑置的狀態(tài)重置,以減小占用的內(nèi)存空間。
什么狀態(tài)可以重置vuex 強調(diào)采用集中式存儲管理應用的所有組件的狀態(tài),但是我們真把所有的狀態(tài)都放到 store 中去處理,你會發(fā)現(xiàn)開發(fā)起來非常痛苦。這里如果想很好的把控哪些數(shù)據(jù)需要放到 store 中去管理,首先要理解 vuex 是用來解決什么問題的。vuex 官網(wǎng)指出是為了解決多個組件共享狀態(tài)的,那么我們就可以把多個組件的共享狀態(tài)放到 store 中去管理,這里的多組件共享對于單頁應用很多情況是跨路由的組件。如果 store只存儲多組件共享的狀態(tài),那么我們就沒必要去清理 vuex 中的狀態(tài)了,因為這些狀態(tài)隨時會被用到。
而隨著業(yè)務場景越來越復雜,很多與后臺交互的邏輯也都放到了組件中,這樣代碼就變得很凌亂,vuex 也沒有被充分利用。這時我們可以把與后臺 api 交互的邏輯放到 vuex 中的action 去處理,后臺返回的狀態(tài)自然也就放到了 store 管理。這樣處理后,組件就只負責對數(shù)據(jù)進行渲染,邏輯非常清晰。而此時,組件對應的 store 中的狀態(tài)隨著路由的切換將會越來越多,而這些狀態(tài)就需要我們手動的去清理了。
很多方案都有取舍,如果將與后臺 api 交互的數(shù)據(jù)放到組件中,就沒必要去清理了,但是代碼邏輯將變得比較亂。另外諸如 vuex 的插件 vue-devtools 將無法監(jiān)控到每次請求數(shù)據(jù)的變化...什么時候去重置狀態(tài)
我們想要的效果是在路由切換的時候,把上一個路由對應的 vuex 中的狀態(tài)重置掉,但是路由和vuex 并沒有一一對應的關系,如果要做到這種效果,那么我們需要維護一個路由與vuex 模塊的對應關系,這樣會很繁瑣。不如當路由改變時去重置 vuex 中的所有狀態(tài)。
vuex 中閑置狀態(tài)如何清理下面將結(jié)合我的github實例去說明,這個實例創(chuàng)建了一個單頁應用,我們通過切換路由的時候?qū)㈤e置的狀態(tài)清除。
改造路由對應組件的 module 狀態(tài)實例中采用拆分 store 為多個 module 的方式,將路由對應的組件狀態(tài)放到對應的 module 中,多組件共享的狀態(tài)放到頂級的 store 中管理。大致如下:
// store/index.js import page1 from "./modules/page1.js"; import page2 from "./modules/page2.js"; import page3 from "./modules/page3.js"; import page4 from "./modules/page4.js"; import page5 from "./modules/page5.js"; export default new Vuex.Store({ state, getters, actions, mutations, modules: { // 每個路由對應的 module page1, page2, page3, page4, page5 }, plugins: __DEV__ ? [createLogger()] : [], strict: __DEV__ ? true : false });
路由 page1 對應的 module 的 state 形如:
// store/modules/page1.js const state = { // 列表數(shù)據(jù) page1Data: [], // 標題數(shù)據(jù) page1Title: "" }
這些數(shù)據(jù)是通過調(diào)用后端 api 返回并復制的數(shù)據(jù),如果我們在路由改變的時候重置這些數(shù)據(jù),那么需要將初始化數(shù)據(jù)提取出來,并且暴露一個需要重置的標識方法 initState(),代表路由改變的時候需要重置,當然這個方法名稱是個約定,你也可以定義為其他名稱。改造后為:
// store/modules/page1.js // 放置你要重置的數(shù)據(jù) const initState = { page1Data: [], } // state const state = { // 參數(shù)解構(gòu) ...initState, // 路由改變不想重置的數(shù)據(jù) page1Title: "", initState(){ return initState } }全局 module 配置
定義全局 mutation 事件類型
// store/types.js export const RESET_STATES = "resetStates"
定義全局 mutation
// store/mutation.js import * as types from "./types" // 檢測所有的 state 并把 `initState()` 中的屬性重置 function resetState(state, moduleState) { const mState = state[moduleState]; if (mState.initState && typeof mState.initState === "function") { const initState = mState.initState(); for (const key in initState) { mState[key] = initState[key]; } } } export default { [types.RESET_STATES](state, payload) { for (const moduleState in state) { resetState(state, moduleState); } }, }
定義全局 action
// store/action.js import * as types from "./types" export default { // rest state action resetStates:function (context, payLoad) { context.commit(types.RESET_STATES, payLoad); } }路由切換觸發(fā)重置方法
至此一切準備就緒,只需要在路由改變時觸發(fā)重置的方法即可,在入口 vue 文件中處理
// components/app.vue
如果你的 chrome 瀏覽器安裝了 vuejs-devtools 在路由切換的時候就能夠很清晰的看到上一個路由數(shù)據(jù)的的重置過程。
總結(jié)實例點這里。我們這里的 vuex 狀態(tài)重置,是每次路由切換遍歷所有的 store 中的狀態(tài),并把initState() 中的屬性重置,如果能做到把當前的路由對應的 state 重置就更好了,但是路由和 store 中的 module 并沒有關聯(lián)關系。這里只是提供一種重置 vuex 狀態(tài)的一種方案,如果有更好方案還請各位看官留言。如有不妥的地方也歡迎拍磚留言。
--完--
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/90631.html
摘要:這里為什么是一個數(shù)組呢因為這就是標題所描述的可定制,如果頁面內(nèi)重置絕大部分狀態(tài),但需要保留其中一些狀態(tài)的時候我們可以通過我們傳遞過來的值來剔除相應的,使其不被更新。 在正式場景中我們經(jīng)常遇到一個問題,就是登出頁面或其他操作的時候,我們需要重置所有的vuex,讓其變?yōu)槌跏紶顟B(tài),那么,就涉及到了多種方法:1、頁面刷新: window.location.reload() 這個方法通過路由判斷...
摘要:這里為什么是一個數(shù)組呢因為這就是標題所描述的可定制,如果頁面內(nèi)重置絕大部分狀態(tài),但需要保留其中一些狀態(tài)的時候我們可以通過我們傳遞過來的值來剔除相應的,使其不被更新。 在正式場景中我們經(jīng)常遇到一個問題,就是登出頁面或其他操作的時候,我們需要重置所有的vuex,讓其變?yōu)槌跏紶顟B(tài),那么,就涉及到了多種方法:1、頁面刷新: window.location.reload() 這個方法通過路由判斷...
摘要:可以配合相關的官方文檔學習。上面的內(nèi)容說的重點,其實也算是項目的全部啦項目地址感覺還不錯的話就請給個吧謝謝有什么問題歡迎提問 項目地址:vue-simple-template共三個角色:adan barbara carrie 密碼全是:123456 adan 擁有 最高權限A 他可以看到 red , yellow 和 blue 頁面(共三個頁面)barbara 擁有 權限B 他可以看到...
摘要:如果有什么可以幫到你的無論是不是此項目中的問題都可以在提出我會盡我所能幫你解決歡迎大佬們提出好的問題和點子,我會第一時間去修正。 前言 本項目(友租)是基于Vue2、Vuex、Muse-UI、es6、webpack構(gòu)建的一個移動端、PC端輕社區(qū)項目 項目地址GitHub 項目更新歷史 開發(fā)環(huán)境 Macos + Vs code + Chrome 項目的靈感最初來源:由于我是一個宅男在...
閱讀 3447·2021-11-24 09:39
閱讀 3213·2021-09-09 11:34
閱讀 3380·2021-09-07 09:58
閱讀 2446·2019-08-30 13:07
閱讀 3029·2019-08-29 15:09
閱讀 1745·2019-08-29 13:01
閱讀 2476·2019-08-26 12:18
閱讀 2126·2019-08-26 10:28