Vuex 强调使用单一状态树,即在一个项目里只有一个 store,这个 store 集中管理了项目中所有的数据以及对数据的操作行为。但是这样带来的问题是 store 可能会非常臃肿庞大不易维护,所以就需要对状态树进行模块化的拆分。

首先贴出一个逻辑比较复杂的H5项目:DEMO & 源码

该项目主要包括 banner、feeds、profile 三个部分。其中 feeds 模块最复杂,需要对数据列表进行处理,如果单条数据中是图片:1张按照屏幕宽展示;2张各占50%;3张以上采用九宫格形式展示;如果单条数据是视频,则显示播放按钮,播放一条视频时,其他视频暂停。

由于该项目数据、交互较多,我们使用 Vuex 对数据进行托管,只在 Vue 组件中保留最基本的操作。

如果不使用 Vuex,许多数据流需要通过 props 的方便向下传递,十分不便,尤其是一些跨组件的操作更加困难。使用 Vuex 后就可以将数据与操作保留在 store 中,每个组件都能轻松调用。

本项目中除了根 store 以外,还通过 module 将各组件的 store 分开管理,还不了解的同学可以往下看。

Module

首先介绍下基本的组件化规则:你可以根据项目组件的划分来拆分 store,每个模块里管理着当前组件的状态以及行为,最后将这些模块在根 store 进行组合。

const moduleA = {state: { ... },getters: { ... }mutations: { ... }
};const moduleB = {state: { ... },getters: { ... },mutations: { ... },actions: { ... }
};const store = new Vuex.Store({modules: {a: moduleA,b: moduleB}
});console.log(store.state.a); // moduleA 的 state

接下来看 Vuex 核心在模块化后的使用注意事项。

请参考上文 Vuex 核心知识 (2.0)

State

在 Vuex 模块化中,state 是唯一会根据组合时模块的别名来添加层级的,后面的 getters、mutations 以及 actions 都是直接合并在 store 下。

例如,访问模块 a 中的 state,要通过 store.state.a,访问根 store 上申明的 state,依然是通过 store.state.xxx 直接访问。

const moduleA = {state: {maState: 'A'}
};const moduleB = {state: {mbState: 'B'}
};const store = new Vuex.Store({modules: {a: moduleA,b: moduleB},state: {rtState: 'Root'}
});console.log(store.state.a.maState); // A
console.log(store.state.b.mbState); // B
console.log(store.state.rtState); // Root

Getters

与 state 不同的是,不同模块的 getters 会直接合并在 store.getters 下

const moduleA = {state: {count: 1},getters: {maGetter(state, getters, rootState) {return state.count + rootState.b.count;}}
};const moduleB = {state: {count: 2},getters: {mbGetter() {return 'Hello Vuex';}}
};const store = {modules: {a: moduleA,b: moduleB}
};console.log(store.getters.maGetter); // 3
console.log(store.getters.mbGetter); // Hello Vuex

在上文我们介绍过 getters 的回调函数所接收的前两个参数,模块化后需要用到第三个参数——rootState。参数: 1. state,模块中的 state 仅为模块自身中的 state;2. getters,等同于 store.getters;3. rootState,全局 state。

通过 rootState,模块中的 getters 就可以引用别的模块中的 state 了,十分方便。

注意:由于 getters 不区分模块,所以不同模块中的 getters 如果重名,Vuex 会报出 'duplicate getter key: [重复的getter名]' 错误。

Mutations

mutations 与 getters 类似,不同模块的 mutation 均可以通过 store.commit 直接触发。

const moduleA = {state: {count: 1},mutations: {sayCountA(state) {console.log('Module A count: ', state.count);}}
};const moduleB = {state: {count: 2},mutations: {sayCountB(state) {console.log('Module B count: ', state.count);}}
};const store = {modules: {a: moduleA,b: moduleB}
};store.commit('sayCountA'); // Module A count: 1
store.commit('sayCountB'); // Module B count: 2 

mutation 的回调函数中只接收唯一的参数——当前模块的 state。如果不同模块中有同名的 mutation,Vuex 不会报错,通过 store.commit 调用,会依次触发所有同名 mutation。

Actions

与 mutations 类似,不同模块的 actions 均可以通过 store.dispatch 直接触发。

const moduleA = {state: {count: 1},mutations: {sayCountA(state) {console.log('Module A count: ', state.count);}},actions: {maAction(context) {context.dispatch('mbAction');}}
};const moduleB = {state: {count: 2},mutations: {sayCountB(state, num) {console.log('Module B count: ', state.count+num);}},action: {mbAction({ commit, rootState }) {commit('sayCountA');commit('sayCountB', rootState.a.count);}}
};const store = {modules: {a: moduleA,b: moduleB}
};store.dispatch('maAction'); // Module A count: 1、Module B count: 3

从上例可以看出,action 的回调函数接收一个 context 上下文参数,context 包含:1. state、2. rootState、3. getters、4. mutations、5. actions 五个属性,为了简便可以在参数中解构。

在 action 中可以通过 context.commit 跨模块调用 mutation,同时一个模块的 action 也可以调用其他模块的 action。

同样的,当不同模块中有同名 action 时,通过 store.dispatch 调用,会依次触发所有同名 actions。

