手把手教你學vue-4(vuex)

1.首先明白vuex是作什麼用的。

管理統一組件狀態state。每一個應用將僅僅包含一個 store 實例。單一狀態樹讓咱們可以直接地定位任一特定的狀態片斷,在調試的過程當中也能輕易地取得整個當前應用狀態的快照。

2.如何實現 vuex有幾個對象

  • state =>mapState
  • getters =>mapGetters
  • actions =>mapActions
  • mutations => mapMutations
  • moudle

3.state (注入store)

Vuex 經過 store 選項,提供了一種機制將狀態從根組件「注入」到每個子組件中(需調用 Vue.use(Vuex)):html

const app = new Vue({
  el: '#app',
  // 把 store 對象提供給 「store」 選項,這能夠把 store 的實例注入全部的子組件
  store,
  components: { Counter },
  template: `
    <div class="app">
      <counter></counter>
    </div>
  `
})

經過在根實例中註冊 store 選項,該 store 實例會注入到根組件下的全部子組件中,且子組件能經過 this.$store 訪問到
當咱們須要時刻跟蹤狀態值的變化時,能夠經過組件的計算機屬性來肯定,而後使用mapState.方法來映射。vue

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

4.getters (都是方法)

Vuex 容許咱們在 store 中定義「getter」(能夠認爲是 store 的計算屬性)。就像計算屬性同樣,getter 的返回值會根據它的依賴被緩存起來,且只有當它的依賴值發生了改變纔會被從新計算。
  • Getter 接受 state 做爲第一個參數
  • mapGetters 輔助函數僅僅是將 store 中的 getter
import { mapGetters } from 'vuex'
export default {
  computed: {
  // 使用對象展開運算符將 getter 混入 computed 對象中
    ...mapGetters([
      'doneTodosCount',
      'anotherGetter',
      // ...
    ])
  }
}

5. mutation

更改 Vuex 的 store 中的狀態的惟一方法是提交 mutation,調用方法 store.commit('increment')
  • 注意點git

    • 使用常量替代 Mutation 事件類型github

      export const SOME_MUTATION = 'SOME_MUTATION'
      // store.js
      import Vuex from 'vuex'
      import { SOME_MUTATION } from './mutation-types'
      
      const store = new Vuex.Store({
        state: { ... },
        mutations: {
          // 咱們可使用 ES2015 風格的計算屬性命名功能來使用一個常量做爲函數名
          [SOME_MUTATION] (state) {
            // mutate state
          }
        }
      })
  • Mutation 必須是同步函數
  • mapMutationsvuex

    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')`
       })
     }
       }

6.Action

  • Action 提交的是 mutation,而不是直接變動狀態。
  • Action 能夠包含任意異步操做。
context 不是 store 實例自己
Action 函數接受一個與 store 實例具備相同方法和屬性的 context 對象,所以你能夠調用 context.commit 提交一個 mutation,或者經過 context.state 和 context.getters 來獲取 state 和 getters。
actions: {
 increment ({ commit }) {
   commit('increment')
 }
}
mapActions 映射到組件
import { mapActions } from 'vuex'

export default {
  // ...
  methods: {
    ...mapActions([
      'increment', // 將 `this.increment()` 映射爲 `this.$store.dispatch('increment')`

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

7. Module

概念
Vuex 容許咱們將 store 分割成模塊(module)。每一個模塊擁有本身的 state、mutation、action、getter.相似redux裏面的reducer 針對每一個組件對應的state狀態作處理
const moduleA = {
  state: { ... },
  mutations: { ... },
  actions: { ... },
  getters: { ... }
}

const moduleB = {
  state: { ... },
  mutations: { ... },
  actions: { ... }
}

const store = new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB
  }
})

store.state.a // -> moduleA 的狀態
store.state.b // -> moduleB 的狀態
  • rootState

對於模塊內部的 action,局部狀態經過 context.state 暴露出來,根節點狀態則爲 context.rootState。
rootState 能夠獲取到全部mudule裏面的state值redux

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

這個仍是要多看官方的demo緩存

相關文章
相關標籤/搜索