详解vuex状态管理模式


Posted in Javascript onNovember 01, 2018

一、前言

本次接受一个BI系统,要求是能够接入数据源-得到数据集-对数据集进行处理-展现为数据的可视化,这一个系统为了接入公司自身的产品,后端技术采用spring boot,前端采用vue+vuex+axios的项目架构方式,vuex作为vue的状态管理,是尤为重要的部分。这里,我将vuex如何运作和使用做一次总结,有错的地方,望多多提点。

二、vuex简单使用

安装vuex

cnpm install vuex --save

在src目录下建立文件夹,命名为store,建立index.js

如图所示:

详解vuex状态管理模式

在index.js中引入vue和vuex状态管理,并导出vuex,代码如下:

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
  state: {
   token: 0
  },
 })
 export default store;

在main.js中引入刚刚创建好的store并作为vue的store

import Vue from 'vue'
import App from './App.vue'
import store from './store/index'
Vue.config.productionTip = false
new Vue({
 render: h => h(App)
 ,
 store
}).$mount('#app')

获得store里的token

在vue的组件中,想要获得vuex里的全局数据,可以把vue看做一个类,在其下面有许多属性,其中有我们刚刚注入的vuex,如图

详解vuex状态管理模式

我们可以看到vue他本身就是一个json,在其下有$store这个对象,而$store下又有state,state下得就是我们存储在vue中的全局数据,在组件中通过this.$store.state.token即可获得我们的数据。

三、vuex的核心概念之getters

有时候我们需要在获得的数据做一些简单的过滤或者处理的时候,getters就起到作用了。

代码如下

getters:{
    getToken(state){
     return state.token;
    }

同直接获取token的方式一样。getters也已经挂载到了$store下,故,我们可以通过this.$store.state.getters.getToken的方式,调用其函数。 但vuex为我们提供了mapGetters能够将其映射到对应的getters的方法上去,用法如下所示

import {mapGetters,mapActions} from 'vuex'
export default {
 name: 'app',
 components: {
  HelloWorld
 },
 computed:{
  ...mapGetters(["getToken"])
 },
 mounted() {
   console.log(this.getToken)
  console.log(this.$store.getters.getToken)
 
 },
}

映射出来的getters仍然挂载在vue上,如图所示

详解vuex状态管理模式

四、vuex的核心概念之mutations与actions

我们可以吧mutations理解成一个事件函数,而actions就是触发器,通过actions,发起动作。

简单实例代码如下。

mutations:{
     setToken(state,n){
      state.token=state.token+n;
     }
    },
    actions:{
     setToken({commit},n){
      commit('setToken',n)
     }
    }

在组件中的使用,同getters的用法,代码如下

import {mapGetters,mapActions} from 'vuex'
export default {
 name: 'app',
 components: {
  HelloWorld
 },
 computed:{
  ...mapGetters(["getToken"])
 },
 
 mounted() {

  console.log(this)
  console.log(this.setToken(1))
  console.log(this.getToken)
 
 },methods:{
    ...mapActions(["setToken"])
 },

在vue的json中,同样可以找到相同的属性。

详解vuex状态管理模式

五、vuex核心概念之mudules

vuex允许我们将store分为不同的模块,每个单独的模块具备getters,state,mutations,actions这四个store核心,

需要注意的是如果在模块内部加入了namesapced:true这一个属性。在取值的时候需要做一点细微的变动,通过mapGetters火mapActions映射时需要将模块名作为路劲,来获得该模块的getters,和actions,模块化代码如下

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const moduleA = {
 namespaced:true,
 state: { a:1 },
 mutations: { },
 actions: { },
 getters: { geta(state){
  return state.a;
 } }
}

const moduleB = {
 namespaced:true,
 state: { b:1},
 mutations: { },
 actions: {}
}

const store = new Vuex.Store({ 
 
  state: {
   token: 0
  },
  getters:{
    getToken(state){
     return state.token;
    },
   
  } , mutations:{
   setToken(state,n){
     state.token=state.token+n;
   }
  },
  actions:{
   setToken({commit},n){
    commit('setToken',n)
   }
  },
  modules: {
   a: moduleA,
   b: moduleB
  },
 })
 export default store;

在组件中获得模块A的值得时候,我们来看一下geta这个getters属性,在vue中的状态,如图所示

详解vuex状态管理模式

geta为模块a下得getters属性,在获取的时候就需要这样

computed:{
  // ...mapGetters(["getToken"])
  ...mapGetters("a",["geta"])
 },
 
 mounted() {

  console.log(this)
  console.log(this.geta)

而如果模块没有命令空间的话,vuex会自动将模块内的getters,actions注入为全局的,直接按照原来个获取方式就可以了。

六、总结

这是我对vuex的基本用法和基本理解方式,vuex当然不可能局限于此,此处只列举了最简单的,做个总结的同时也等同于记下,据说vue3块出了,是用ts重写的vue,到时再去看看,vue3又有了哪些变化,和哪些可取之处。本文所写,有不对的地方,大家多多提出来。共同进步。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript去除空格的几种方法
Oct 03 Javascript
jQuery 使用手册(三)
Sep 23 Javascript
jQuery 点击图片跳转上一张或下一张功能的实现代码
Mar 12 Javascript
JS构建页面的DOM节点结构的实现代码
Dec 09 Javascript
基于iframe实现类似于ajax的页面无刷新
May 31 Javascript
JS合并数组的几种方法及优劣比较
Sep 19 Javascript
深入理解jQuery之防止冒泡事件
May 24 Javascript
angular.js指令中的controller、compile与link函数的不同之处
May 10 Javascript
详解Vue2.0 事件派发与接收
Sep 05 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
Jul 12 Javascript
浅谈JavaScript面向对象--继承
Mar 20 Javascript
刷新页面后让控制台的js代码继续执行
Sep 20 Javascript
详解angularjs跨页面传参遇到的一些问题
Nov 01 #Javascript
Vue.js 事件修饰符的使用教程
Nov 01 #Javascript
微信小程序实现蒙版弹窗效果
Nov 01 #Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
Nov 01 #Javascript
JS 音频可视化插件Wavesurfer.js的使用教程
Oct 31 #Javascript
微信小程序实现留言板
Oct 31 #Javascript
Angular父子组件通过服务传参的示例方法
Oct 31 #Javascript
You might like
PHP删除数组中的特定元素的代码
2012/06/28 PHP
PHP判断文章里是否有图片的简单方法
2014/07/26 PHP
Laravel框架学习笔记(一)环境搭建
2014/10/15 PHP
PHP实现登陆表单提交CSRF及验证码
2017/01/24 PHP
PHP读取、解析eml文件及生成网页的方法示例
2017/09/04 PHP
PHP实现负载均衡下的session共用功能
2018/04/17 PHP
php app支付宝回调(异步通知)详解
2018/07/25 PHP
javascript 通用loading动画效果实例代码
2014/01/14 Javascript
node.js使用nodemailer发送邮件实例
2014/03/10 Javascript
node.js中的http.response.getHeader方法使用说明
2014/12/14 Javascript
JavaScript 学习笔记之操作符
2015/01/14 Javascript
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
JS实现最简单的冒泡排序算法
2017/02/15 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
node命令行工具之实现项目工程自动初始化的标准流程
2019/08/12 Javascript
JS实现页面数据懒加载
2020/02/13 Javascript
vue webpack build资源相对路径的问题及解决方法
2020/06/04 Javascript
vue中如何添加百度统计代码
2020/12/19 Vue.js
[13:16]INFAMOUS vs VGJ T BO3
2018/06/07 DOTA
[01:13:18]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
Python学习笔记(一)(基础入门之环境搭建)
2014/06/05 Python
python实现中文分词FMM算法实例
2015/07/10 Python
python调用虹软2.0第三版的具体使用
2019/02/22 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
2019/06/24 Python
python障碍式期权定价公式
2019/07/19 Python
Django框架之中间件MiddleWare的实现
2019/12/30 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
如何用python免费看美剧
2020/08/11 Python
ASOS西班牙官网:英国在线时尚和美容零售商
2020/01/10 全球购物
你常见到的runtime exception
2016/09/05 面试题
工程造价专业大学生职业规划范文
2014/03/09 职场文书
公证书标准格式
2014/04/10 职场文书
大学运动会加油稿
2015/07/22 职场文书
《葡萄沟》教学反思
2016/02/23 职场文书
MySQL 时间类型的选择
2021/06/05 MySQL
nginx服务器的下载安装与使用详解
2021/08/02 Servers