Vuex4.x(五)模块管理(上)

作者: 自然框架 | 来源:发表于2021-02-15 14:03 被阅读0次

module 的用法

一开始以为模块只能是一层,仔细看了官网才发现,原来模块还可以有n层,即子模块、子子模块、子子子模块无穷匮也。而且还可以动态注册模块。这是要疯的节奏呀。

我还是感觉模块应该扁平化设计,最多两层,多了就容易乱套,理解起来也费劲。

定义模块

const user = {
  // namespaced: true, // 避免重名
  state: () => ({
    userInfo: {
      userId: 123,
      userCode: '',
      userNick: ''
    },
    userRole: []
  }),
  mutations: { 
    setUser(state, code) {
      state.userInfo.userCode = code
    }
  },
  getters: {
    getUser(state)  {
      return state.userInfo
    } 
  },
  actions: {
    // { state, commit, rootState }
    setUsera (store, code) {
      store.commit('setUser', code)
    }
  }
}

export default user

state

这里有点变化,需要用返回函数的方式,原因和组件里的data的原因类似。这样也就意味着一个模块可以被多次加载进来。

  • 访问方式
const userInfo = store.state.user.userInfo

getter

简单的说,没啥变化,传递进来的state只包含自己模块的state。

  • 访问方式
const userInfo2 = store.getters.getUser
031getter的state参数.png

mutations

简单的说,也是没啥变化,传递进来的state只包含自己模块的state,另一个参数是组件调用时传递进来的参数。

  • 访问方式
store.commit('setUser', '要修改的数据')
030setter的state参数.png

action

简单的说呢,也是只需要操作自己的模块的就行。

  • store
    这个参数是一个比较复杂的对象,全部成员如下图,一般可以用结构的方式获取需要的参数,比如这样:{ state, commit, rootState }。


    020action的参数store0.png

参数详细内容:


020action的参数store.png

可以依据这些内容实现各种功能。

020action的参数store2.png
  • code
    第二个大参数,就是组件调用的时候传递过来的参数。

  • 访问方式

store.dispatch('setUsera', '要修改的数据')

加载模块到store

模块代码写好了,如何加入进来呢?其实很方便,可以直接写,也可以挂个别名。

export default Vuex.createStore({
  state: {
    count: 0,
    myObject: {
      time: '现在的时间:'
    },
    myArray: [1,2,2,3,4]
  },
  getters: {},
  mutations: {},
  actions: {},
  modules: {
    // 注意:这个myObject会覆盖掉根的myObject。
    // 设置命名空间也没有用,还是会覆盖。
    // 所以要避免重名。
    myObject: user, 
    user: user,
    person: user
  }
})

命名空间

  • namespaced: true
    简单的说,这个是避免命名重复的问题的。
    我们可以把user模块加载三次来看看区别。

不加命名空间

  • state
    模块的导入名称会和根的 根state的成员 并列,如果重名的话,根的state成员会被覆盖掉。
    比如这里根state的成员myObject,就被覆盖掉了。
    蓝色框是根的state的成员。
    红色框是被覆盖的。
    橙色框是两个模块。
005没有命名空间的state.png
  • mutations
    会变成数组形式,每个模块的同名都会被调用。


    001没有命名空间的setter.png
  • action
    也会变成数组的形式,每个模块的同名action都会被调用


    002没有命名空间的action.png
  • getter
    只会保留一个,另外两个会报错。


    004没有命名空间的getter的报错.png

加上命名空间

state不受影响,其他都会加上“路径”作为区分。

  • state
    还是那个样子,没有变化。

  • mutations
    由斜线分隔组成的路径,这样可以明确区分是哪个模块的函数,不会弄错。

访问方式:

  store.commit('user/setUser', 'user的code')
  store.commit('myObject/setUser', 'myObject的code')
  store.commit('person/setUser', 'person的code')

可以分别给每个模块的state设置内容,那么其实就是一个模块。

006有命名空间的setter.png
  • action
    也是由斜线区分。

访问方式:

  store.dispatch('user/setUsera', 'action的user的code')
008有命名空间的action.png
  • getter
    也是用斜线分隔开。

访问方式:

store.getters['user/getUser']

因为有斜线,所以需要用字符串的方式来访问。

009有命名空间的getter.png

官网还有更牛叉的功能,我先不说了,头有点疼……

在线演示:

https://naturefwvue.github.io/nf-vue-cnd/cnd/project-vuex/

源码:

https://github.com/naturefwvue/nf-vue-cnd/tree/main/cnd/project-vuex

相关文章

  • Vuex4.x(五)模块管理(上)

    module 的用法 一开始以为模块只能是一层,仔细看了官网才发现,原来模块还可以有n层,即子模块、子子模块、子子...

  • Linux_306_Ansible模块之script执行脚本

    script模块功能:把管理机器上的脚本远程的传输到被管理节点上去执行比起shell模块,script模块功能更强...

  • Linux_309_Ansible模块之script执行脚本

    script模块功能:把管理机器上的脚本远程的传输到被管理节点上去执行比起shell模块,script模块功能更强...

  • sales-portal-web依赖分析

    1. 简介 营销系统管理后台,包含专题管理、投放管理、地区活动、预算管理、权限管理五个模块。 1.1 预算管理 活...

  • 【时间管理100讲】精髓全在这里啦

    理论模块 精力管理。 行动管理。 学习模块。 高空模块。 反思模块。 运动模块。 阅读模块。 旅行模块。 人际关系...

  • Python2.7爬虫-爬取简书文章-入门

    参考原文: python开发简单爬虫Python爬虫实战Firefox抓包分析 分为五个模块:主模块、URL管理器...

  • 2021-04-29CRM的模块构成

    CRM系统主要有6个模块组成,分别是销售管理模块、客户反馈模块、市场管理模块、数据分析模块、社交关系管理模块、客诉...

  • 导读:课程学习指南

    一起学习时间管理: 5大模块+12大主题+30天训练营 五大模块 循序渐进! 1.认识时间管理 2.掌握时间管理的...

  • 现代的模块机制

    概览 大多数模块依赖加载器/管理器本质上都是将模块定义封装进一个API。 内容 模块依赖加载器/管理器的实现 核心...

  • Django在线教育网站开发(一)app设计

    经分析,在线教育网站的app主要包括用户管理模块、课程管理模块、机构和教师管理模块和用户操作管理模块四个APP

网友评论

    本文标题:Vuex4.x(五)模块管理(上)

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