Vuex 单状态库与多模块状态库详解


Posted in Javascript onDecember 11, 2018

什么情况下使用vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。如果您需要构建是一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。

之前在做旅游页的时候对 Vuex 进行了简单的了解。近期在做 Vue 项目的同时重新学习了 Vuex 。本篇博文主要总结一下 Vuex 单状态库和多模块 modules 的两类使用场景。

本篇所有代码是基于 Vue-Cli 3.x 版本的脚手架工具进行编写的。

vuex 单状态库 Demo

这是一个仅有单个 Vuex store 状态库的 Demo。当项目中使用一个 Vuex 状态库就已经足够的时候,可以使用这种方式。

本 Demo 使用了一个 increment 与 decrement 的 增 / 减 事件来体现 store 数据的变化。

store.js

由于状态库是单一的,仅有一个 store.js 文件管理状态库。在该文件中一开始进行 import 的引入,然后使用 Vue.use(Vuex) 使用 Vuex,之后分别定义 state、mutations 和 actions,并通过 export default new Vuex.Store({state, mutations, actions}) 模块化。

// store.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const state = {
 count: 1
}

const mutations = {
 increment(state) {
  state.count ++
 },
 decrement(state) {
  state.count --
 }
}

const actions = {
 increment:({commit}) => {
  commit('increment')
 },
 decrement:({commit}) => {
  commit('decrement')
 }
}

export default new Vuex.Store({state, mutations, actions})

main.js

在入口文件 main.js 中通过 import 引入 store,并注册到 Vue 的实例上。

import Vue from 'vue'
import App from './App.vue'
import store from './store'

// Vue-Cli 3.x
new Vue({
 render: h => h(App),
 router,
 store
}).$mount('#app')

// Vue-Cli 2.x
// new Vue({
//  el: '#app',
//  router,
//  store,
//  components: { App },
//  template: '<App/>'
// })

使用 $store

在相应的组件中如下引入并在 methods 中使用 mapActions。

<template>
 <div class="vuex">
  Vuex 全局 Store count {{$store.state.count}}
  <button type="button" name="button" @click="increment">加</button>
  <button type="button" name="button" @click="decrement">减</button>
 </div>
</template>

<script>
import { mapActions } from 'vuex'
export default {
 methods: mapActions([
  'increment',
  'decrement'
 ])
}
</script>

<style scoped>

</style>

Demo

关于单状态库的 Demo 请参考此 github

Github Demo 

vuex 多模块状态库 Demo

当项目变得非常庞大,单个 store 无法满足需求的时候,可以通过多模块状态库管理多个 store,将各类状态分类进行维护。

本 Demo 使用了 add 与 reduce 的 增 / 减 事件来体现 store 数据的变化。

store

由于需要管理多个 store,因此在项目目录中创建 store 文件夹,并创建 modules 文件夹用来放置各个 store文件,并使用 index.js 作为入口文件。具体结构请查看 Demo。

main.js

同样在 main.js 中通过 import 引入 store,但这里是引入 index.js 这个入口文件。

import Vue from 'vue'
import App from './App.vue'
import store from './store/index'

使用 $store

除了使用方式有一定不同之外,methods 中的 mapActions 也更换了书写方式,第一个参数是对应 store 管理的数据,第二个参数是关于操作事件的数组。

<template lang="html">
 <div class="a">
  page a {{$store.state.countA.countA}}

  <button type="button" name="button" @click="add">增加</button>
  <button type="button" name="button" @click="reduce">删减</button>
 </div>
</template>

<script>
import { mapActions } from 'vuex'
export default {
 methods: mapActions('countA',['add','reduce'])
}
</script>

<style lang="css">
</style>

Demo

关于多模块状态库的 Demo 请参考此 github

Github Demo

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

Javascript 相关文章推荐
不错的新闻标题颜色效果
Dec 10 Javascript
向fckeditor编辑器插入指定代码的方法
May 25 Javascript
jValidate 基于jQuery的表单验证插件
Dec 12 Javascript
让ie运行js时提示允许阻止内容运行的解决方法
Oct 24 Javascript
xml文档转换工具,附图表例子(hta)
Nov 17 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
Mar 11 Javascript
JavaScript中的some()方法使用详解
Jun 09 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
Aug 01 Javascript
Iphone手机、安卓手机浏览器控制默认缩放大小的方法总结(附代码)
Aug 18 Javascript
js实现会跳动的日历效果(完整实例)
Oct 18 Javascript
Vue shopCart 组件开发详解
Jan 26 Javascript
Openlayers学习之加载鹰眼控件
Sep 28 Javascript
微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
Dec 11 #Javascript
微信小程序实现两个页面传值的方法分析
Dec 11 #Javascript
jQuery使用bind动态绑定事件无效的处理方法
Dec 11 #jQuery
微信小程序实现的3d轮播图效果示例【基于swiper组件】
Dec 11 #Javascript
vue-cli 3.0 版本与3.0以下版本在搭建项目时的区别详解
Dec 11 #Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
Dec 11 #Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
Dec 11 #Javascript
You might like
php实现以只读方式打开文件的方法
2015/03/16 PHP
php实现插入数组但不影响原有顺序的方法
2015/03/27 PHP
PHP 年月日的三级联动实例代码
2017/05/24 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
HTML中不支持静态Expando的元素的问题
2007/03/08 Javascript
pjblog修改技巧汇总
2007/03/12 Javascript
javascript 页面只自动刷新一次
2009/07/10 Javascript
25个非常棒的jQuery滑块插件和教程小结
2011/09/02 Javascript
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
js获取select标签选中值的两种方式
2014/01/09 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
jQuery添加和删除指定标签的方法
2015/12/16 Javascript
Bootstrap模仿起筷首页效果
2016/05/09 Javascript
JavaScript数据类型学习笔记分享
2016/09/01 Javascript
记一次Vue.js混入mixin的使用(分权限管理页面)
2019/04/17 Javascript
layui字体图标 loading图标静止不旋转的解决方法
2019/09/23 Javascript
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
Python判断某个用户对某个文件的权限
2016/10/13 Python
python使用mitmproxy抓取浏览器请求的方法
2019/07/02 Python
解决Django后台ManyToManyField显示成Object的问题
2019/08/09 Python
python 实现简易的记事本
2020/11/30 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
python实现图片转字符画
2021/02/19 Python
Canvas引入跨域的图片导致toDataURL()报错的问题的解决
2018/09/19 HTML / CSS
连卡佛中国官网:Lane Crawford中文站
2018/01/27 全球购物
管道维修工岗位职责
2013/12/27 职场文书
财务专业大学生职业生涯规划范文
2013/12/30 职场文书
通信生自我鉴定
2014/01/18 职场文书
服务员自我评价
2014/01/25 职场文书
班班通项目实施方案
2014/02/25 职场文书
新春寄语大全
2014/04/09 职场文书
初中差生评语
2014/12/29 职场文书
优秀大学生自荐信
2015/03/26 职场文书
手把手教你制定暑期学习计划,让你度过充实的暑假
2019/08/22 职场文书
元素水平垂直居中的方式
2021/03/31 HTML / CSS