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 相关文章推荐
基于jQuery的表格操作插件
Apr 22 Javascript
location.search在客户端获取Url参数的方法
Jun 08 Javascript
js报$ is not a function 的问题的解决方法
Jan 20 Javascript
node.js中实现同步操作的3种实现方法
Dec 05 Javascript
jquery验证手机号是否正确实例讲解
Nov 17 Javascript
浅谈ECMAScript6新特性之let、const
Aug 02 Javascript
JS实现简单的浮动碰撞效果示例
Dec 28 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
Sep 28 Javascript
JS简单数组排序操作示例【sort方法】
May 17 Javascript
Vue仿微信app页面跳转动画效果
Aug 21 Javascript
浅析Vue 防抖与节流的使用
Nov 14 Javascript
js实现滚动条自动滚动
Dec 13 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脚本的10个技巧(6)
2006/10/09 PHP
php miniBB中文乱码问题解决方法
2008/11/25 PHP
64位windows系统下安装Memcache缓存
2015/12/06 PHP
Smarty高级应用之缓存操作技巧分析
2016/05/14 PHP
jQuery学习笔记之jQuery的事件
2010/12/22 Javascript
JavaScript定义类或函数的几种方式小结
2011/01/09 Javascript
用JQuery实现表格隔行变色和突出显示当前行的代码
2012/02/10 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
jquery.post用法示例代码
2014/01/03 Javascript
jQuery之Deferred对象详解
2014/09/04 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
vue.js删除动态绑定的radio的指定项
2017/06/02 Javascript
手动用webpack搭建第一个ReactApp的示例
2018/04/11 Javascript
从零开始搭建webpack+react开发环境的详细步骤
2018/05/18 Javascript
layui树形菜单动态遍历的例子
2019/09/23 Javascript
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
vue 实现把路由单独分离出来
2020/08/13 Javascript
js节流防抖应用场景,以及在vue中节流防抖的具体实现操作
2020/09/21 Javascript
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
Python Tkinter 简单登录界面的实现
2019/06/14 Python
PyQt编程之如何在屏幕中央显示窗体的实例
2019/06/18 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
2019/07/18 Python
Django项目使用ckeditor详解(不使用admin)
2019/12/17 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
2019/12/27 Python
Python字典深浅拷贝与循环方式方法详解
2020/02/09 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
如何基于python实现年会抽奖工具
2020/10/20 Python
银行学习十八大感想
2014/01/11 职场文书
如何撰写一封出色的求职信
2014/04/27 职场文书
优秀员工推荐信
2014/05/10 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
自我推荐信格式模板
2015/03/24 职场文书
基层工作经历证明
2015/06/19 职场文书
python识别围棋定位棋盘位置
2021/07/26 Python