成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

vuex 閑置狀態(tài)重置方案

junfeng777 / 1036人閱讀

摘要:為了做到頁(yè)面的極致優(yōu)化,我們需要將那些閑置的狀態(tài)重置,以減小占用的內(nèi)存空間。不如當(dāng)路由改變時(shí)去重置中的所有狀態(tài)。這里只是提供一種重置狀態(tài)的一種方案,如果有更好方案還請(qǐng)各位看官留言。

前言

大型單頁(yè)應(yīng)用(后面都是指spa),我們往往會(huì)通過(guò)使用狀態(tài)管理器 vuex 去解決組件間狀態(tài)共享與狀態(tài)傳遞等問(wèn)題。這種應(yīng)用少則幾十個(gè)單頁(yè),多則上百個(gè)單頁(yè)。隨著路由的頻繁切換,每個(gè)路由對(duì)應(yīng)的 vuex 中的狀態(tài)將越來(lái)越多。為了做到頁(yè)面的極致優(yōu)化,我們需要將那些閑置的狀態(tài)重置,以減小占用的內(nèi)存空間。

什么狀態(tài)可以重置

vuex 強(qiáng)調(diào)采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài),但是我們真把所有的狀態(tài)都放到 store 中去處理,你會(huì)發(fā)現(xiàn)開(kāi)發(fā)起來(lái)非常痛苦。這里如果想很好的把控哪些數(shù)據(jù)需要放到 store 中去管理,首先要理解 vuex 是用來(lái)解決什么問(wèn)題的。vuex 官網(wǎng)指出是為了解決多個(gè)組件共享狀態(tài)的,那么我們就可以把多個(gè)組件的共享狀態(tài)放到 store 中去管理,這里的多組件共享對(duì)于單頁(yè)應(yīng)用很多情況是跨路由的組件。如果 store只存儲(chǔ)多組件共享的狀態(tài),那么我們就沒(méi)必要去清理 vuex 中的狀態(tài)了,因?yàn)檫@些狀態(tài)隨時(shí)會(huì)被用到。

而隨著業(yè)務(wù)場(chǎng)景越來(lái)越復(fù)雜,很多與后臺(tái)交互的邏輯也都放到了組件中,這樣代碼就變得很凌亂,vuex 也沒(méi)有被充分利用。這時(shí)我們可以把與后臺(tái) api 交互的邏輯放到 vuex 中的action 去處理,后臺(tái)返回的狀態(tài)自然也就放到了 store 管理。這樣處理后,組件就只負(fù)責(zé)對(duì)數(shù)據(jù)進(jìn)行渲染,邏輯非常清晰。而此時(shí),組件對(duì)應(yīng)的 store 中的狀態(tài)隨著路由的切換將會(huì)越來(lái)越多,而這些狀態(tài)就需要我們手動(dòng)的去清理了。

很多方案都有取舍,如果將與后臺(tái) api 交互的數(shù)據(jù)放到組件中,就沒(méi)必要去清理了,但是代碼邏輯將變得比較亂。另外諸如 vuex 的插件 vue-devtools 將無(wú)法監(jiān)控到每次請(qǐng)求數(shù)據(jù)的變化...
什么時(shí)候去重置狀態(tài)

我們想要的效果是在路由切換的時(shí)候,把上一個(gè)路由對(duì)應(yīng)的 vuex 中的狀態(tài)重置掉,但是路由和vuex 并沒(méi)有一一對(duì)應(yīng)的關(guān)系,如果要做到這種效果,那么我們需要維護(hù)一個(gè)路由與vuex 模塊的對(duì)應(yīng)關(guān)系,這樣會(huì)很繁瑣。不如當(dāng)路由改變時(shí)去重置 vuex 中的所有狀態(tài)。

vuex 中閑置狀態(tài)如何清理

下面將結(jié)合我的github實(shí)例去說(shuō)明,這個(gè)實(shí)例創(chuàng)建了一個(gè)單頁(yè)應(yīng)用,我們通過(guò)切換路由的時(shí)候?qū)㈤e置的狀態(tài)清除。

改造路由對(duì)應(yīng)組件的 module 狀態(tài)

實(shí)例中采用拆分 store 為多個(gè) module 的方式,將路由對(duì)應(yīng)的組件狀態(tài)放到對(duì)應(yīng)的 module 中,多組件共享的狀態(tài)放到頂級(jí)的 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: { // 每個(gè)路由對(duì)應(yīng)的 module
        page1,
        page2,
        page3,
        page4,
        page5
    },
    plugins: __DEV__ ? [createLogger()] : [],
    strict: __DEV__ ? true : false
});

路由 page1 對(duì)應(yīng)的 module 的 state 形如:

// store/modules/page1.js
const state = {
     // 列表數(shù)據(jù)
     page1Data: [],
     // 標(biāo)題數(shù)據(jù)
     page1Title: ""
}

這些數(shù)據(jù)是通過(guò)調(diào)用后端 api 返回并復(fù)制的數(shù)據(jù),如果我們?cè)诼酚筛淖兊臅r(shí)候重置這些數(shù)據(jù),那么需要將初始化數(shù)據(jù)提取出來(lái),并且暴露一個(gè)需要重置的標(biāo)識(shí)方法 initState(),代表路由改變的時(shí)候需要重置,當(dāng)然這個(gè)方法名稱(chēng)是個(gè)約定,你也可以定義為其他名稱(chēng)。改造后為:

