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 相关文章推荐
javascript instanceof 内部机制探析
Oct 15 Javascript
ajax不执行success回调而是执行了error回调
Dec 10 Javascript
jquery slibings选取同级其他元素的实现代码
Nov 15 Javascript
JavaScript简单实现鼠标拖动选择功能
Mar 06 Javascript
javascript+css3 实现动态按钮菜单特效
Feb 06 Javascript
jQuery的deferred对象使用详解
Sep 25 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
Aug 31 Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
Nov 22 Javascript
vue监听键盘事件的快捷方法【推荐】
Jul 11 Javascript
vue中axios防止多次触发终止多次请求的示例代码(防抖)
Feb 16 Javascript
js判断鼠标移入移出方向的方法
Jun 24 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
Sep 02 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
杏林同学录(七)
2006/10/09 PHP
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
2011/07/18 PHP
PHP实现WebService的简单示例和实现步骤
2015/03/27 PHP
PHP数组生成XML格式数据的封装类实例
2016/11/10 PHP
PHP使用OB缓存实现静态化功能示例
2019/03/23 PHP
如何改进javascript代码的性能
2015/04/02 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
2015/11/26 Javascript
JS控制弹出悬浮窗口(一览画面)的实例代码
2016/05/30 Javascript
详解webpack es6 to es5支持配置
2017/05/04 Javascript
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
详解vuex状态管理模式
2018/11/01 Javascript
详解TypeScript+Vue 插件 vue-class-component的使用总结
2019/02/18 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
微信小程序自定义多列选择器使用详解
2019/06/21 Javascript
解决ele ui 表格表头太长问题的实现
2019/11/13 Javascript
VUE 单页面使用 echart 窗口变化时的用法
2020/07/30 Javascript
antd-DatePicker组件获取时间值,及相关设置方式
2020/10/27 Javascript
绘制微信小程序验证码功能的实例代码
2021/01/05 Javascript
python多线程http下载实现示例
2013/12/30 Python
pandas.loc 选取指定列进行操作的实例
2018/05/18 Python
python 读取文件并替换字段的实例
2018/07/12 Python
python redis 删除key脚本的实例
2019/02/19 Python
将python2.7添加进64位系统的注册表方式
2019/11/20 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
2020/01/17 Python
python标准库os库的函数介绍
2020/02/12 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
2020/03/10 Python
python反爬虫方法的优缺点分析
2020/11/25 Python
Python+Appium实现自动化清理微信僵尸好友的方法
2021/02/04 Python
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
小学教师岗位职责
2013/11/25 职场文书
顶撞领导检讨书
2014/01/29 职场文书
作风建设演讲稿
2014/05/23 职场文书
学校总务处领导干部个人对照检查材料思想汇报
2014/10/06 职场文书
总经理司机岗位职责
2015/04/10 职场文书
大学军训口号大全
2015/12/24 职场文书