vuex

Vue.use(vuex)
const store = new Vuex.Store({
  state: {},
  getter: {},
  action:{},
  mutations:{}
})
store.commit()

Vuex 通過store選項(xiàng)惭聂,從根組件里注入到每一個(gè)子組件里辜纲,因此不需要在每個(gè)子組件里頻繁調(diào)用store拦耐,子組件通過this.$store 訪問到store

const app = new Vue({
  el: '#app',
  // 把 store 對象提供給 “store” 選項(xiàng),這可以把 store 的實(shí)例注入所有的子組件
  store,
  components: { Counter },
  template: `
    <div class="app">
      <counter></counter>
    </div>
  `
})

調(diào)用mapstate輔助函數(shù)

computed: {
  localComputed () { /* ... */ },
  // 使用對象展開運(yùn)算符將此對象混入到外部對象中
  ...mapState({
    // ...
  })
}

這樣我們就可以在子組件里直接使用這些狀態(tài)了扫俺,不是說所有的狀態(tài)都要存放在Vuex的state里面固翰,有些局部組件可以保留自身的狀態(tài)

getter

Vuex 允許我們在 store 中定義“getter”(可以認(rèn)為是 store 的計(jì)算屬性)羹呵。就像計(jì)算屬性一樣冈欢,getter 的返回值會根據(jù)它的依賴被緩存起來凑耻,且只有當(dāng)它的依賴值發(fā)生了改變才會被重新計(jì)算送火。

getters里的函數(shù)接受state作為其第一個(gè)參數(shù)
Getter 會暴露為store.getters 對象

可以在任何組件中使用getters里的屬性

computed: {
  x() {
    return this.$store.getters.doneTodosCount
  }
}

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


Mutation

更改 Vuex 的 store 中的狀態(tài)的唯一方法是提交 mutation。Vuex 中的 mutation 非常類似于事件:每個(gè) mutation 都有一個(gè)字符串的 事件類型 (type) 和 一個(gè) 回調(diào)函數(shù) (handler)弃衍。這個(gè)回調(diào)函數(shù)就是我們實(shí)際進(jìn)行狀態(tài)更改的地方坚俗,并且它會接受 state 作為第一個(gè)參數(shù):

const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    increment (state) {
      // 變更狀態(tài)
      state.count++
    }
  }
})

不能直接調(diào)用mutation.handler 方法,需要使用 store.commit 來觸發(fā)喚醒mutation.handler

store.commit('increment')

提交載荷Payload
向store.commit傳入額外的參數(shù)速缆,即mutation的載荷(payload)

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

一般payload 應(yīng)該是一個(gè)對象恩闻,這樣屬性更加易讀

規(guī)則

既然 Vuex 的 store 中的狀態(tài)是響應(yīng)式的,那么當(dāng)我們變更狀態(tài)時(shí)破停,監(jiān)視狀態(tài)的 Vue 組件也會自動更新。這也意味著 Vuex 中的 mutation 也需要與使用 Vue 一樣遵守一些注意事項(xiàng):

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

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

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

  • 以新對象替換老對象。例如朗鸠,利用 stage-3 的對象展開運(yùn)算符我們可以這樣寫:

    state.obj = { ...state.obj, newProp: 123 }
    

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

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

import { mapMutations } from 'vuex'

export default {
  // ...
  methods: {
    ...mapMutations([
      'increment', // 將 `this.increment()` 映射為 `this.$store.commit('increment')`

      // `mapMutations` 也支持載荷:
      'incrementBy' // 將 `this.incrementBy(amount)` 映射為 `this.$store.commit('incrementBy', amount)`
    ]),
    ...mapMutations({
      add: 'increment' // 將 `this.add()` 映射為 `this.$store.commit('increment')`
    })
  }
}

Action

action 不同的地方在于
Action 提交的是 mutation扰楼,而不是直接變更狀態(tài)。
Action 可以包含任意異步操作项栏。

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


兩種略微不同的調(diào)用方法

computed: {
    ...mapGetters(["isLogin", "user"])
  },


computed: mapGetters([
    'evenOrOdd'
  ]),
  methods: mapActions([
    'increment',
    'decrement',
    'incrementIfOdd',
    'incrementAsync'
  ])

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市币厕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖锡溯,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)左电,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門篓足,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事陪腌。” “怎么了染簇?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵锻弓,是天一觀的道長蝌箍。 經(jīng)常有香客問我暴心,道長专普,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任檀夹,我火速辦了婚禮炸渡,結(jié)果婚禮上丽已,老公的妹妹穿的比我還像新娘蚌堵。我一直安慰自己辰斋,他們只是感情好瘸味,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布旁仿。 她就那樣靜靜地躺著,像睡著了一般枯冈。 火紅的嫁衣襯著肌膚如雪毅贮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天尘奏,我揣著相機(jī)與錄音滩褥,去河邊找鬼。 笑死炫加,一個(gè)胖子當(dāng)著我的面吹牛瑰煎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播俗孝,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼酒甸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赋铝?” 一聲冷哼從身側(cè)響起插勤,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后农尖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體析恋,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卤橄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嚎货。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姐叁。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖处窥,靈堂內(nèi)的尸體忽然破棺而出滔驾,到底是詐尸還是另有隱情哆致,我是刑警寧澤摊阀,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布延曙,位于F島的核電站枝缔,受9級特大地震影響灵临,放射性物質(zhì)發(fā)生泄漏儒溉。R本人自食惡果不足惜顿涣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一孵淘、第九天 我趴在偏房一處隱蔽的房頂上張望揉阎。 院中可真熱鬧毙籽,春花似錦惧财、人聲如沸垮衷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽徐许。三九已至雌隅,卻和暖如春修械,著一層夾襖步出監(jiān)牢的瞬間肯污,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工剂桥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斟薇。 一個(gè)月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓蕊温,卻偏偏與公主長得像义矛,于是被迫代替她去往敵國和親了讨。 傳聞我的和親對象是個(gè)殘疾皇子前计,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 安裝 npm npm install vuex --save 在一個(gè)模塊化的打包系統(tǒng)中伶棒,您必須顯式地通過Vue.u...
    蕭玄辭閱讀 2,927評論 0 7
  • Vuex是什么? Vuex 是一個(gè)專為 Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式侧巨。它采用集中式存儲管理應(yīng)用的所有組件...
    蕭玄辭閱讀 3,111評論 0 6
  • Vuex 是一個(gè)專為 Vue.js 應(yīng)用程序開發(fā)的狀態(tài)管理模式皇忿。它采用集中式存儲管理應(yīng)用的所有組件的狀態(tài)鳍烁,并以相應(yīng)...
    白水螺絲閱讀 4,658評論 7 61
  • vuex 場景重現(xiàn):一個(gè)用戶在注冊頁面注冊了手機(jī)號碼爹梁,跳轉(zhuǎn)到登錄頁面也想拿到這個(gè)手機(jī)號碼,你可以通過vue的組件化...
    sunny519111閱讀 8,009評論 4 111
  • 喜歡里最讓人動心的谦纱,是相互的了然與試探绍昂。
    祈江閱讀 192評論 0 0