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操纵Cookie实现购物车程序
Nov 23 Javascript
用 JSON 处理缓存
Apr 27 Javascript
在AngularJS应用中实现一些动画效果的代码
Jun 18 Javascript
实例讲解避免javascript冲突的方法
Jan 03 Javascript
JS组件Bootstrap Table使用方法详解
Feb 02 Javascript
一个炫酷的Bootstrap导航菜单
Dec 28 Javascript
jQuery实现手势解锁密码特效
Aug 14 jQuery
vue mounted 调用两次的完美解决办法
Oct 29 Javascript
node中使用log4js4.x版本记录日志的方法
Aug 20 Javascript
VUE路由动态加载实例代码讲解
Aug 26 Javascript
vue 中固定导航栏的实例代码
Nov 01 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
Feb 10 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
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
js confirm()方法的使用方法实例
2013/07/13 Javascript
从数组中随机取x条不重复数据的JS代码
2013/12/24 Javascript
jquery mobile的触控点击事件会多次触发问题的解决方法
2014/05/08 Javascript
jquery实现标签上移、下移、置顶
2015/04/26 Javascript
响应式表格之固定表头的简单实现
2016/08/26 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
2016/10/19 Javascript
深入理解Angularjs向指令传递数据双向绑定机制
2016/12/31 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
jQuery+ajax读取json数据并按照价格排序示例
2018/03/28 jQuery
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
解决webpack多页面内存溢出的方法示例
2019/10/08 Javascript
pyramid配置session的方法教程
2013/11/27 Python
python实现html转ubb代码(html2ubb)
2014/07/03 Python
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
python optparse模块使用实例
2015/04/09 Python
Python中一些自然语言工具的使用的入门教程
2015/04/13 Python
python获取目录下所有文件的方法
2015/06/01 Python
Python中的数据对象持久化存储模块pickle的使用示例
2016/03/03 Python
Python随机数random模块使用指南
2016/09/09 Python
pycharm中import呈现灰色原因的解决方法
2020/03/04 Python
Python自动登录QQ的实现示例
2020/08/28 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
canvas进阶之如何画出平滑的曲线
2018/10/15 HTML / CSS
在线购买世界上最好的酒:BoozeBud
2018/06/07 全球购物
医学毕业生自我鉴定
2013/10/30 职场文书
司机岗位职责
2013/11/15 职场文书
安全生产先进个人总结
2015/02/15 职场文书
《秦兵马俑》教学反思
2016/02/24 职场文书
2019财务毕业实习报告
2019/06/27 职场文书
Jsonp劫持学习
2021/04/01 PHP
Kubernetes中Deployment的升级与回滚
2022/04/01 Servers
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB