Vuex 模块化与项目实例 (2.0)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/393844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

click js自动点击 vue_vue.js2.0点击获取自己的属性和jquery方法

如下所示::data-index"index":dt"index"v-on:click"onclick($event,index)":data-d "JSON.stringify( item)"href"http://www.baidu.com" rel"external nofollow" rel"external nofollow"da…

Python:知识目录

Python目录 第一篇:数据类型部分文件操作 基础数据类型---str 基础数据类型---List 基础数据类型---dict 基础数据类型---set 基础数据类型---bytes 数据类型的总结 文件操作------读,写 文件操作------使用方法 第二章:函数模块 初识函数…

初学者css常见问题_5分钟内学习CSS-初学者教程

初学者css常见问题关于网络设计语言的快速教程。 (A quick tutorial on the design language of the web.) CSS (Cascading Style Sheets) is what makes web pages look good and presentable. It’s an essential part of modern web development and a must-have skill for …

leetcode39. 组合总和(回溯)

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明: 所有数字(包括 target)都是正整数。 解集不能包含重复的…

一脸懵逼学习基于CentOs的Hadoop集群安装与配置(三台机器跑集群)

1:Hadoop分布式计算平台是由Apache软件基金会开发的一个开源分布式计算平台。以Hadoop分布式文件系统(HDFS)和MapReduce(Google MapReduce的开源实现)为核心的Hadoop为用户提供了系统底层细节透明的分布式基础架构。 注…

linux批量去掉文件名前缀,linux 批量删除某个前缀文件

1. 命令 (参考:https://blog.csdn.net/kl28978113/article/details/80271831)find ./ -name updatesites*-* -exec rm {} \;2. 举例[rootadmin batch-create-sites]# ls2020-02-13-10-10.out logs-2020-04-07-08-00.out updatesites-2020-02-12-01-49-25.xlsx updat…

Docker - 避免启动container后运行shell脚本执行完成后docker退出container

问题 最近在使用 Dockerfile 启动容器,发现使用Dockerfile调用容器里面的shell,当shell执行完成以后,docker会退出容器。 分析 Docker 在执行shell的时候,是在后台执行的;因此,在shell执行完成以后&#xf…

css画横线箭头_用CSS绘制三角形箭头

用CSS绘制三角形箭头。使用纯CSS,你只需要很少的代码就可以创作出各种浏览器都兼容的三角形箭头!CSS代码:/* create an arrow that points up */div.arrow-up {width: 0;height: 0;border-left: 5px solid transparent; /* left arrow slant */border-ri…

Jmeter参数化的理解

jmeter参数化有两种情况: jmeter执行的sql语句中值的参数化(如select过滤条件)csv data set config参数表示方式${zjhm}jmx脚本的设置属性参数化,方便命令行调用时修改参数(如并发量、执行时间)在脚本中调用…

leetcode216. 组合总和 III(回溯)

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数&#xff0c;并且每种组合中不存在重复的数字。 说明&#xff1a; 所有数字都是正整数。 解集不能包含重复的组合。 示例 1: 输入: k 3, n 7 输出: [[1,2,4]] 代码 class Solution {List<List…

linux内核epub,Android底层开发技术实战详解——内核、移植和驱动(第2版)[EPUB][MOBI][AZW3][42.33MB]...

内容简介本书从底层原理开始讲起&#xff0c;结合真实的案例向读者详细介绍了Android内核、移植和驱动开发的整个流程。全书分为21章&#xff0c;依次讲解驱动移植的必要性&#xff0c; Goldfish、OMAP内核和驱动解析&#xff0c;显示系统、输入系统、振动器系统、音频系统、视…

机器学习岗位太少_太多的东西要学习,很少的时间

机器学习岗位太少by Rick West由里克韦斯特(Rick West) 太多的东西要学习&#xff0c;很少的时间 (So much to learn, so little time) 我学习&#xff0c;保持动力并实现目标的主要技巧 (My top tips for learning, staying motivated, and achieving your goals) One of the…

用9种办法解决 JS 闭包经典面试题之 for 循环取 i

2017-01-06Tomson JavaScript转自 https://segmentfault.com/a/1190000003818163 闭包 1.正确的说,应该是指一个闭包域,每当声明了一个函数,它就产生了一个闭包域(可以解释为每个函数都有自己的函数栈),每个闭包域(Function 对象)都有一个 function scope(不是属性),function s…

bzoj 2296: 【POJ Challenge】随机种子

Time Limit: 1 Sec Memory Limit: 128 MBSec Special JudgeDescription1tthinking除了随机算法&#xff0c;其他什么都不会。但是他还是可以ac很多题目&#xff0c;他用的是什么呢&#xff1f;他会选择一个好的随机种子&#xff0c;然后输出答案。往往他选择的一个好的种子可…

英特尔第十代处理器为什么不支持win7_5GHz动力澎湃 高主频多核处理器成就巅峰玩家...

频率之争永远是处理器领域无法回避的话题。高主频在游戏中所带来的高速运行&#xff0c;稳定帧数等特性永远是玩家们所追求的目标。随着英特尔第十代桌面及移动版酷睿处理器的发布&#xff0c;无论是台式整机或是笔记本平台&#xff0c;都已全面进入了5GHz时代。选择英特尔处理…

leetcode46. 全排列(回溯)

给定一个 没有重复 数字的序列&#xff0c;返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 代码 class Solution {List<List<Integer>> cListnew ArrayList<>();public List<List<…

初级算法-12.反转字符串

题目描述: 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中的可打…

linux python源码目录结构,TensorFlow0.8源码阅读 -- 代码目录结构讲解

TensorFlow0.8发布以来受到了大量机器学习领域爱好者的关注&#xff0c;目前其项目在github上的follow人数在同类项目中排名第一。作为google的第一个开源项目&#xff0c;TensorFlow的源码结构较为清晰&#xff0c;相关的代码注释覆盖较全。本文首先从代码结构入手&#xff0c…

在VirtualBox里复制VDI文件[转]

原文地址:http://blog.sina.com.cn/s/blog_591a2c940100aree.html 在VirtualBox的快速修复界面里&#xff0c;可以随时生成当前状态的备份。当生成了备份之后&#xff0c;会在Snapshots目录下创建一个新的VDI文件&#xff0c;之后对当前状态所做的一切操作都将针对最新的VDI文件…

软件开发重要性_在软件开发中考虑时间的重要性

软件开发重要性by Crunch Tech通过Crunch Tech 在软件开发中考虑时间的重要性 (The importance of time to think in Software Development) Modern Technology teams operate in a fast-paced environment. With a Technology team of only 35 people, we average over 50 re…