vuex

vue是當(dāng)今比較火的一種框架,在很多方面都會(huì)用到Vue,今天帶大家簡(jiǎn)單了解一下vue中一款常用的插件VueX

首先Vuex 是什么?

Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲(chǔ)管理應(yīng)用的所有組件的狀態(tài),并以相應(yīng)的規(guī)則保證狀態(tài)以一種可預(yù)測(cè)的方式發(fā)生變化。Vuex 也集成到 Vue 的官方調(diào)試工具?devtools extension,提供了諸如零配置的 time-travel 調(diào)試、狀態(tài)快照導(dǎo)入導(dǎo)出等高級(jí)調(diào)試功能。

Vuex中基本的對(duì)象

state,驅(qū)動(dòng)應(yīng)用的數(shù)據(jù)源;

view,以聲明方式將?state?映射到視圖;

mutations:提交狀態(tài)修改。也就是set、get中的set,唯一修改state的方式 ,不支持異步操作 。

actions,響應(yīng)在?view?上的用戶輸入導(dǎo)致的狀態(tài)變化。State 單一狀態(tài)樹

mapState 輔助函數(shù)

對(duì)象展開運(yùn)算符

Getter 計(jì)算

通過屬性訪問

Getter 會(huì)暴露為 store.getters 對(duì)象,你可以以屬性的形式訪問這些值:

store.getters.doneTodos // -> [{ id: 1, text: '...', done: true }]

Getter 也可以接受其他 getter 作為第二個(gè)參數(shù):

