版本问题

截止博客发布前,Vuex 拥有 3.x 和 4.x 版本。

本文总结的是与 Vue 2 匹配的 Vuex 3 的使用。

更多操作请参考官方文档:https://v3.vuex.vuejs.org/

与 Vue 3 匹配的 Vuex 4 的文档: https://vuex.vuejs.org/

状态管理模式

写过 vue 项目的程序员应该都知道父子组件传参的方式,通过子组件的 props 参数,和 $emit 来触发事件。

但是当遇到多个组件共享状态时,传参的方法对于多层嵌套的组件将会非常繁琐,并且对于兄弟组件间的状态传递无能为力,甚至会导致无法维护的代码。

基于此,把组件的共享状态抽取出来,以一个全局单例模式管理,vuex 就产生了。

安装使用

Vue 2 的脚手架项目,安装 3.6.2版本。

npm install vuex@3.6.2 --save

在 src 目录下新建 store 文件夹,在该目录下新建 index.js

index.js

import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex)const state = {count: 1
}const getters = {}const mutations = {add(state, n) {state.count += n},reduce(state) {state.count--}
}const actions = {}export default new Vuex.Store({state,getters,mutations,actions
})

入口文件引入

main.js

import store from './store'new Vue({el: '#app',store,components: {App},template: '<App/>'
})

简单示例

通过 commit 提交 mutation 中的方法修改 state。

组件代码

<template><div><el-button @click="$store.commit('add', 1)">add</el-button><el-button @click="$store.commit('reduce')">reduce</el-button><div>值:{{ $store.state.count }}</div></div>
</template>

在实际开发过程中,直接使用 $store. 这样的方式似乎不太优雅,可以参考以下写法。

<script>
import { mapState, mapMutations } from "vuex";export default {name: "vuex",data() {return {};},computed: {...mapState(["count"])},mounted() {},methods: {...mapMutations(["add", "reduce"])}
};
</script>

方法调用

<template><div><el-button @click="add(1)">add</el-button><el-button @click="reduce">reduce</el-button><div>值:{{ count }}</div></div>
</template>

五大核心概念

1、State

相当于 Vue 中的 data,以及 React 中的 state。

Vuex 使用单一状态树,用一个对象就包含了全部的应用层级状态,单状态树和模块化并不冲突。

获取 state

如上述示例所示,html 中可以使用 $store.state.count 获取(属性访问),js 中需要在前面加 this.

还可以通过 mapState 辅助函数,将状态加入计算属性中。

2、Getters

getter可以认为是 store 的计算属性,返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。

如果有多个组件需要共用状态的某计算属性,可以使用它。

修改上述 index.js

const state = {count: 1,todos: [{id: 1,text: '...',done: true},{id: 2,text: '...',done: false}]
}const getters = {doneTodos: state => {return state.todos.filter(todo => todo.done)}
}

mapGetters 辅助函数

