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 相关文章推荐
JTrackBar水平拖动效果
Jul 15 Javascript
JQuery 1.6发布 性能提升,同时包含大量破坏性变更
May 10 Javascript
json数据的列循环示例
Sep 06 Javascript
javascript 常见功能汇总
Jun 11 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
Jun 06 Javascript
jQuery实现的网页换肤效果示例
Sep 20 Javascript
PHP+jquery+ajax实现分页
Dec 09 Javascript
基于 Bootstrap Datetimepicker 联动
Aug 03 Javascript
React router动态加载组件之适配器模式的应用详解
Sep 12 Javascript
详解vue-router导航守卫
Jan 19 Javascript
微信小程序实现搜索历史功能
Mar 26 Javascript
微信小程序基于Taro的分享图片功能实践详解
Jul 12 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
phpize的深入理解
2013/06/03 PHP
php计算两个整数的最大公约数常用算法小结
2015/03/05 PHP
js获取单选按钮的数据
2006/11/27 Javascript
另类调用flash无须激活的方法
2006/12/27 Javascript
Ext javascript建立超链接,进行事件处理的实现方法
2009/03/22 Javascript
IE的有条件注释判定IE版本详解(附实例代码)
2012/01/04 Javascript
Firefox中beforeunload事件的实现缺陷浅析
2012/05/03 Javascript
js导出table数据到excel即导出为EXCEL文档的方法
2013/10/10 Javascript
jquery checkbox实现单选小例
2013/11/27 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
2015/05/07 Javascript
Javascript中arguments用法实例分析
2015/06/13 Javascript
javascript每日必学之条件分支
2016/02/17 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
在node中使用jwt签发与验证token的方法
2019/04/03 Javascript
浅析vue中的provide / inject 有什么用处
2019/11/10 Javascript
python实现2014火车票查询代码分享
2014/01/10 Python
详解Django框架中的视图级缓存
2015/07/23 Python
python开发之IDEL(Python GUI)的使用方法图文详解
2015/11/12 Python
Python构造自定义方法来美化字典结构输出的示例
2016/06/16 Python
Python实现的多线程同步与互斥锁功能示例
2017/11/30 Python
对python多线程与global变量详解
2018/11/09 Python
Django 实现图片上传和显示过程详解
2019/07/18 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
优质有机椰子产品:Dr. Goerg
2019/09/24 全球购物
俄罗斯金苹果网上化妆品和香水商店:Goldapple
2019/12/01 全球购物
挂职思想汇报
2013/12/31 职场文书
团委书记的竞聘演讲稿
2014/04/24 职场文书
环保标语大全
2014/06/12 职场文书
委托书的写法
2014/09/16 职场文书
离婚协议书范文
2015/01/26 职场文书
2015秋季开学典礼致辞
2015/07/16 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书
pytorch 实现变分自动编码器的操作
2021/05/24 Python
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript
分享很少见很有用的SQL功能CORRESPONDING
2022/08/05 MySQL