getters:{// ...doneTodosCount:(state,getters)=>{returngetters.doneTodos.length}}store.getters.doneTodosCount// -> 1

使用:

computed:{doneTodosCount(){returnthis.$store.getters.doneTodosCount}}

通過方法訪問

getters:{// ...getTodoById:(state)=>(id)=>{returnstate.todos.find(todo=>todo.id===id)}}store.getters.getTodoById(2)// -> { id: 2, text: '...', done: false }

mapGetters 輔助函數(shù)

mapGetters 輔助函數(shù)僅僅是將 store 中的 getter 映射到局部計(jì)算屬性

Mutation 更改 Vuex 的方法

每個(gè) mutation 都有一個(gè)字符串的 事件類型 (type) 和 一個(gè) 回調(diào)函數(shù) (handler)

提交載荷(Payload)

你可以向 store.commit 傳入額外的參數(shù),即 mutation 的 載荷(payload):

// ...mutations:{increment(state,n){state.count+=n}}store.commit('increment',10)

對(duì)象風(fēng)格的提交方式

提交 mutation 的另一種方式是直接使用包含 type 屬性的對(duì)象

store.commit({type:'increment',amount:10})

當(dāng)使用對(duì)象風(fēng)格的提交方式,整個(gè)對(duì)象都作為載荷傳給 mutation 函數(shù),因此 handler 保持不變

Mutation 需遵守 Vue 的響應(yīng)規(guī)則

遵守一些注意事項(xiàng):

1.最好提前在你的 store 中初始化好所有所需屬性。

2.當(dāng)需要在對(duì)象上添加新屬性時(shí),你應(yīng)該

(1).使用 Vue.set(obj, 'newProp', 123), 或者

(2).以新對(duì)象替換老對(duì)象。

使用常量替代 Mutation 事件類型

Mutation 必須是同步函數(shù)

一條重要的原則就是要記住 mutation 必須是同步函數(shù)

在組件中提交 Mutation

使用 this.$store.commit('xxx') 提交 mutation,或者使用 mapMutations 輔助函數(shù)將組件中的 methods 映射為 store.commit 調(diào)用(需要在根節(jié)點(diǎn)注入 store)

Action

action 類似于 mutation,不同在于:

1.Action 提交的是 mutation,而不是直接變更狀態(tài)。

2.Action 可以包含任意異步操作.

分發(fā) Action

Action 通過 store.dispatch 方法觸發(fā):

store.dispatch('increment')

在組件中分發(fā) Action

使用 this.$store.dispatch('xxx') 分發(fā) action,或者使用 mapActions 輔助函數(shù)將組件的 methods 映射為 store.dispatch 調(diào)用(需要先在根節(jié)點(diǎn)注入 store)

組合 Action

store.dispatch 可以處理被觸發(fā)的 action 的處理函數(shù)返回的 Promise,并且 store.dispatch 仍舊返回 Promise

Module 模塊

每個(gè)模塊擁有自己的 state、mutation、action、getter、甚至是嵌套子模塊——從上至下進(jìn)行同樣方式的分割

模塊的局部狀態(tài)

對(duì)于模塊內(nèi)部的 mutation 和 getter,接收的第一個(gè)參數(shù)是模塊的局部狀態(tài)對(duì)象。

const moduleA={state:{count:0},mutations:{increment(state){// 這里的 `state` 對(duì)象是模塊的局部狀態(tài)state.count++}},getters:{doubleCount(state){returnstate.count*2}}}

模塊內(nèi)部的 action,局部狀態(tài)通過 context.state 暴露出來,根節(jié)點(diǎn)狀態(tài)則為 context.rootState

constmoduleA={// ...actions:{incrementIfOddOnRootSum({state,commit,rootState}){if((state.count+rootState.count)%2===1){commit('increment')}}}}

對(duì)于模塊內(nèi)部的 getter,根節(jié)點(diǎn)狀態(tài)會(huì)作為第三個(gè)參數(shù)暴露出來:

constmoduleA={// ...getters:{sumWithRootCount(state,getters,rootState){returnstate.count+rootState.count}}}

命名空間

默認(rèn)情況下,模塊內(nèi)部的 action、mutation 和 getter 是注冊(cè)在全局命名空間的——這樣使得多個(gè)模塊能夠?qū)ν?mutation 或 action 作出響應(yīng)。

在帶命名空間的模塊內(nèi)訪問全局內(nèi)容(Global Assets)

如果你希望使用全局 state 和 getter,rootState 和 rootGetters 會(huì)作為第三和第四參數(shù)傳入 getter,也會(huì)通過 context 對(duì)象的屬性傳入 action。

若需要在全局命名空間內(nèi)分發(fā) action 或提交 mutation,將 { root: true } 作為第三參數(shù)傳給 dispatch 或 commit 即可。

在帶命名空間的模塊注冊(cè)全局 action

若需要在帶命名空間的模塊注冊(cè)全局 action,你可添加 root: true,并將這個(gè) action 的定義放在函數(shù) handler 中

帶命名空間的綁定函數(shù)

當(dāng)使用 mapState, mapGetters, mapActions 和 mapMutations 這些函數(shù)來綁定帶命名空間的模塊時(shí),寫起來可能比較繁瑣

模塊動(dòng)態(tài)注冊(cè)

在 store 創(chuàng)建之后,你可以使用 store.registerModule 方法注冊(cè)模塊

// 注冊(cè)模塊 `myModule`store.registerModule('myModule',{// ...})// 注冊(cè)嵌套模塊 `nested/myModule`store.registerModule(['nested','myModule'],{// ...})

模塊重用

有時(shí)我們可能需要?jiǎng)?chuàng)建一個(gè)模塊的多個(gè)實(shí)例,例如:

創(chuàng)建多個(gè) store,他們公用同一個(gè)模塊 (例如當(dāng)runInNewContext選項(xiàng)是false或'once'時(shí),為了在服務(wù)端渲染中避免有狀態(tài)的單例)

在一個(gè) store 中多次注冊(cè)同一個(gè)模塊

如果我們使用一個(gè)純對(duì)象來聲明模塊的狀態(tài),那么這個(gè)狀態(tài)對(duì)象會(huì)通過引用被共享,導(dǎo)致狀態(tài)對(duì)象被修改時(shí) store 或模塊間數(shù)據(jù)互相污染的問題。

實(shí)際上這和 Vue 組件內(nèi)的data是同樣的問題。因此解決辦法也是相同的——使用一個(gè)函數(shù)來聲明模塊狀態(tài)(僅 2.3.0+ 支持)

作者:吃肉肉不吃肉肉

鏈接:http://www.itdecent.cn/p/ecad4ab4fa95

來源:簡(jiǎn)書

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ### store 1. Vue 組件中獲得 Vuex 狀態(tài) ```js //方式一 全局引入單例類 // 創(chuàng)建一...
    蕓豆_6a86閱讀 787評(píng)論 0 3
  • 安裝 npm npm install vuex --save 在一個(gè)模塊化的打包系統(tǒng)中,您必須顯式地通過Vue.u...
    蕭玄辭閱讀 3,038評(píng)論 0 7
  • 習(xí)慣養(yǎng)成很容易,戒掉卻很難!??! 什么是Vuex? Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式...
    前端又又閱讀 2,859評(píng)論 0 1
  • State 單一狀態(tài)樹 Vuex使用單一狀態(tài)樹——用一個(gè)對(duì)象就包含了全部的應(yīng)用層級(jí)狀態(tài)。至此它便作為一個(gè)“唯一數(shù)據(jù)...
    oWSQo閱讀 1,174評(píng)論 0 0
  • Vuex是什么? Vuex 是一個(gè)專為 Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲(chǔ)管理應(yīng)用的所有組件...
    蕭玄辭閱讀 3,232評(píng)論 0 6

友情鏈接更多精彩內(nèi)容