Vuex模块化实现待办事项的状态管理


Posted in Javascript onMarch 15, 2017

前言

在vue里,组件之间的作用域是独立的,父组件跟子组件之间的通讯可以通过prop属性来传参,但是在兄弟组件之间通讯就比较麻烦了。比如A组件要告诉一件事给B组件,那么A就要先告诉他们的爸组件,然后爸组件再告诉B。当组件比较多,要互相通讯的事情很多的话,爸组件要管他们那么多事,很累的。vuex正是为了解决这个问题,让多个子组件之间可以方便的通讯。

项目介绍

Vuex模块化实现待办事项的状态管理

待办事项中的一个事件,它可能拥有几个状态,未完成、已完成、已取消或被删除等。这个事件需要在这多种状态之间切换,那么使用vuex来管理也是非常方便的。

来看一下vuex怎么完成状态管理的:

Vuex模块化实现待办事项的状态管理

所有组件都是调用actions,分发mutation去修改state,然后state经过getter又更新到各个组件里。state又通过localStorage存储数据到本地,下次重新打开时再读取保存的数据。

模块化

为什么要用模块化?当我们的项目比较大,组件很多,功能也多,会导致state里要存放很多内容,整个 store 都会很庞大,很难管理。

我模块化的store目录如下:

|-store/   // 存放vuex代码
| |-eventModule  // 事件模块
| | |-actions.js
| | |-getters.js
| | |-index.js
| | |-mutations.js
| | |-state.js
| |-themeModule  // 主题颜色模块
| | |-actions.js
| | |-getters.js
| | |-index.js
| | |-mutations.js
| | |-state.js
| |-index.js  // vuex的核心,创建一个store

可以看到,每个模块拥有自己的state、mutation、action、getter,这样子我们就可以把我们的项目根据功能划分为多个模块去使用vuex了,而且后期维护也不会一脸懵逼。

状态管理

接下来,我们来看看vuex完成状态管理的一个流程。

举个栗子:一个待办事项,勾选之后,会在未完成列表里移除,并在已完成的列表里出现。这个过程,是这个待办事项的状态发生了改变。勾选的时候,是执行了一个方法,那我们就先写这个方法。在 event_list.vue 文件里新建一个moveToDone方法。

methods: {
 moveToDone(id){ //移至已完成
 this.$store.dispatch('eventdone', id);
 }
}

在 moveToDone 方法中通过 store.dispatch 方法触发 action, 接下来我们在 eventModule/actions.js 中来注册这个 action, 接受一个 id 的参数。

module.exports = {
 eventdone = ({ commit }, param) =>{
 commit('EVENTDONE',{id: param});
 }
}

action 通过调用 store.commit 提交载荷(也就是{id: param}这个对象)到名为'EVENTDONE'的 mutation,那我们再来注册这个 mutation

module.exports = {
 EVENTDONE(states,obj){
 for (let i = 0; i < states.event.length; i++) {
  if (states.event[i].id === obj.id) {
  states.event[i].type = 2;
  states.event[i].time = getDate();
  var item = states.event[i];
  states.event.splice(i, 1);  // 把该事件在数组中删除
  break;
  }
 }
 states.event.unshift(item);   // 把该事件存到数组的第一个元素
 local.set(states);    // 将整个状态存到本地
 }
}

通过 mutation 去修改 state, state里我们存放了一个 event 属性

const state = {
 event: []
};
export default state;

在组件中要获得这个 state 里的 event, 那就需要写个getters

const getters = {
 getDone(states){
 return states.event.filter(function (d) {
  if (d.type === 2) {   // type == 2表示已完成
  return d;   // 返回已完成的事件
  }
 });
 }
};
export default getters;

然后每个module里都有一个index.js文件,把自己的state、mutation、action、getters都集合起来,就是一个module

import * as func from '../function';
import * as actions from './actions.js';
import * as mutations from './mutations.js';
import state from './state.js';
import getters from './getters.js';
module.exports = {
 state,
 getters,
 actions,
 mutations
}

