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 相关文章推荐
常用的javascript function代码
May 23 Javascript
使用js操作cookie的一点小收获分享
Sep 03 Javascript
用Js实现的动态增加表格示例自己写的
Oct 21 Javascript
node.js中的console.trace方法使用说明
Dec 09 Javascript
jquery Validation表单验证使用详解
Sep 12 Javascript
JavaScript采用递归算法计算阶乘实例
Aug 04 Javascript
jquery对象访问是什么及使用方法介绍
May 03 Javascript
五步轻松实现JavaScript HTML时钟效果
Mar 25 Javascript
vue-cli与webpack处理静态资源的方法及webpack打包的坑
May 15 Javascript
vue将单页面改造成多页面应用的方法
Nov 25 Javascript
详解Vue路由自动注入实践
Apr 17 Javascript
浅探express路由和中间件的实现
Sep 30 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
支持oicq头像的留言簿(二)
2006/10/09 PHP
实用函数7
2007/11/08 PHP
PHP如何利用P3P实现跨域
2013/08/24 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
2015/09/30 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
2017/05/26 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
2019/02/28 PHP
dojo 之基础篇(三)之向服务器发送数据
2007/03/24 Javascript
javascript 二维数组的实现与应用
2010/03/16 Javascript
JS解析XML实例分析
2015/01/30 Javascript
分享一则JavaScript滚动条插件源码
2015/03/03 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
jQuery简单创建节点的方法
2016/09/09 Javascript
node.js中express中间件body-parser的介绍与用法详解
2017/05/23 Javascript
react路由配置方式详解
2017/08/07 Javascript
Web技术实现移动监测的介绍
2017/09/18 Javascript
分析JS中this引发的bug
2017/12/12 Javascript
layui对工具条进行选择性的显示方法
2019/09/19 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
Node.js 中如何收集和解析命令行参数
2021/01/08 Javascript
Python中内置数据类型list,tuple,dict,set的区别和用法
2015/12/14 Python
横向对比分析Python解析XML的四种方式
2016/03/30 Python
Python实现简易Web爬虫详解
2018/01/03 Python
pandas通过loc生成新的列方法
2018/11/28 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
2019/07/23 Python
python 实现手机自动拨打电话的方法(通话压力测试)
2019/08/08 Python
详解Python实现进度条的4种方式
2020/01/15 Python
西班牙高科技产品购物网站:MejorDeseo
2019/09/08 全球购物
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
Ibatis如何使用动态表名
2015/07/12 面试题
应届本科生推荐信范文
2013/12/25 职场文书
毕业生个人投资创业计划书
2014/01/04 职场文书
市场部岗位职责
2015/02/12 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书
小学同学聚会感言
2015/07/30 职场文书
如何理解python接口自动化之logging日志模块
2021/06/15 Python
在python中读取和写入CSV文件详情
2022/06/28 Python