import { mapGetters, mapMutations } from "vuex";computed: {...mapGetters(["doneTodos"])},mounted() {console.log(this.doneTodos); // },

3、Mutations

更改状态的唯一方法是提交 mutation。

如上示例,mutation 中可以定义更改状态 state 的方法。也可以使用常量替代 Mutation 事件类型。

// mutation-types.js
export const SOME_MUTATION = 'SOME_MUTATION'
const mutations = {// 我们可以使用一个常量作为函数名[SOME_MUTATION] (state) {// mutate state}
}

注意:一条重要的原则就是要记住 mutation 必须是同步函数。

在组件中提交 mutation 主要用到 commit 方法,或者 mapMutations 辅助函数,参考上述示例。

4、Actions

Action 类似于 mutation,不同在于:

Action 提交的是 mutation,而不是直接变更状态。
Action 可以包含任意异步操作。

也就是说,如果有需要进行后台接口更新操作,需要使用 Action。

修改上述 index.js

const actions = {addAsync({ commit }) {setTimeout(() => {commit('add', 10)}, 1000);}
}

在组件中使用 this.$store.dispatch('xxx') 分发 action,或者使用 mapActions 辅助函数,调用类似 mapMutations

5、Modules

module,即模块。Vuex 允许多模块以应对复杂的应用而造成 store 对象臃肿的问题。

为了方便管理,在 store 下新建 modules 目录,然后在该目录下新建一个 dept.js。

dept.js

const state = {deptList: [{deptID: 0,deptName: '总经理室'}]
}const getters = {}const mutations = {add(state, dept) {state.deptList.push(dept)}
}const actions = {}export default {namespaced: true, // 使用命名空间state,actions,getters,mutations
}

然后修改 store 目录下的 index.js,引入模块

const modules = {}
const require_module = require.context('./modules', false, /.js$/)
require_module.keys().forEach(file_name => {console.log(file_name)modules[file_name.slice(2, -3)] = require_module(file_name).default
})export default new Vuex.Store({modules,state,getters,mutations,actions
})

组件调用 state

<div>{{ $store.state.dept.deptList }}</div>// 或
<div>{{ dept.deptList }}</div>computed: {...mapState(["dept"])},

调用 mutation

this.$store.commit("dept/add", { deptName: "开发部", deptID: 1 });// 或
<el-button @click="add({deptName: '开发部'})">add</el-button>
methods: {...mapMutations("dept", ["add"])}

Vuex 3使用总结相关推荐

  1. 【实用】Angular中如何实现类似Vuex的全局变量状态变化功能?

    什么是Vuex?只需三分钟!只需创建一个vuex.js文件,让你马上学会使用Vuex,尽管Vuex是个鸡肋!(扔掉store文件夹和里面的index.getters.actions.mutations ...

  2. 只需三分钟!只需创建一个vuex.js文件,让你马上学会使用Vuex,尽管Vuex是个鸡肋!(扔掉store文件夹和里面的index、getters、actions、mutations等js文件吧!)

    前情提示:有一天,我要实现一个效果→点击某个按钮改变一个全局变量,并且要让绑定了该变量的所有位置异步渲染.我试过用一个全局的js文件存放该变量,该变量值虽然改变了,但是没有做到异步渲染.接着我用win ...

  3. vuex+vue-router拦截

    干就完了 项目中经常遇到这样一个场景,用户信息或者进行增删改的一些模块,需要根据用户是否登录,进行路由拦截,直接上代码 在store文件夹下的store.js中存放一个默认登录状态 /** store ...

  4. mutations vuex 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...

    前言 Vuex源码系列不知不觉已经到了第六篇.前置的五篇分别如下: 长篇连载:Vuex源码学习(一)功能梳理 长篇连载:Vuex源码学习(二)脉络梳理 作为一个Web前端,你知道Vuex的instal ...

  5. 在vue中使用vuex,修改state的值示例

    1. 安装 vuex npm install vuex -S 2.在目录下创建store文件 3. 在store.js编辑一个修改state的方法 然后在mian.js中全局引入 最后在组件中使用 这 ...

  6. vue之mapMutaions的使用 vuex中 action 用法示例 api.js的使用

    vue之mapMutations的使用 我们通过Mutation来改变store中的state,方法往往是在子组件中使用 this.$store.commit(); 来实现,但是这样的缺点是不容易查看 ...

  7. 基于Vue, Vuex 和 ElementUI 构建轻量单页Hexo主题Lite

    Hexo Theme Lite Keep Calm, Lite and Writing. light single page blog application theme, using Vue, Vu ...

  8. 详解 Vue Vuex 实践

    2019独角兽企业重金招聘Python工程师标准>>> 随着应用复杂度的增加,我们需要考虑如何进行应用的状态管理,将业务逻辑与界面交互相剥离,详细讨论参考笔者的2016-我的前端之路 ...

  9. vue总结 08状态管理vuex

    状态管理 类 Flux 状态管理的官方实现 由于状态零散地分布在许多组件和组件之间的交互中,大型应用复杂度也经常逐渐增长.为了解决这个问题,Vue 提供 vuex:我们有受到 Elm 启发的状态管理库 ...

  10. 使用vue2.0 vue-router vuex 模拟ios7操作

    其实你也可以,甚至做得更好... 首先看一下效果:用vue2.0实现SPA:模拟ios7操作 与 通讯录实现 github地址是:https://github.com/QRL909109/ios7 如 ...

最新文章

  1. 如何利用高斯混合模型建立更好、更精确的集群?
  2. Oracle数据库中有关记录个数的查询
  3. c# 连接Redis报错:WRONGTYPE Operation against a key holding the wrong kind of value:类型搞混弄出的错误...
  4. 微信公众平台开发—利用OAuth2.0获取微信用户基本信息
  5. 深度学习之基于CNN实现汉字版手写数字识别(Chinese-Mnist)
  6. chisel快速入门(二)
  7. ASP.NET Core on K8S深入学习(7)Dashboard知多少
  8. Silverlight:Downloader的使用(event篇)
  9. 现代软件工程 作业 团队第一个作业
  10. 用python对单一微博文档进行分词——jieba分词(加保留词和停用词)
  11. 软工网络15个人作业5--软件工程总结
  12. 打开你的脑洞:NER如何进行数据增强 ?
  13. Java开发快递物流项目(5)
  14. git上传提示鉴权失败的问题
  15. 几种常用交叉验证(cross validation)方式的比较
  16. 用ChatGPT实现变现的多种方法
  17. QQ空间迁移_【Frame_relay子接口的两种配置方法】
  18. 【论文阅读】KLD模型
  19. 卡塔尔世界杯安防难题如何通过视频监控技术突破
  20. App前端,Web前端,后端,微信小程序到底该学啥?

热门文章

  1. web应用 —— JavaScript
  2. 会当凌绝顶,一览众山小。
  3. js文本内容显示6行,超出6行出现显示更多按钮,css样式超出行数只能使用...去替代
  4. 考研笔记之数据结构之线性表(严蔚敏版)
  5. 希捷硬盘的问题/移动硬盘/USB 硬盘和芯片
  6. 《让时间陪你慢慢变富》读书笔记
  7. 从数理角度理解生活中的“二八定律”
  8. 第一章、统计学习方法概论
  9. 【ChatGLM】基于 ChatGLM-6B + langchain 实现本地化知识库检索与智能答案生成: 中文 LangChain 项目的实现开源工作
  10. 工业机器人——1如何描述刚体的运动状态?(台大机器人学学习笔记)