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 相关文章推荐
js showModalDialog参数的使用详解
Jan 07 Javascript
jquery中ajax使用error调试错误的方法
Feb 08 Javascript
举例详解AngularJS中ngShow和ngHide的使用方法
Jun 19 Javascript
基于javascript简单实现对身份证校验
Jan 25 Javascript
JS控制静态页面传递参数并获取参数应用
Aug 10 Javascript
纯JS打造网页中checkbox和radio的美化效果
Oct 13 Javascript
angularJS实现动态添加,删除div方法
Feb 27 Javascript
Vue.js单向绑定和双向绑定实例分析
Aug 14 Javascript
js实现文件上传功能 后台使用MultipartFile
Sep 08 Javascript
详解vue文件中使用echarts.js的两种方式
Oct 18 Javascript
Js跳出两级循环方法代码实例
Sep 22 Javascript
分享几个JavaScript运算符的使用技巧
Apr 24 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.MVC的模板标签系统(一)
2006/09/05 PHP
php权重计算方法代码分享
2014/01/09 PHP
解决tp5在nginx下修改配置访问的问题
2019/10/16 PHP
用js实现预览待上传的本地图片
2007/03/15 Javascript
Draggable Elements 元素拖拽功能实现代码
2011/03/30 Javascript
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
CSS(js)限制页面显示的文本字符长度
2012/12/27 Javascript
js简单实现HTML标签Select联动带跳转
2013/10/23 Javascript
js 判断上传文件大小及格式代码
2013/11/13 Javascript
js身份证判断方法支持15位和18位
2014/03/18 Javascript
javascript实现数组中的内容随机输出
2015/08/11 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
微信小程序 页面跳转传递值几种方法详解
2017/01/12 Javascript
javascript阻止事件冒泡和浏览器的默认行为
2017/01/21 Javascript
JavaScript实现左右下拉框动态增删示例
2017/03/09 Javascript
利用Jasmine对Angular进行单元测试的方法详解
2017/06/12 Javascript
Node.js如何实现注册邮箱激活功能 (常见)
2017/07/23 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
浅谈Angular6的服务和依赖注入
2018/06/27 Javascript
vue使用axios上传文件(FormData)的方法
2019/04/14 Javascript
JavaScript中的this基本问题实例小结
2020/03/09 Javascript
vue+render+jsx实现可编辑动态多级表头table的实例代码
2020/04/01 Javascript
js实现点击上传图片并设为模糊背景
2020/08/02 Javascript
vue a标签点击实现赋值方式
2020/09/07 Javascript
jQuery实现手风琴特效
2021/01/11 jQuery
Python实现调度算法代码详解
2017/12/01 Python
python 读取竖线分隔符的文本方法
2018/12/20 Python
Python pandas用法最全整理
2019/08/04 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
工作表扬信的范文
2014/01/10 职场文书
小学生家长评语集锦
2014/01/30 职场文书
大学生在校学习的自我评价
2014/02/18 职场文书
优秀教师工作总结2015
2015/07/22 职场文书
Python并发编程实例教程之线程的玩法
2021/06/20 Python
Python Pandas模块实现数据的统计分析的方法
2021/06/24 Python
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL