vuex之module

  由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。

  为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割:

  • 在src下建立文件夹store,用于存放各个模块以及根级别的文件

  • 在index.js文件中导出store
import Vue from ‘vue‘
import Vuex from ‘vuex‘
import state from ‘./state‘
import mutations from ‘./mutations‘
import getters from ‘./getters‘
import actions from ‘./actions‘
import userManager from ‘./modules/userManager‘
import productManager from ‘./modules/productManager‘

Vue.use(Vuex);

//组装模块并导出 store 的地方
export default new Vuex.Store({
  //根节点相关
  state,
  mutations,
  getters,
  actions,

  //模块相关
  modules: {
    um:userManager,
    pm:productManager,

  },

});
  • 在main.js文件的Vue实例中注册store
import Vue from ‘vue‘
import App from ‘./App‘
import router from ‘./router‘

import store from ‘./store/index‘

new Vue({
  el: ‘#app‘,
  router,
  store, //注册store
  components: {App},
  template: ‘<App/>‘
});
  • 模块级别的文件中写于自己相关的代码

1、访问模块局部的状态

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

//局部mutations
  mutations: {

    //action中提交该mutation
    GETALLPRODUCT(state, data) {
      //当页面DOM元素即页面结构加载完成后执行此方法
      state.ProductList = data;
    },
  },

