美文网首页Vue 入门教程收藏
33《Vue 入门教程》Vuex 介绍 modules 的使用

33《Vue 入门教程》Vuex 介绍 modules 的使用

作者: 木子教程 | 来源:发表于2022-02-20 09:28 被阅读0次

1. 前言

本节我们将介绍如何将 store 中的数据按模块划分。在复杂的大型项目中,如果将所有的数据都存在一个 state 对象中,那将使得 store 对象变得非常大,难于管理。这时候,使用 module 将变得异常重要。Modules 并非难点,接下来我们就一步步介绍 modules 的使用。

2. 如何使用

2.1 基本用法

Module 其实是一个对象,它和我们 new Vuex.Store ({…}) 传入的对象格式相同。例如:

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 的状态


2.2 模块的局部状态

对于模块内部的 mutation 和 getter,接收的第一个参数是模块的局部状态对象。

const moduleA = {
  state: { count: 0 },
  mutations: {
    increment (state) {
      // 这里的 `state` 对象是当前模块的局部状态
      state.count++
    }
  },

  getters: {
    doubleCount (state) {
      // 这里的 `state` 对象是当前模块的局部状态
      return state.count * 2
    }
  }
}

同样,对于模块内部的 action,局部状态通过 context.state 暴露出来,根节点状态则为 context.rootState:

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

对于模块内部的 getter,根节点状态会作为第三个参数暴露出来:

const moduleA = {
  // ...
  getters: {
    sumWithRootCount (state, getters, rootState) {
      return state.count + rootState.count
    }
  }
}

完整示例:

实例演示

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <div>模块 A 数量:{{moduleACount}}</div>
    <div>根节点 数量:{{rootCount}}</div>
    <div>数量总和:{{countSum}}</div>
    <button @click="addModuleCount">模块 A + 1</button>
    <button @click="addRootToModule">添加 root 至模块</button>
  </div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vuex@3.1.2/dist/vuex.js"></script>
<script type="text/javascript">
  const moduleA = {
    state: {
      count: 18
    },
    getters: {
      countSum(state, getters, rootState) {
        return state.count + rootState.count
      }
    },
    mutations: {
      addModuleCount(state) {
        state.count++
      },
      addModuleByCount(state, payload) {
        state.count = state.count + payload.count
      }
    },
    actions: {
      addRootToModule({state, commit, rootState}) {
        commit('addModuleByCount', {count: rootState.count})
      }
    }
  }
  const store = new Vuex.Store({
    modules: {
      a: moduleA,
    },
    state: {
      count: 20
    }
  })
  var vm = new Vue({
    el: '#app',
    store,
    computed: {
      countSum() {
        return this.$store.getters.countSum
      },
      moduleACount() {
        return this.$store.state.a.count
      },
      rootCount() {
        return this.$store.state.count
      }
    },
    methods: {
      addModuleCount() {
        this.$store.commit('addModuleCount')
      },
      addRootToModule() {
        this.$store.dispatch('addRootToModule')
      }
    }
  })
</script>
</html>


"运行案例" 可查看在线运行效果

代码解释
JS 代码第 4-26 行,我们定义了模块 moduleA。
JS 代码第 9-11 行,在 moduleA 定义 getter countSum。
JS 代码第 13-20 行,在 moduleA 定义 mutations。
JS 代码第 21-25 行,在 moduleA 定义 actions。
JS 代码第 27-34 行,我们定义了 store,并将 moduleA 传入 modules 的属性中。

3. 小结

本小节我们介绍了如何使用 Modules 进行模块化。主要有以下知识点:

  • 如何定义一个模块 module。
  • 在 store 中利用 modules 属性传入定义的模块 module。

相关文章

  • 33《Vue 入门教程》Vuex 介绍 modules 的使用

    1. 前言 本节我们将介绍如何将 store 中的数据按模块划分。在复杂的大型项目中,如果将所有的数据都存在一个 ...

  • vuex state 数据更新 vue组件mapState获取不

    问题 在vue组件内 通过commit 更新 vuex modules state 数据(obj),vue组件通过...

  • vue-vuex-modules的使用

    应用场景,当需要划分多模块时使用 创建项目选择router和vuex src/route/index.js中 在s...

  • VueX 学习笔记

    学习目的 了解和熟练使用 VueX,能够在实际项目中运用。 VueX介绍 Vuex 是一个专为 Vue.js ...

  • (十七)Vue3.x使用provide/inject来代替vue

    本章我们将介绍的是如何在vue3.x中使用provide/inject来代替vuex; 1、前言:在使用vuex的...

  • vueX modules的使用

    我一直以为最伤心的一句话是我不爱你,没想到更伤心的是对不起我忘不了他! 前端QQ群: 981668406在此附上我...

  • 小结

    项目构建介绍 参考 vuex demo 及 答题重构 Vue 版本建立项目结构 引入 vue-loader 使用 ...

  • vuex使用记录

    副标题:vuex使用详解、vue使用全局变量、vue使用 store 这篇博客主要记录了 vuex的使用方法,简单...

  • vue安装veux

    现在使用npm i 会默认安装vuex4,vuex4只适用于vue3,如果使用的vue环境是vue3,安装vuex...

  • 第四章3 创建分步表单

    当表单比较复杂时可以创建分步表单,同时使用vuex使用vuex,创建store文件夹,使用了modules定义st...

网友评论

    本文标题:33《Vue 入门教程》Vuex 介绍 modules 的使用

    本文链接:https://www.haomeiwen.com/subject/hmyylrtx.html