本篇文章主要介紹了vuex 閒置狀態重置方案,現在分享給大家,也給大家做個參考。
前言
大型單頁應用程式(後面都是指spa),我們往往會透過使用狀態管理器vuex 去解決元件間狀態共享與狀態傳遞等問題。這種應用少則幾十個單頁,多則上百個單頁。隨著路由的頻繁切換,每個路由對應的 vuex 中的狀態將越來越多。為了做到頁面的極致優化,我們需要將那些閒置的狀態重置,以減少佔用的記憶體空間。
什麼狀態可以重置
vuex 強調採用集中式儲存管理應用的所有元件的狀態,但是我們真把所有的狀態都放到store 中去處理,你會發現開發起來非常痛苦。這裡如果想很好的把控哪些資料需要放到 store 去管理,首先要理解 vuex 是用來解決什麼問題的。 vuex 官網指出是為了解決 多個元件共享狀態 的,那麼我們就可以把多個元件的共享狀態放到 store 中去管理,這裡的多組件共享對於單頁應用很多情況是跨路由的組件。如果 store只儲存多元件共享的狀態,那麼我們就沒必要清理 vuex 中的狀態了,因為這些狀態隨時會被用到。
而隨著業務場景越來越複雜,許多與後台互動的邏輯也都放到了元件中,這樣程式碼就變得很凌亂,vuex 也沒有被充分利用。這時我們可以把與後台 api 互動的邏輯放到 vuex 的action 去處理,後台回傳的狀態自然就放到 store 管理了。這樣處理後,元件就只負責對資料進行渲染,邏輯非常清晰。而此時,元件對應的 store 中的狀態隨著路由的切換將會越來越多,而這些狀態就需要我們手動的去清理了。
很多方案都有取捨,如果將與後台 api 互動的資料放到元件中,就沒必要去清理了,但是程式碼邏輯將變得比較亂。另外諸如vuex 的插件vue-devtools 將無法監控到每次請求資料的變化...
什麼時候去重置狀態
##我們想要的效果是在路由切換的時候,把上一個路由對應的vuex 中的狀態重置掉,但是路由和vuex 並沒有一一對應的關係,如果要做到這種效果,那麼我們需要維護一個路由與vuex 模組的對應關係,這樣會很繁瑣。不如當路由改變時去重置 vuex 的所有狀態。vuex 中閒置狀態如何清理
下面將結合我的github實例去說明,這個實例創建了一個單頁應用,我們透過切換路由的時候將閒置的狀態清除。改造路由對應元件的module 狀態
實例中採用分割store 為多個module 的方式,將路由對應的元件狀態放到對應的module 中,多元件共享的狀態放到頂層的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 = { // 列表数据 page1Data: [], // 标题数据 page1Title: '' }這些數據是透過呼叫後端api 傳回並複製的數據,如果我們在路由改變的時候重置這些數據,那麼需要將初始化數據提取出來,並且暴露一個需要重置的標識方法initState() ,代表路由改變的時候需要重置,當然這個方法名稱是個約定,你也可以定義為其他名稱。改造後為:
// store/modules/page1.js // 放置你要重置的数据 const initState = { page1Data: [], } // state const state = { // 参数解构 ...initState, // 路由改变不想重置的数据 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); } }
路由切換觸發重置方法
至此一切準備就緒,只需要在路由改變時觸發重置的方法即可,在入口vue 檔案中處理// components/app.vue <script> import {mapState, mapActions} from "vuex" export default{ methods: { ...mapActions({ resetStates: "resetStates" }) }, watch: { $route(to, from) { // 路由改变发起重置 this.resetStates(); } } } </script>如果你的chrome 瀏覽器安裝了vuejs-devtools 在路由切換的時候就能夠很清晰的看到上一個路由資料的的重置過程。
總結
實例點這裡 。我們這裡的vuex 狀態重置,是每次路由切換遍歷所有的store 中的狀態,並且把initState() 中的屬性重置,如果能做到把當前的路由對應的state 重置就更好了,但是路由和store 中的module 並沒有關聯關係。這裡只是提供一種重置 vuex 狀態的一種方案,如果有更好方案也請各位看官留言。如有不妥的地方也歡迎拍磚留言。 上面是我整理給大家的,希望今後對大家有幫助。 相關文章:以上是在vuex中如何實現閒置狀態進行重置的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

記事本++7.3.1
好用且免費的程式碼編輯器

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3漢化版
中文版,非常好用

Dreamweaver CS6
視覺化網頁開發工具