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 16 Javascript
jQuery的内容过滤选择器学习教程
Apr 18 Javascript
Javascript基础之数组的使用
May 13 Javascript
全面解析多种Bootstrap图片轮播效果
May 27 Javascript
js轮盘抽奖实例分析
Apr 17 Javascript
ES6中的数组扩展方法
Aug 26 Javascript
HTML5 canvas 9绘制图片实例详解
Sep 06 Javascript
微信小程序 Video API实例详解
Oct 02 Javascript
bootstrap3-dialog-master模态框使用详解
Aug 22 Javascript
jQuery实现锚点向下平滑滚动特效示例
Aug 29 jQuery
vue实现word,pdf文件的导出功能
Jul 31 Javascript
如何基于js判断浏览器版本
Feb 20 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
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
PHP If Else(elsefi) 语句
2013/04/07 PHP
检测codeigniter脚本消耗内存情况的方法
2015/03/21 PHP
js模拟实现Array的sort方法
2007/12/11 Javascript
Egret引擎开发指南之创建项目
2014/09/03 Javascript
详谈jQuery中的this和$(this)
2014/11/13 Javascript
javascript实现十秒钟后注册按钮可点击的方法
2015/05/13 Javascript
用nodejs搭建websocket服务器
2017/01/23 NodeJs
JavaScript中数组Array.sort()排序方法详解
2017/03/01 Javascript
解决vue里碰到 $refs 的问题的方法
2017/07/13 Javascript
vue路由懒加载的实现方法
2018/03/12 Javascript
JavaScript中引用vs复制示例详析
2018/12/06 Javascript
详解微信小程序调用支付接口支付
2019/04/28 Javascript
解决Vue+Electron下Vuex的Dispatch没有效果问题
2019/05/20 Javascript
node.js中npm包管理工具用法分析
2020/02/14 Javascript
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
Python实现的几个常用排序算法实例
2014/06/16 Python
使用Python的判断语句模拟三目运算
2015/04/24 Python
python计算方程式根的方法
2015/05/07 Python
django通过ajax发起请求返回JSON格式数据的方法
2015/06/04 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
2018/03/04 Python
Python实现的求解最小公倍数算法示例
2018/05/03 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
django 单表操作实例详解
2019/07/30 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
Pygame的程序开始示例代码
2020/05/07 Python
生物化工专业个人自荐信
2013/09/26 职场文书
创业计划书的主要内容有哪些
2014/01/29 职场文书
拓展策划方案
2014/06/03 职场文书
中考标语大全
2014/06/05 职场文书
没有孩子的离婚协议书怎么写
2014/09/17 职场文书
商品陈列协议书
2014/09/29 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书
导游词之台湾阿里山
2019/10/23 职场文书