// store/modules/page1.js

// 放置你要重置的數(shù)據(jù)
const initState = {

    page1Data: [],
}

// state
const state = {
    // 參數(shù)解構(gòu)
    ...initState,

    // 路由改變不想重置的數(shù)據(jù)
    page1Title: "",

    initState(){

        return initState
    }
}
全局 module 配置

定義全局 mutation 事件類(lèi)型

// store/types.js
export const RESET_STATES = "resetStates"

定義全局 mutation

// store/mutation.js

import * as types from "./types"

// 檢測(cè)所有的 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ā)重置方法

至此一切準(zhǔn)備就緒,只需要在路由改變時(shí)觸發(fā)重置的方法即可,在入口 vue 文件中處理

// components/app.vue

如果你的 chrome 瀏覽器安裝了 vuejs-devtools 在路由切換的時(shí)候就能夠很清晰的看到上一個(gè)路由數(shù)據(jù)的的重置過(guò)程。

總結(jié)

實(shí)例點(diǎn)這里。我們這里的 vuex 狀態(tài)重置,是每次路由切換遍歷所有的 store 中的狀態(tài),并把initState() 中的屬性重置,如果能做到把當(dāng)前的路由對(duì)應(yīng)的 state 重置就更好了,但是路由和 store 中的 module 并沒(méi)有關(guān)聯(lián)關(guān)系。這里只是提供一種重置 vuex 狀態(tài)的一種方案,如果有更好方案還請(qǐng)各位看官留言。如有不妥的地方也歡迎拍磚留言。

--完--

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/90631.html

相關(guān)文章

  • vuex重置所有state(可定制)

    摘要:這里為什么是一個(gè)數(shù)組呢因?yàn)檫@就是標(biāo)題所描述的可定制,如果頁(yè)面內(nèi)重置絕大部分狀態(tài),但需要保留其中一些狀態(tài)的時(shí)候我們可以通過(guò)我們傳遞過(guò)來(lái)的值來(lái)剔除相應(yīng)的,使其不被更新。 在正式場(chǎng)景中我們經(jīng)常遇到一個(gè)問(wèn)題,就是登出頁(yè)面或其他操作的時(shí)候,我們需要重置所有的vuex,讓其變?yōu)槌跏紶顟B(tài),那么,就涉及到了多種方法:1、頁(yè)面刷新: window.location.reload() 這個(gè)方法通過(guò)路由判斷...

    singerye 評(píng)論0 收藏0
  • vuex重置所有state(可定制)

    摘要:這里為什么是一個(gè)數(shù)組呢因?yàn)檫@就是標(biāo)題所描述的可定制,如果頁(yè)面內(nèi)重置絕大部分狀態(tài),但需要保留其中一些狀態(tài)的時(shí)候我們可以通過(guò)我們傳遞過(guò)來(lái)的值來(lái)剔除相應(yīng)的,使其不被更新。 在正式場(chǎng)景中我們經(jīng)常遇到一個(gè)問(wèn)題,就是登出頁(yè)面或其他操作的時(shí)候,我們需要重置所有的vuex,讓其變?yōu)槌跏紶顟B(tài),那么,就涉及到了多種方法:1、頁(yè)面刷新: window.location.reload() 這個(gè)方法通過(guò)路由判斷...

    LeviDing 評(píng)論0 收藏0
  • vue vuex vue-rouert后臺(tái)項(xiàng)目——權(quán)限路由(超詳細(xì)簡(jiǎn)單版)

    摘要:可以配合相關(guān)的官方文檔學(xué)習(xí)。上面的內(nèi)容說(shuō)的重點(diǎn),其實(shí)也算是項(xiàng)目的全部啦項(xiàng)目地址感覺(jué)還不錯(cuò)的話(huà)就請(qǐng)給個(gè)吧謝謝有什么問(wèn)題歡迎提問(wèn) 項(xiàng)目地址:vue-simple-template共三個(gè)角色:adan barbara carrie 密碼全是:123456 adan 擁有 最高權(quán)限A 他可以看到 red , yellow 和 blue 頁(yè)面(共三個(gè)頁(yè)面)barbara 擁有 權(quán)限B 他可以看到...

    olle 評(píng)論0 收藏0
  • 基于vue2 + muse-ui構(gòu)建的移動(dòng)端、PC端輕社區(qū)項(xiàng)目 F-Rent 友租

    摘要:如果有什么可以幫到你的無(wú)論是不是此項(xiàng)目中的問(wèn)題都可以在提出我會(huì)盡我所能幫你解決歡迎大佬們提出好的問(wèn)題和點(diǎn)子,我會(huì)第一時(shí)間去修正。 前言 本項(xiàng)目(友租)是基于Vue2、Vuex、Muse-UI、es6、webpack構(gòu)建的一個(gè)移動(dòng)端、PC端輕社區(qū)項(xiàng)目 項(xiàng)目地址GitHub 項(xiàng)目更新歷史 開(kāi)發(fā)環(huán)境 Macos + Vs code + Chrome 項(xiàng)目的靈感最初來(lái)源:由于我是一個(gè)宅男在...

    linkFly 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<