对某项目中Vuex用法的分析
上周五刚发布一个线上版本,趁着新的需求和bug还没到来,决定分析一下正在维护的一个使用Vue 2.0 开发的后台管理系统中Vuex部分代码。这部分代码不是我写的,加上我一直在“使用”现成的而不是“搭建”项目,所以这是一个很好的提升。
使用npm安装vuex,在src文件下创建store文件夹,如下:

各文件/文件夹用途:
/store -- Vuex代码文件夹
/store/index.js -- 创建store实例,导出
/store/utils.js -- 各种工具,该项目utils.js文件创建了一个store构造函数,导出
/store/modules/ -- store中子模块
/store/modules/image.js -- j将modules中的各个文件导出的子模块汇总到一起,导出
/store/modules/image.js -- store中image子模块,与该项目中“图片库管理”模块对应
/store/index.js创建store实例导出后,在项目的入口文件main.js(或index.js)中引入,并注入到根节点中,这样一来所有组件都能获取store中的数据。另外,如果想在组件中使用mapMutations等辅助函数,需在该组件中手动从vuex中引入:
import { mapMutations, mapActions } from 'vuex'
/store/index.js:
import Vue from 'vue';
import Vuex from 'vuex';
import modules from './modules'; // 导入各个子模块
Vue.use(Vuex); const store = new Vuex.Store({ // 创建store实例
modules: {
...modules,
},
}); export default store; // 导出store实例,在入口文件中注入根节点
/store/modules/index.js:
import home from './home'; // 导入各个子模块
import * as products from './products';
import * as user from './user';
import * as image from './image';
import * as facilitator from './facilitator';
import * as baseconfig from './baseconfig';
/*<状态注入>*/
export default { // 将各个子模块汇总成一个对象,也可以直接在store/index.js中完成
/*<模块注入>*/
...products,
...facilitator,
...baseconfig,
...user,
...image,
home,
};
/store/modules/image.js:
import Store from "../utils"; // 引入store模块构造函数
const imageCategory = Store("image-category", {}, null); // 利用构造函数,每一个接口都生成一个store模块
const image = Store("image", {}, null);
const imageUpload = Store("image/upload",{},null)
const skuImgs = Store("sku/imgs",{},null)
export { // 导出各个store模块
imageCategory,
image,
imageUpload,
skuImgs
}
/store/utils.js:
// 生成一个公共的store
import fetch from '@/fetch';
import _ from '../utils/lodash';
import tools from '../utils/utils';
import config from '@/config/config';
/**
*
* @param {*} action 请求地址
* @param {*} obj 参数对象,传入的参数可以替换默认store
* @param {*} apiName 配合后端微服务 不同接口前缀
*/
//
const Store = (action, obj = {}, apiName = '') => { // 创建一个构造函数,用来生成store模块
let api = `${config.getApi(apiName)}${action}`;
const store = {
namespaced: true, // 使用命名空间
state: {
// 异步loading控制
loading: false,
// 数据列表
list: [],
// 数据对象
data: {},
// 数据条数
count: 0,
url: action,
},
getters: {
// 获取状态数据
data(state, getters) {
return state;
},
},
mutations: {
// 突变数据
setOne(state, res) {
if (res.code != 200) {
} else {
state.data = res.data;
}
state.loading = false;
},
// 突变列表
setList(state, res) {
if (res.code != 200) {
} else {
state.list = res.data.docs;
state.count = res.data.count;
}
state.loading = false;
},
// 开启loading
changeLoading(state, loading) {
state.loading = loading;
},
},
actions: {
// 获取单条数据
getByParams({ state, commit }, params = {}) {
commit('changeLoading', true);
return fetch
.get(api, params)
.then(res => {
commit('setOne', res);
return res;
})
.finally(one => {
commit('changeLoading', false);
});
},
// 获取单条数据
getById({ state, commit }, id) {
commit('changeLoading', true);
return fetch
.get(`${api}/${id}`, {})
.then(res => {
commit('setOne', res);
return res;
})
.finally(one => {
commit('changeLoading', false);
});
}, // 获取列表数据
getList({ state, commit }, params = {}) {
commit('changeLoading', true);
if (!params.pageSize) {
Object.assign(params, { pageSize: 20 });
}
if (!params.pageNo) {
Object.assign(params, { pageNo: 1 });
}
return fetch
.get(api, params)
.then(res => {
commit('setList', res);
return res;
})
.finally(one => {
// debugger
commit('changeLoading', false);
});
}, // 新增数据
post({ state, commit }, params = {}) {
commit('changeLoading', true);
return fetch
.post(api, params)
.then(res => {
return res;
})
.finally(one => {
commit('changeLoading', false);
});
}, // 修改数据
put({ state, commit }, params = {}) {
commit('changeLoading', true);
return fetch
.put(api, params)
.then(res => {
return res;
})
.finally(one => {
commit('changeLoading', false);
});
}, // 删除数据
delete({ state, commit }, id) {
commit('changeLoading', true);
return fetch
.delete(`${api}/${id}`, {})
.then(res => {
return res;
})
.finally(one => {
commit('changeLoading', false);
});
},
// 删除数据query
deleteByQuery({ state, commit }, params) {
commit('changeLoading', true);
let query = tools.queryString(params);
return fetch
.delete(`${api}?${query}`, {})
.then(res => {
return res;
})
.finally(one => {
commit('changeLoading', false);
});
},
// 批量删除数据
deleteBatch({ state, commit }, ids) {
commit('changeLoading', true);
return fetch
.delete(api, ids)
.then(res => {
return res;
})
.finally(one => {
commit('changeLoading', false);
});
},
},
}; const newStore = _.merge({}, store, obj); return newStore;
}; export default Store;
在入口文件中Vue实例的根节点注入store后,就可以在组件中获取Vuex中的各种数据了,也可以使用actions调用接口进行各种操作。
对某项目中Vuex用法的分析的更多相关文章
- Lessons Learned 1(敏捷项目中的变更影响分析)
问题/现象: 业务信息流转的某些环节,会向相关人员发送通知邮件,邮件中附带有链接,供相关人员进入察看或处理业务.客户要求邮件中的链接,需要进行限制,只有特定人员才能进入处理或察看.总管想了想,应道没问 ...
- JUnit测试工具在项目中的用法
0:33 2013/6/26 三大框架整合时为什么要对项目进行junit测试: |__目的是测试配置文件对不对,能跑通就可以进行开发了 具体测试步骤: |__1.对hibernate进行测试 配置hi ...
- 项目中vuex的加入
1, 由于使用单一状态树,应用的所有状态会集中到一个比较大的对象.当应用变得非常复杂时,store 对象就有可能变得相当臃肿. 为了解决以上问题,Vuex 允许我们将 store 分割成模块(modu ...
- Spring中@Transactional用法深度分析
引言: 在Spring中@Transactional提供一种控制事务管理的快捷手段,但是很多人都只是@Transactional简单使用,并未深入了解,其各个配置项的使用方法,本文将深入讲解各个配置项 ...
- hello1 web项目中web.xml作用分析
该web.xml文件包含Facelets应用程序所需的几个元素.使用NetBeans IDE创建应用程序时,将自动创建以下所有内容. 指定项目阶段的上下文参数: <context-param&g ...
- .NET中StringBuilder用法实例分析
string s1 = "33"; string s2 = "44"; string s3 = "55"; //需求是把s1 s2 s3拼接 ...
- 如何对项目中的问题进行分析——FPGA失败案例小结
本人最近在做一个小项目,自己取名叫做<基于zedboard的千兆以太网底层设计>,一般我都是写好各模块的verilog代码,确定模块没bug后再做整个系统级联,之后直接先进行综合看看有没有 ...
- Java 容器在实际项目中的应用
前言:在java开发中我们离不开集合数组等,在java中有个专有名词:"容器" ,下面会结合Thinking in Java的知识和实际开发中业务场景讲述一下容器在Web项目中的用 ...
- Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码
Roslyn 是微软为 C# 设计的一套分析器,它具有很强的扩展性.以至于我们只需要编写很少量的代码便能够分析我们的项目文件. 作为 Roslyn 入门篇文章,你将可以通过本文学习如何开始编写一个 R ...
随机推荐
- Mirror--如何对运行中的镜像端点更换证书
如果使用证书配置镜像时,没有设置证书的时间,则默认证书有效期为一年,当证书快过期时,需要更换证书. 下面代码演示如何对正在运行的镜像更换证书 --=========================== ...
- Y2K Accounting Bug(poj2586)
题意: 有一个公司由于某个病毒使公司赢亏数据丢失,但该公司每月的 赢亏是一个定数,要么一个月赢利s,要么一月亏d.现在ACM只知道该公司每五个月有一个赢亏报表,而且每次报表赢利情况都为亏.在一年中这样 ...
- A + B Problem II(大数加法)
一直格式错误,不想改了,没A #include <iostream> #include <stdio.h> #include <string.h> #include ...
- HTTP 教程
HTTP 简介 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准. HTTP是一个基于 ...
- 引入jQuery的src设置
1.引用在线jQuery 谷歌.微软.百度都有提供在线的jQuery引用.比如 <script src="http://code.jquery.com/jquery-latest.js ...
- Java求解迷宫问题:栈与回溯算法
摘要: 使用栈的数据结构及相应的回溯算法实现迷宫创建及求解,带点JavaGUI 的基础知识. 难度: 中级 迷宫问题是栈的典型应用,栈通常也与回溯算法连用. 回溯算法的基本描述是: (1) 选择一个 ...
- Python: 去掉字符串开头、结尾或者中间不想要的字符
①Strip()方法用于删除开始或结尾的字符.lstrip()|rstirp()分别从左右执行删除操作.默认情况下会删除空白或者换行符,也可以指定其他字符. ②如果想处理中间的空格,需要求助其他技术 ...
- python写一个密码生成器的类,要求有个类变量,统计一下一共生成过多少个密码。 要求有4个方法,1:构造方法 2 实例方法 3 类方法 4 静态方法
生成指定长度的随机数字密码 生成指定长度的随机字母密码 生成指定长度的随机数字和字母的混合 #encoding=utf-8 import random import string class pa ...
- Request 对象 response 对象 常见属性
请求和响应 Express 应用使用回调函数的参数: request 和 response 对象来处理请求和响应的数据. app.get('/', function (req, res) { // - ...
- Nginx启动SSL功能
Nginx启动SSL功能,并进行功能优化,你看这个就足够了 一:开始Nginx的SSL模块 1.1 Nginx如果未开启SSL模块,配置Https时提示错误 nginx: [emerg] the &q ...