手把手教你學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)):

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

通過在根實例中注冊 store 選項,該 store 實例會注入到根組件下的所有子組件中,且子組件能通過 this.$store 訪問到
當我們需要時刻跟蹤狀態值的變化時,可以通過組件的計算機屬性來確定,然后使用mapState.方法來映射。

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')
  • 注意點

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

      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 必須是同步函數
  • mapMutations

       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值

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

這個還是要多看官方的demo


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM