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 语法基础 想学习js的朋友可以看看
Dec 16 Javascript
Jquery中getJSON在asp.net中的使用说明
Mar 10 Javascript
JS字符串处理实例代码
Aug 05 Javascript
一款由jquery实现的整屏切换特效
Sep 15 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
Dec 06 Javascript
JS实现动态表格的添加,修改,删除功能(推荐)
Jun 15 Javascript
深入理解选择框脚本[推荐]
Dec 13 Javascript
详解React Native网络请求fetch简单封装
Aug 10 Javascript
详解Vue.js使用Swiper.js在iOS
Sep 10 Javascript
详解vue-router数据加载与缓存使用总结
Oct 29 Javascript
详解项目升级到vue-cli3的正确姿势
Jan 28 Javascript
vue 表单之通过v-model绑定单选按钮radio
May 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
php重定向的三种方法分享
2012/02/22 PHP
JavaScript创建命名空间的5种写法
2014/06/24 PHP
PHP检测用户是否关闭浏览器的方法
2016/02/14 PHP
可输入的下拉框
2006/06/19 Javascript
node.js中的fs.readlinkSync方法使用说明
2014/12/17 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
2015/01/13 Javascript
WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
2016/01/12 Javascript
jQuery ztree实现动态树形多选菜单
2016/08/12 Javascript
JavaScript实现网页头部进度条刷新
2017/04/16 Javascript
JS实现按钮控制计时开始和停止功能
2017/07/27 Javascript
JavaScript 完成注册页面表单校验的实例
2017/08/19 Javascript
vue使用keep-alive保持滚动条位置的实现方法
2019/04/09 Javascript
vue点击当前路由高亮小案例
2019/09/26 Javascript
详解vue中v-bind:style效果的自定义指令
2020/01/21 Javascript
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
详解python里使用正则表达式的全匹配功能
2017/10/19 Python
python中使用%与.format格式化文本方法解析
2017/12/27 Python
linux安装Python3.4.2的操作方法
2018/09/28 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
使用python实现男神女神颜值打分系统(推荐)
2019/10/31 Python
pygame实现烟雨蒙蒙下彩虹雨
2019/11/11 Python
python标识符命名规范原理解析
2020/01/10 Python
Python代码执行时间测量模块timeit用法解析
2020/07/01 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
HTML5轻松实现全屏视频背景的示例
2018/04/23 HTML / CSS
小学体育教学反思
2014/01/31 职场文书
个人授权委托书范文
2014/09/21 职场文书
2014年减负工作总结
2014/12/10 职场文书
招标保密承诺书
2015/01/20 职场文书
超市员工辞职信范文
2015/05/12 职场文书
实习单位意见
2015/06/04 职场文书
职工趣味运动会开幕词
2016/03/04 职场文书
python 字典和列表嵌套用法详解
2021/06/29 Python
Mysql8.0递归查询的简单用法示例
2021/08/04 MySQL
MySQL创建管理RANGE分区
2022/04/13 MySQL