markdown Vuex模块概念

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown Vuex模块概念相关的知识,希望对你有一定的参考价值。

## 分割

將`store`分割成`module`,每個`module`擁有自己的`state`、`mutation`、`action`、`getter`

```javascript
const moduleA = {
  namespaced: true,
  state: { ... },
  mutations: { ... },
  actions: { ... },
  getters: { ... }
}

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

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

store.state.moduleA // -> moduleA 的state狀態
store.state.moduleB // -> moduleB 的state狀態
```

## Module local status

module 內部的`mutation`和`getter`,接收的第一個參數為**Module 作用域物件**

```javascript
const moduleA = {
  namespaced: true,
  // count會寫到全域
  // 取用方法: $store.state.moduleA.count
  state: { count: 0 },
  mutations: {
    increment(state) {
      // state: Module 作用域物件
      state.count++
    }
  },

  getters: {
    // 取用方法: $store.getters.moduleA.doubleCount
    // 或: $store.rootGetters.doubleCount
    doubleCount(state) {
      return state.count * 2
    }
  }
}
```

`action`同樣也是使用**Module 作用域物件**

```javascript
const moduleA = {
  // ...
  actions: {
    // state: 作用域狀態
    // rootState: 根節點狀態
    actionIncrement({ state, commit, rootState }) {
      if ((state.count + rootState.count) % 2 === 1) {
        commit('increment')
      }
    }
  }
}
```

## 命名空間

默認情況下,模塊內部的 `action`、`mutation` 和 `getter` 是註冊在**全域命名空間**的

這樣使得多個模塊能夠對同一 `mutation` 或 `action` 作出響應

通過添加 `namespaced: true` 的方式使其成為帶命名空間的模塊

當模塊被註冊後,它的所有 `getter`、`action` 及 `mutation` 都會自動根據**模塊註冊的路徑**調整命名

```javascript
const store = new Vuex.Store({
  modules: {
    account: {
      namespaced: true,

      // 模塊內容(module assets)
      // 模塊內的狀態已經是嵌套的了,使用 `namespaced` 屬性不會對其產生影響
      state: { ... },
      getters: {
        isAdmin () { ... } // -> getters['account/isAdmin']
      },
      actions: {
        login () { ... } // -> dispatch('account/login')
      },
      mutations: {
        login () { ... } // -> commit('account/login')
      },

      // 嵌套模塊
      modules: {
        // 繼承父模塊的命名空間
        myPage: {
          state: { ... },
          getters: {
            profile () { ... } // -> getters['account/profile']
          }
        },

        // 進一步嵌套命名空間
        posts: {
          namespaced: true,

          state: { ... },
          getters: {
            popular () { ... } // -> getters['account/posts/popular']
          }
        }
      }
    }
  }
})
```

#### 帶命名空間的綁定函數

使用`mapState`、`mapGetters`、`mapActions` 和 `mapMutations`

通過使用 `createNamespacedHelpers` 創建基於某個命名空間輔助函數

可用於找**本身和別人**的`state`

```javascript
// 注意這一段
import { createNamespacedHelpers } from 'vuex'

const { mapState, mapActions } = createNamespacedHelpers('some/nested/module')

export default {
  computed: {
    // 在 `some/nested/module` 中查找
    ...mapState({
      a: state => state.a,
      b: state => state.b
    })
  },
  methods: {
    // 在 `some/nested/module` 中查找
    ...mapActions(['foo', 'bar'])
  }
}
```

以上是关于markdown Vuex模块概念的主要内容,如果未能解决你的问题,请参考以下文章

vuex中module的命名空间概念

vuex的5个核心概念四(modules)

vuex的五个核心概念

Vuex 核心概念基本使用 及 求和案例

Vuex 核心概念基本使用 及 求和案例

VueVuex概念和基本使用