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 相关文章推荐
动态表格Table类的实现
Aug 26 Javascript
25个好玩的JavaScript小游戏分享
Apr 22 Javascript
js判断生效时间不得大于失效时间的思路及代码
Apr 23 Javascript
一个简单的jQuery计算器实现了连续计算功能
Jul 21 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
May 25 Javascript
js实现的动画导航菜单效果代码
Sep 10 Javascript
JavaScript性能优化之小知识总结
Nov 20 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
Apr 16 Javascript
JavaScript的String字符串对象常用操作总结
May 26 Javascript
Vue.JS入门教程之列表渲染
Dec 01 Javascript
vue.js 获取当前自定义属性值
Jun 01 Javascript
angular 组件通信的几种实现方式
Jul 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
DISCUZ 分页代码
2007/01/02 PHP
用穿越火线快速入门php面向对象
2012/02/22 PHP
浅析PHP中的UNICODE 编码与解码
2013/06/29 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
PHP准确取得服务器IP地址的方法
2015/06/02 PHP
PHP设计模式之原型设计模式原理与用法分析
2018/04/25 PHP
php使用fullcalendar日历插件详解
2019/03/06 PHP
PHP迭代器和生成器用法实例分析
2019/09/28 PHP
基于Jquery的文字滚动跑马灯插件(一个页面多个滚动区)
2010/07/26 Javascript
jquery css 设置table的奇偶行背景色示例
2014/06/03 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
基于jquery ui的alert,confirm方案(支持换肤)
2015/04/03 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
JS正则表达式比较常见用法
2016/01/26 Javascript
BootStrap的两种模态框方式
2017/05/10 Javascript
node puppeteer(headless chrome)实现网站登录
2018/05/09 Javascript
简单的三步vuex入门
2018/05/20 Javascript
[01:07:19]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第一场
2018/04/06 DOTA
[46:21]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
给Python的Django框架下搭建的BLOG添加RSS功能的教程
2015/04/08 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
如何基于python操作json文件获取内容
2019/12/24 Python
python标识符命名规范原理解析
2020/01/10 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
Python基于codecs模块实现文件读写案例解析
2020/05/11 Python
CSS3悬停效果案例应用
2012/11/21 HTML / CSS
基于CSS3的CSS 多栏(Multi-column)实现瀑布流源码分享
2014/06/11 HTML / CSS
Java平台和其他软件平台有什么不同
2015/06/05 面试题
Java的五个基础面试题
2016/02/26 面试题
大一学生假期实习的自我评价
2013/10/12 职场文书
幼儿园中秋节活动反思
2014/02/16 职场文书
《三亚落日》教学反思
2014/04/26 职场文书
竞聘演讲稿开场白
2014/08/25 职场文书
欢迎词范文
2015/01/27 职场文书
会议承办单位欢迎词
2015/09/30 职场文书