详解vuex之store拆分即多模块状态管理(modules)篇


Posted in Javascript onNovember 13, 2018

了解vuex的朋友都知道它是vue用来集中管理状态的容器,如果了解过Reduce的朋友可能看见他时就会非常熟悉,都是用来管理全局的状态的,实现不同组件之间相互的数据访问。这里我们不介绍vuex,主要介绍vuex拆分store以及多模块管理。我们知道如果一个项目非常大的话状态就会非常的多,如果不进行分类处理,所有的状态都维护在一个state里面的话,状态管理就会变得非常的混乱,这样非常不利于项目的后期维护。我们现在前端推崇模块化开发,为的就是提高开发效率和维护效率,避免重复工作。那么vuex是怎么样解决这个问题的呢?这个时候我们今天要讲的主角modules就要闪亮登场了。
其实这个用起来是非常简单的,正常情况下,我们在用vuex的时候我们是这样定义的:

states.js //保存应用的状态值

export default {
  bookList:["西游记","水浒传","红楼梦","三国演义"]
}

mutations.js //在这个文件中定义对状态值的操作,增删改查。

export default {//这里要注意不要在mutations里面进行异步操作
  ADD_BOOK(state,book){
    state.bookList.push(book);
    return true;
  },
  DELETE_BOOK(state,id){
  }
}

getters.js //将我们在states中定义的值暴露在store.getters对象中,便于我们在组件中可以通过store.getters对象中,便于我们在组件中可以通过store.getters.bookList访问数据

export default {
  bookList:function(state){
    return state.bookList;
  }
}

actions.js //其实这里定义的方法只是将mutation.js中定义的方法进行了一次封装,就是去触发mutations.js中的方法。如果传如的参数需要异步获取的话,我们可以在这里等待异步返回成功后在触发mutations中的方法。在组件中这两个文件定义的方法都可以直接调用,mutations中定义的方法是通过store.dispath(′ADDBOOK′,book)调用的,而actons定义的方法是通过store.dispath(′ADDBOOK′,book)调用的,而actons定义的方法是通过store.commit(‘ADD_BOOK',book),调用的。

export default {//在action中可以进行异步操作。
  add_book({commit},book){
   commit('ADD_BOOK',book);
  },
  delete_book({commit},book){
   commit('DELETE_BOOK',id);
  }
}

这里有时我们还可能会看见一个文件叫mutations_type.js其实这个文件定义的是mutations中的方法名,我自己在用的时候反正没定义这个文件,自己看着办如果喜欢你就定义上。

上面定义的文件定义好了之后,我们就可以将我们定义的这些对象加入到vuex的Store中去了
store.js

import vue from 'vue'
import vuex from 'vuex'
import states from './state.js'
import mutatons from './mutations.js'
import actons from './actions.js'
import getters from './getters'
vue.use(vuex);
export default new vuex.Store({
          ststes,
          mutatons,
          getters,
          actions
         });

这样我们就写完整了一个store了。我们可以看出这里我们只有一个总模块,那如果我们要将总模块拆分成几个小模块,那应该怎样定义呢?

import vue from 'vue'
import vuex from 'vuex'
import states from './state.js'
import mutatons from './mutations.js'
import actons from './actions.js'
import getters from './getters'
vue.use(vuex);
export default new vuex.Store({
                modules:{
                     mod1:{
                        states,
                        mutatons,
                        getters,
                        actions
                        },
                     mod2:{}
                  }
         });
import vue from 'vue'
import vuex from 'vuex'
import states from './state.js'
import mutatons from './mutations.js'
import actons from './actions.js'
import getters from './getters'
vue.use(vuex);
export default new vuex.Store({
                modules:{
                    mod1:{states,
                       mutatons,
                       getters,
                       actions
                      },
                    mod2:{}
                  }
         });

我自己在做项目的时候我一般将一个子模块的state,mutations,actions,getter写在一个文件中如:

mod1.js

export default {
  state:{},
  mutatons:{},
  actions:{},
  getters:{}
}

mod2.js

export default {
  state:{},
  mutatons:{},
  actions:{},
  getters:{}
}

然后在将几个mod合并到store中去:

import vue from 'vue'
import vuex from 'vuex'
import mod1 from './mod1.js'
import mod2 from './mod2.js'
vue.use(vuex);
export default new vuex.Store({
                    modules:{
                          mod1:mod1,
                          mod2:mod1
                  }
         });

我感觉这样写的话代码结构更加直观,清晰。而且正常的话一个子模块一般不会有太多的状态和方法。当然如果项目中子模块的状态和方法确实太多,我们还是推荐将state,actions,getters,mutations单独写在不同的文件中,然后将不同的子模块的这些文件放在一个文件夹中,这样就代表一个子状态管理模块。