在 store/index.js 里创建一个 store 对象来存放这个module

import Vue from 'vue';
import Vuex from 'vuex';
import event from './eventModule';
Vue.use(Vuex);
module.exports = new Vuex.Store({
 modules: {
 event
 }
});

最后在 event_list.vue 组件上,我们通过计算属性 computed 来获取到这个从未完成的状态改变到已完成的状态,我们要用到 store 这个对象里的getters

computed: {
 getDone(){
 return this.$store.getters.getDone;
 }
}

这样子,完成了 '未完成' => '已完成' 从提交修改到更新视图读取的整个流程,也是 vuex 工作的整个流程。通过 module 的封装,更加方便多模块项目的开发和维护。

源码地址 :notepad

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
jquery multiSelect 多选下拉框
Jul 09 Javascript
自制基于jQuery的智能提示插件一枚
Feb 18 Javascript
js的表单操作 简单计算器
Dec 29 Javascript
php析构函数的具体用法小结
Mar 11 Javascript
JavaScript 面向对象与原型
Apr 10 Javascript
jQuery实现的左右移动焦点图效果
Jan 14 Javascript
JavaScript表单验证开发
Nov 23 Javascript
Express + Session 实现登录验证功能
Sep 08 Javascript
Material(包括Material Icon)在Angular2中的使用详解
Feb 11 Javascript
SVG实现时钟效果
Jul 17 Javascript
select2 ajax 设置默认值,初始值的方法
Aug 09 Javascript
JS实现的tab页切换效果完整示例
Dec 18 Javascript
javascript图片预览和上传(兼容IE)
Mar 15 #Javascript
轻松理解JavaScript之AJAX
Mar 15 #Javascript
jQuery插件ContextMenu自定义图标
Mar 15 #Javascript
JavaScript对象引用与赋值实例详解
Mar 15 #Javascript
jQuery图片瀑布流的简单实现代码
Mar 15 #Javascript
JavaScript关联数组用法分析【概念、定义、遍历】
Mar 15 #Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
Mar 15 #Javascript
You might like
php中使用preg_replace函数匹配图片并加上链接的方法
2013/02/06 PHP
PHP无法访问远程mysql的问题分析及解决
2013/05/16 PHP
用PHP来计算某个目录大小的方法
2014/04/01 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
2014/07/02 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
jquery插件之信息弹出框showInfoDialog(成功/错误/警告/通知/背景遮罩)
2013/01/09 Javascript
jquery高效反选具体实现
2013/05/05 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
2013/12/28 Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
2017/02/15 Javascript
详解原生js实现offset方法
2017/06/15 Javascript
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
2018/07/28 Javascript
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
vue全屏事件开发详解
2020/06/17 Javascript
python冒泡排序算法的实现代码
2013/11/21 Python
Python实现的百度站长自动URL提交小工具
2014/06/27 Python
python编写暴力破解FTP密码小工具
2014/11/19 Python
使用PyInstaller将Python程序文件转换为可执行程序文件
2016/07/08 Python
对Python Pexpect 模块的使用说明详解
2019/02/14 Python
Ubuntu18.04下python版本完美切换的解决方法
2019/06/14 Python
python网络编程:socketserver的基本使用方法实例分析
2020/04/09 Python
Python3创建Django项目的几种方法(3种)
2020/06/03 Python
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
美国一家主打母婴用品的团购网站:zulily
2017/09/19 全球购物
英国钻石公司:British Diamond Company
2020/02/16 全球购物
全球精选男装和家居用品:Article
2020/04/13 全球购物
人力资源经理自我评价
2014/01/04 职场文书
物业保安员岗位职责制度
2014/01/30 职场文书
大家检讨书5000字
2014/02/03 职场文书
暑期培训随笔感言
2014/03/10 职场文书
英文推荐信格式范文
2014/05/09 职场文书
运动会开幕词
2015/01/28 职场文书
2015小学五年级班主任工作总结
2015/05/21 职场文书
亮剑观后感
2015/06/05 职场文书
《作风建设永远在路上》心得体会
2016/01/21 职场文书