最后有一点要注意的是,将 store 中的 state 绑定到 Vue 组件中的 computed 计算属性后,对 state 进行更改需要通过 mutation 或者 action,在 Vue 组件中直接进行赋值 (this.myState = 'ABC') 是不会生效的。

感谢你的浏览,希望能有所帮助。

转载于:https://www.cnblogs.com/libin-1/p/6400936.html

Vuex 模块化与项目实例 (2.0)相关推荐

  1. Vuex核心知识(2.0)

    Vuex核心知识(2.0) 转自:http://www.cnblogs.com/ghost-xyx/p/6380689.html Vuex 是一个专门为 Vue.js 应该程序开发的状态管理模式,它类 ...

  2. vuex结合php,Vuex模块化(module)实例详解

    本文主要和大家介绍Vuex 模块化(module),小编觉得挺不错的,现在分享给大家,也给大家做个参考,希望能帮助到大家. 一.为什么需要模块化 前面我们讲到的例子都在一个状态树里进行,当一个项目比较 ...

  3. 西门子wincc工程项目实例 wincc7.0 水处理项目水,处理工程项目

    西门子wincc工程项目实例 wincc7.0 水处理项目水,处理工程项目(渗透.反渗透.含锌水.含铬水处理.制造纯水等)其中包括配套的S7程序. 此项目工程中,对结构变量,脚本,C语言,以及怎样将报 ...

  4. 西门子wincc工程项目实例 wincc7.0 水处理项目水,处理工程项目(渗透、反渗透、含锌水、含铬水处理、制造纯水等)其中包括配套的S7程序

    西门子wincc工程项目实例 wincc7.0 水处理项目水,处理工程项目(渗透.反渗透.含锌水.含铬水处理.制造纯水等)其中包括配套的S7程序. 此项目工程中,对结构变量,脚本,C语言,以及怎样将报 ...

  5. vuex模块化--根模块与子模块的定义结构、【[vuex] unknown mutation type: /setThemeState】错误解决【子模块state有但mutation没有】

    记录一下关于vuex的学习之初,根模块与子模块的定义方式.搜了很多资料,但是似懂非懂,大多按照官方文档讲解,不太好直接照搬实操.于是这里记录一下操作,如有说的不对的,请各位大佬们指教! ps:如果朋友 ...

  6. vuex模块化 怎么引用state_[Vuex系列] - 细说state的几种用法

    state 存放的是一个对象,存放了全部的应用层级的状态,主要是存放我们日常使用的组件之间传递的变量. 我们今天重点讲解下state的几种用法,至于如何从头开始创建Vuex项目,请看我写的第一个文章. ...

  7. vuex express mysql_基于Vue2.0+Vuex+Axios+NodeJs+Express+MySQL实现京东移动web商城

    经过一个多月总算完成第一个版本 前端架构 页面结构(H5,CSS3,原生JS) 框架(基于Vue脚手架:vue-cli)进行搭建 数据请求处理框架(Axios) Vue-Router进行路由处理 Vu ...

  8. VUEX模块化不同模块调用其它模块的mutations报错: [vuex] unknown mutation type: XXX

    cart.js mutations:{delGoods(){ console('删除商品') }} order.js mutations:{createdorder(){ commit('delGoo ...

  9. vue vuex 模块化 namespace

    总结: 如果不用map写的话,就如下只有state数据形式结构是正常的 但是mutations和actions和getters写法都会不一样.因为它的内容包裹不一样了 如果不模块化的话,就像这边,求和 ...

最新文章

  1. 【操作系统】考研の处理机调度算法(看不懂你来打我~!)
  2. 设计模式(二)工厂模式
  3. Axis --SOAP引擎
  4. 写一个“特殊”的查询构造器 - (四、条件查询:复杂条件)
  5. 机器学习实战 11- SVD
  6. [转]ASP.NET MVC中你必须知道的13个扩展点
  7. 软件开发学习资料大全
  8. 边缘计算(二)边缘计算与智能制造
  9. 修改植物大战僵尸数据
  10. 【复】从0到1的 selenium 爬虫经历
  11. matlab绘制加速度曲线,加速度积分得到速度和位移的问题小结
  12. mysql的dba是什么_mysql dba是什么意思?
  13. 苹果safari浏览器怎么样(好不好用)
  14. 异常 exception
  15. css html 鼠标手型,鼠标形状,鼠标效果,样式
  16. 力扣解题思路:488. 祖玛游戏
  17. otg usb 定位_什么是USB OTG?USB OTG是什么意思
  18. 基于机器学习的恶意软件检测(二)
  19. 有偏估计 无偏估计matlab,有偏估计和无偏估计
  20. 傅里叶变换、离散余弦变换、拉普拉斯变换、Z变换

热门文章

  1. oracle外表日期,三步教会您掌握oracle外表(external table)
  2. 电子科大专科c语言作业1,电子科大15春《C语言(专科)》在线作业试卷.docx
  3. Command mysql 中文,MySQL Command Line[mysql命令行常用命令]_MySQL
  4. 《MySQL——order by逻辑(全字段排序与rowid排序)》
  5. 车刀 matlab,可转位车刀的结构
  6. uva 11387——The 3-Regular Graph
  7. uva 294 ——Divisors
  8. [Qt] 解决toggled无法触发setVisible
  9. linux操作系统之信号量、互斥量在进程间的同步、文件锁
  10. C++ 类模板遇到继承的问题以及解决