<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        在vuex中如何實現閑置狀態進行重置

        來源:懂視網 責編:小采 時間:2020-11-27 19:37:24
        文檔

        在vuex中如何實現閑置狀態進行重置

        在vuex中如何實現閑置狀態進行重置:本篇文章主要介紹了vuex 閑置狀態重置方案,現在分享給大家,也給大家做個參考。前言大型單頁應用(后面都是指spa),我們往往會通過使用狀態管理器 vuex 去解決組件間狀態共享與狀態傳遞等問題。這種應用少則幾十個單頁,多則上百個單頁。隨著路由的頻繁切換
        推薦度:
        導讀在vuex中如何實現閑置狀態進行重置:本篇文章主要介紹了vuex 閑置狀態重置方案,現在分享給大家,也給大家做個參考。前言大型單頁應用(后面都是指spa),我們往往會通過使用狀態管理器 vuex 去解決組件間狀態共享與狀態傳遞等問題。這種應用少則幾十個單頁,多則上百個單頁。隨著路由的頻繁切換

        本篇文章主要介紹了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 狀態的一種方案,如果有更好方案還請各位看官留言。如有不妥的地方也歡迎拍磚留言。

        上面是我整理給大家的,希望今后會對大家有幫助。

        相關文章:

        在vue中如何引用阿里字體圖標的方法

        有關Express中log4js實際用法

        使用NodeJS如何實現WebSocket功能

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        在vuex中如何實現閑置狀態進行重置

        在vuex中如何實現閑置狀態進行重置:本篇文章主要介紹了vuex 閑置狀態重置方案,現在分享給大家,也給大家做個參考。前言大型單頁應用(后面都是指spa),我們往往會通過使用狀態管理器 vuex 去解決組件間狀態共享與狀態傳遞等問題。這種應用少則幾十個單頁,多則上百個單頁。隨著路由的頻繁切換
        推薦度:
        標簽: 狀態 重置 閑置
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 免费精品国产自产拍在| 亚洲a∨无码精品色午夜| 男女交性永久免费视频播放| 嫩草影院免费观看| 亚洲a视频在线观看| 久久国产免费观看精品3| 911精品国产亚洲日本美国韩国| 女人体1963午夜免费视频| 国产亚洲精品无码成人| 免费在线观影网站| 无码欧精品亚洲日韩一区| 久久成人免费电影| 亚洲成AV人综合在线观看| 美女被cao免费看在线看网站| 亚洲人成7777| 日本久久久免费高清| 亚洲网红精品大秀在线观看 | 精品无码专区亚洲| 午夜免费福利视频| 亚洲精品高清国产麻豆专区| 亚洲视频在线免费播放| 亚洲人成影院在线无码观看| 一个人看的免费观看日本视频www| 亚洲精品乱码久久久久久按摩| 国产三级在线免费| 亚洲精品456播放| 亚洲一区精彩视频| 全黄a免费一级毛片人人爱| 久久不见久久见免费影院www日本| 久久不见久久见免费影院| 亚洲Av永久无码精品一区二区| 亚洲JIZZJIZZ中国少妇中文| 亚洲精品无码久久久久YW| 亚洲av午夜精品一区二区三区| a级毛片视频免费观看| 亚洲国产精品白丝在线观看| 四虎1515hm免费国产| 99re在线视频免费观看| 亚洲国产老鸭窝一区二区三区| 91在线视频免费观看| 亚洲91精品麻豆国产系列在线|