vuex深入學習 Module

2021-08-28 06:06:56 字數 4687 閱讀 9135

vuex深入學習 — module

由於使用單一狀態樹,應用的所有狀態會集中到乙個比較大的物件。當應用變得非常複雜時,store 物件就有可能變得相當臃腫。

為了解決以上問題,vuex 允許我們將 store 分割成模組(module)

每個模組擁有自己的 state、mutation、action、getter、甚至是巢狀子模組——從上至下進行同樣方式的分割

const modulea = ,

mutations: ,

actions: ,

getters:

}const moduleb = ,

mutations: ,

actions:

}const store = new vuex.store(

})

store.state.a // -> modulea 的狀態

store.state.b // -> moduleb 的狀態

模組的區域性狀態

對於模組內部的 mutation 和 getter,接收的第乙個引數是模組的區域性狀態物件

const modulea = ,

mutations:

},getters:

}}

同樣,對於模組內部的 action,區域性狀態通過 context.state 暴露出來

根節點狀態則為context.rootstate

const modulea = ) }}

}

對於模組內部的 getter,根節點狀態會作為第三個引數暴露出來:

const modulea = 

}}

命名空間

預設情況下,模組內部的 action、mutation 和 getter 是註冊在全域性命名空間的——這樣使得多個模組能夠對同一

mutation 或 action 作出響應。

如果希望模組具有更高的封裝度和復用性,你可以通過新增 namespaced: true 的方式使其成為帶命名空間的模組

當模組被註冊後,它的所有 getter、action 及 mutation 都會自動根據模組註冊的路徑調整命名。例如:

const store = new vuex.store(, // 模組內的狀態已經是巢狀的了,使用 `namespaced` 屬性不會對其產生影響

getters: // -> getters['account/isadmin']

},actions: // -> dispatch('account/login')

},mutations: // -> commit('account/login')

},// 巢狀模組

modules: ,

getters: // -> getters['account/profile']}},

// 進一步巢狀命名空間

posts: ,

getters: // -> getters['account/posts/popular']}}

}}}})

啟用了命名空間的 getter 和 action 會收到區域性化的 getter,dispatch 和 commit。

你在使用模組內容(module assets)時不需要在同一模組內額外新增空間名字首

更改 namespaced 屬性後不需要修改模組內的**。

在帶命名空間的模組內訪問全域性內容(global assets)

如果你希望使用全域性 state 和 getter,rootstate 和 rootgetter 會作為第三和第四引數傳入

getter,也會通過 context 物件的屬性傳入 action。 若需要在全域性命名空間內分發 action 或提交 mutation

將 作為第三引數傳給 dispatch 或 commit 即可。

modules: ,

someothergetter: state =>

},actions: ) ) // -> 'someotheraction'

commit('somemutation') // -> 'foo/somemutation'

commit('somemutation', null, ) // -> 'somemutation'

},someotheraction (ctx, payload)

}}

}

在帶命名空間的模組註冊全域性 action

若需要在帶命名空間的模組註冊全域性 action,你可新增 root: true,並將這個 action 的定義放在函式 handler

中。例如:

) 

},modules: // -> 'someaction'}}

}}}

帶命名空間的繫結函式

當使用 mapstate, mapgetters, mapactions 和 mapmutations

這些函式來繫結帶命名空間的模組時,寫起來可能比較繁瑣:

computed: )

},methods:

對於這種情況,你可以將模組的空間名稱字串作為第乙個引數傳遞給上述函式,這樣所有繫結都會自動將該模組作為上下文。於是上面的例子可以簡化為:

computed: )

},methods:

而且,你可以通過使用createnamespacedhelpers建立基於某個命名空間輔助函式

它返回乙個物件,物件裡有新的繫結在給定命名空間值上的元件繫結輔助函式

import  from 'vuex'

const = createnamespacedhelpers('some/nested/module')

export default )

},methods:

}

給外掛程式開發者的注意事項

如果你開發的外掛程式(plugin)提供了模組並允許使用者將其新增到 vuex store,可能需要考慮模組的空間名稱問題

對於這種情況,你可以通過外掛程式的引數物件來允許使用者指定空間名稱:

// 通過外掛程式的引數物件得到空間名稱

// 然後返回 vuex 外掛程式函式

export function createplugin (options = {})

}

模組動態註冊

在 store 建立之後,你可以使用 store.registermodule 方法註冊模組:

// 註冊模組 `mymodule`

store.registermodule('mymodule', )

// 註冊巢狀模組 `nested/mymodule`

store.registermodule(['nested', 'mymodule'], )

之後就可以通過 store.state.mymodule 和 store.state.nested.mymodule 訪問模組的狀態。

模組動態註冊功能使得其他 vue 外掛程式可以通過在 store 中附加新模組的方式來使用 vuex 管理狀態

例如,vuex-router-sync 外掛程式就是通過動態註冊模組將 vue-router 和 vuex 結合在一起,實現應用的路由狀態管理。

你也可以使用 store.unregistermodule(modulename) 來動態解除安裝模組

注意,你不能使用此方法解除安裝靜態模組(即建立 store 時宣告的模組)

在註冊乙個新 module 時,你很有可能想保留過去的 state

例如從乙個服務端渲染的應用保留 state。你可以通過 preservestate 選項將其歸檔:

store.registermodule('a', module, )。
模組重用

有時我們可能需要建立乙個模組的多個例項,例如:

建立多個 store,他們公用同乙個模組 (例如當 runinnewcontext 選項是 false 或 『once』

時,為了在服務端渲染中避免有狀態的單例) 在乙個 store 中多次註冊同乙個模組

如果我們使用乙個純物件來宣告模組的狀態,那麼這個狀態物件會通過引用被共享,導致狀態物件被修改時 store 或模組間資料互相汙染的問題。

實際上這和 vue 元件內的 data 是同樣的問題。因此解決辦法也是相同的——使用乙個函式來宣告模組狀態(僅 2.3.0+ 支援)

const myreusablemodule = 

},// mutation, action 和 getter 等等...

}

Vuex的深入學習

一 狀態管理vuex 1.vuex使用 vuex是乙個專為vue.js應用程式開發的狀態管理模式。它採用集中式儲存管理應用的所有元件的狀態,並以對應的規則保證狀態以一種可 的方式發生變化。1 state 單一狀態書,每個應用將僅僅包含乙個store例項 this.store.state.狀態名字 m...

Vuex 學習6 核心概念Module

教程來自vuex官網 和技術胖教程 模組組一般不用再專案較小的情況 由於使用單一狀態數,醫用的所有狀態都會幾種到乙個比較大的物件。當應用變得非常複雜時,store 物件就有可能變得相當臃腫。為了解決以上問題,vuex 允許我們將 store 分割成模組 module 每個模組擁有自己的 state ...

UIApplication深入學習

新建乙個任意型別的ios應用工程,加入我們在class prefix輸入是tc,我們可以看到工程中生成乙個類 在main函式中,autoreleasepool 函式中 說明 當應用程式將要入非活動狀態執行,在此期間,應用程式不接收訊息或事件。比如來 了。說明 當應用程式入活動狀態執行,這個剛好跟上面...