通过将总的store拆分过后,我们在状态管理和维护的时候就更加清晰了。

在创建出store后,我们需要将store挂载到vue上去

import vue from 'vue'
import store from './store'
var vue = new Vue({
 store,
 ···· 
}).$mount("#app")

之后在组建中就可以使用和管理前面定义的状态了,

<template>
</template>
<script>
  export default{
       computed{
              bookList:this.$store.mod1.bookList,
       },
       methods:{
             addBook:book=>this.$store.mod1.commit('ADD_BOOK',book);//这里需要注意,如果你是用了子模块的这种方法你需要加上模块名这是mod1,如果没有就不需要加。
             deleteBook:id=>this.$store.mod1.disaptch('DELETE_BOOK',id);
    }    
  }
</script>

总结:

将store进行拆分,有利于我们更好的管理项目中的状态,以及使我们的项目维护更加加单高效。各个模块之间的开发互相不影响。

好了,这次就简单的介绍到这里,这次主要是介绍怎么用。并没有深入到他的实现原理,对于vue的涉世未深的人来说,我感觉还是够用了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
经常用到的JavasScript事件的翻译
Apr 09 Javascript
使用IE6看老赵的博客 jQuery初探
Jan 17 Javascript
密码框显示提示文字jquery示例
Aug 29 Javascript
返回页面顶部top按钮通过锚点实现(自写)
Aug 30 Javascript
js实现图片点击左右轮播
Jul 08 Javascript
基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理
May 12 Javascript
移动端翻页插件dropload.js(支持Zepto和jQuery)
Jul 27 Javascript
使用node.js搭建服务器
May 20 Javascript
bootstrap时间插件daterangepicker使用详解
Oct 19 Javascript
详解webpack3编译兼容IE8的正确姿势
Dec 21 Javascript
express 项目分层实践详解
Dec 10 Javascript
如何使用CSS3和JQuery easing 插件制作绚丽菜单
Jun 18 jQuery
JS获取当前时间的实例代码(昨天、今天、明天)
Nov 13 #Javascript
checkbox在vue中的用法小结
Nov 13 #Javascript
React父子组件间的传值的方法
Nov 13 #Javascript
JS中使用cavas截图网页并解决跨域及模糊问题
Nov 13 #Javascript
详解如何用typescript开发koa2的二三事
Nov 13 #Javascript
详解koa2学习中使用 async 、await、promise解决异步的问题
Nov 13 #Javascript
koa源码中promise的解读
Nov 13 #Javascript
You might like
php更改目录及子目录下所有的文件后缀的代码
2010/09/24 PHP
PHP获取一年中每个星期的开始和结束日期的方法
2015/02/12 PHP
PHP简单获取及判断提交来源的方法
2016/04/22 PHP
js apply/call/caller/callee/bind使用方法与区别分析
2009/10/28 Javascript
心扬JS分页函数代码
2010/09/10 Javascript
window.name代替cookie的实现代码
2010/11/28 Javascript
js 事件处理函数间的Event物件是否全等
2011/04/08 Javascript
在标题栏显示新消息提示,很多公司项目中用到这个方法
2011/11/04 Javascript
jquery链式操作的正确使用方法
2014/01/06 Javascript
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
iframe里使用JavaScript控制主页转向的方法
2015/04/03 Javascript
Angular中$compile源码分析
2016/01/28 Javascript
JS实现队列与堆栈的方法
2016/04/21 Javascript
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
2017/07/19 Javascript
修改 bootstrap table 默认detailRow样式的实例代码
2017/07/21 Javascript
vue 使用鼠标滚动加载数据的例子
2019/10/31 Javascript
如何利用JS将手机号中间四位变成*号
2020/09/29 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
python解析xml文件实例分析
2015/05/27 Python
python之Character string(实例讲解)
2017/09/25 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
2017/12/08 Python
python中嵌套函数的实操步骤
2019/02/27 Python
python实现可逆简单的加密算法
2019/03/22 Python
Python选择网卡发包及接收数据包
2019/04/04 Python
python正则表达式的懒惰匹配和贪婪匹配说明
2020/07/13 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
2020/09/01 Python
idealfit英国:世界领先的女性健身用品和运动衣物品牌
2017/11/25 全球购物
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
Perfume’s Club德国官网:在线购买香水
2019/04/08 全球购物
入党自我评价优缺点
2014/01/25 职场文书
读书演讲主持词
2014/03/18 职场文书
2015年员工试用期工作总结
2014/12/12 职场文书
优秀教师先进材料
2014/12/16 职场文书
天下第一关导游词
2015/02/06 职场文书
《遗弃》开发商删推文要跑路?官方回应:还在开发
2022/04/03 其他游戏