//局部getters,根节点状态会作为第三个参数暴露出来
  getters: {
    getHotProduct (state,getters,rootState) {
      return state.ProductList.filter(product => product.type === 1)
    },
    getHotProductById: (state) => (id) => {
      return state.ProductList.find(product => product.id === id)
    }
  }
}

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

 actions: {

    getAllProduct(context) {
      //局部状态通过 context.state 暴露出来,根节点状态则为 context.rootState:

      //发送get请求获取API数据
      axios.get(‘ http://127.0.0.1:8000/api/Productdata/‘)
        .then((response) => {
          // handle success
          context.commit(‘GETALLPRODUCT‘, response.data);
          console.log(‘getters‘,context.getters.getHotProduct)

        })
}

2、命名空间

  默认情况下,模块内部的 action、mutation 和 getter 是注册在全局命名空间的——这样使得多个模块能够对同一 mutation 或 action 作出响应。

    如果希望你的模块具有更高的封装度和复用性,你可以通过添加 namespaced: true 的方式使其成为带命名空间的模块。当模块被注册后,它的所有 getter、action 及 mutation 都会自动根据模块注册的路径调整命名。

export default {

  namespaced: true, //拥有自己的命名空间

  state: {
    ProductList: [],

  },
  mutations: {
  },

  actions: {
  },

  getters: {
    getHotProductById: (state) => (id) => {
      return state.ProductList.find(product => product.id === id)
    }

  }

}

此时,在组件中调用就需要根据路径进行调用:

2.1 调用模块中的state

    computed: {
      UserList() {
        return this.$store.state.um.UserList //UserList 是在模块中定义的state状态
      },
    },

2.2 调用模块中getters

        computed:{
          hotProductArray(){

            return this.$store.getters[‘pm/getHotProduct‘] //调用无参getters

          }
        }

      methods:{
          getProductById(){
        this.$store.getters[‘pm/getHotProductById‘](this.id) //调用有参数的getters

              }

          }
      },            

2.3 提交actions

        mounted() {

          this.$store.dispatch("pm/getAllProduct") //提交局部模块的actions
        },

3、在带命名空间的模块注册全局 action

若需要在带命名空间的模块注册全局 action,你可添加 root: true,并将这个 action 的定义放在函数 handler 中。

    //在有命名空间actions中注册全局action因为有root: true,
    getAllUserList: {
      root: true,
      handler (context, payload) {
        //发送get请求获取API数据
        axios.get(‘ http://127.0.0.1:8000/api/userdata/‘)
          .then((response) => {
            // handle success
            context.commit(‘um/GETALLUSER‘, response.data); //全局中使用局部的mutation
            console.log(response.data)

          })
          .catch((error) => {
            // handle error
            console.log(error);
          })
          .finally(() => {
            // always executed
          });

      } // -> ‘someAction‘
    },

此时虽然这个antion在某个模块文件内,但是确实全局的命名空间,因此像分发action这类的操作可以直接这样:

this.$store.dispatch("getAllUserList");

参考文档:https://vuex.vuejs.org/zh/guide/modules.html

原文地址:https://www.cnblogs.com/shenjianping/p/11314719.html

时间: 2024-10-24 03:24:25

vuex之module的相关文章

vuex中module的命名空间概念

vuex中module的命名空间概念 默认情况下,模块内部的 action.mutation 和 getter 是注册在全局命名空间的. 弊端1:不同模块中有相同命名的mutations.actions时,不同模块对同一 mutation 或 action 作出响应. 弊端2:当一个项目中store分了很多模块的时候,在使用辅助函数mapState.mapGetters.mapMutations.mapActions时,很难查询,引用的state.getters.mutations.action

[Vuex系列] - Module的用法(终篇)

于使用单一状态树,应用的所有状态会集中到一个比较大的对象.当应用变得非常复杂时,store 对象就有可能变得相当臃肿.为了解决以上问题,Vuex 允许我们将 store 分割成模块(module).每个模块拥有自己的state.mutation.action.getter.甚至是嵌套子模块——从上至下进行同样方式的分割: 如何使用module 在store文件夹下新建modules文件夹,并在下面建立moduleA.js和moduleB.js文件用来存放vuex的modules模块 module

【mock.js】后端不来过夜半,闲敲mock落灯花 (附Vue + Vuex + mockjs的简单demo)

mock的由来[假] 赵师秀:南宋时期的一位前端工程师 诗词背景:在一个梅雨纷纷的夜晚,正处于项目编码阶段,书童却带来消息:写后端的李秀才在几个时辰前就赶往临安度假去了,!此时手头仅有一个简单的数据接口文档的赵师秀慨叹一声:"好吧,那还是我自己先模拟一下后端的接口吧" _(:3 」∠)_  再后来,就有了那句千古名句啦~~( 为了表示对赵师秀先生的歉意,文末我将附上原文)   如果我说这就是前后端分离思想和mock.js的由来,你会信么?(?´ω`?) mock的由来[真] 我们在Vu

Vuex框架原理与源码分析

Vuex是一个专为Vue服务,用于管理页面数据状态.提供统一数据操作的生态系统.它集中于MVC模式中的Model层,规定所有的数据操作必须通过 action - mutation - state change 的流程来进行,再结合Vue的数据视图双向绑定特性来实现页面的展示更新.统一的页面状态管理以及操作处理,可以让复杂的组件交互变得简单清晰,同时可在调试模式下进行时光机般的倒退前进操作,查看数据改变过程,使code debug更加方便. 最近在开发的项目中用到了Vuex来管理整体页面状态,遇到

vuex源码简析

前言 基于 vuex 3.12 按如下流程进行分析: Vue.use(Vuex); const store = new Vuex.Store({ actions, getters, state, mutations, modules // ... }); new Vue({store}); Vue.use(Vuex) Vue.use() 会执行插件的 install 方法,并把插件放入缓存数组中. 而 Vuex 的 install 方法很简单,保证只执行一次,以及使用 applyMixin 初始

vue.js应用开发笔记

看vue.js有几天了,之前也零零散散的瞅过,不过一直没有动手去写过demo,这几天后台事比较少,一直在讨论各种需求(其实公司对需求还是比较重视与严谨的,一个项目需求讨论就差不多一周了,这要搁之前,天哪...),于是就琢磨着把vue简单的过下,如下所讲只是个人一些理解,不到的地方还望园友指正,涉及到的东西有vue.vue-router.vuex.axios以及nodejs一些后台东西,废话不说了直接上菜吧. 一.vue.js 1.项目搭建使用vue-cli脚手架,首先必须安装vue.vue-cl

vue经验总结

1. vue中获取dom节点时机 vue组件中获取dom节点一定要在mounted周期之后的下一次事件循环,包括 component.$refs,component.$el,component.$children等一般写法在nextTick中获取,mounted不是必须:mounted(){ this.$nextTick(() = { const el = this.$el; })} 2.watch变量合并更新 vue的dom更新是异步的,因此watch一个变量时候,短时间内频繁更新该变量的值,

服务端预渲染之Nuxt - (爬坑篇)

Nuxt是解决SEO的比较常用的解决方案,随着Nuxt也有很多坑,每当突破一个小技术点的时候,都有很大的成就感,在这段时间里着实让我痛并快乐着.在这里根据个人学习情况,所踩过的坑做了一个汇总和总结. Nuxt开发跨域 项目可以使用Nginx来反向代理,将外来的请求(这里也注意下将Linux的防火墙放行相应端口)转发的内部Nuxt默认的3000端口上,最简单的配置文件如下: nuxtjs.config.js { modules: [ '@nuxtjs/axios', '@nuxtjs/proxy'

【转】大型Vuex项目 ,使用module后, 如何调用其他模块的 属性值和方法

Vuex 允许我们把 store 分 module(模块).每一个模块包含各自的状态.mutation.action 和 getter. 那么问题来了, 模块化+命名空间之后, 数据都是相对独立的, 如果想在模块 A 调用 模块 B 的state, actions, mutations, getters, 该肿么办? 假设有这么两个模块: 模块A: import api from '~api' const state = { vip: {}, } const actions = { async