版本问题

截止博客发布前,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. H.264(MPEG-4 AVC)级别(Level)、DPB 与 MaxDpbMbs 详解(转载)
  2. 简单分析Guava中RateLimiter中的令牌桶算法的实现
  3. Docker的部署-包括网关服务(Ocelot)+认证服务(IdentityServer4)+应用服务
  4. 【概率与期望】[UVA11021]Tribles
  5. 2018年各大互联网前端面试题五(今日头条)
  6. 前端学习(768):构造对象与对象区别
  7. [飞秋]局域网聊天写的代码旁人从来看不
  8. 下滑加载更多js_vue.js怎么实现滑动到底部加载更多数据效果?
  9. Fedora七年风雨路:寻访14个版本的足迹
  10. Android JS 通过X5WebView相互调用详解
  11. vb 运行错误429 mysql_win7系统运行VB工具提示“运行时错误429 ActiveX部件不能创建对象”的解决方法...
  12. 家庭作业(贪心 + 并查集)
  13. strtok用法详解
  14. 媒体 | 冒志鸿:理想nine percent最难寻
  15. MAXENT模型生物多样性
  16. PWorld2016大会演讲PPT+访谈视频大合集,总有一款是你在找的!
  17. 黑帽seo收徒之 微信视频号创作 变现
  18. Vue路由懒加载(resolve),嵌套路由 3
  19. 计算机二级办公软件的函数,《计算机二级办公软件常用excel函数》.doc
  20. 《HTML5 2D游戏编程核心技术》——第1章,第1.1节Snail Bait游戏

热门文章

  1. java番茄钟_个人用的简单番茄时钟
  2. 玫瑰花的折法:如何用钱折玫瑰(组图全说明)
  3. Go语言学习笔记 (网络编程)
  4. Oracle GraalVM 介绍:会当凌绝顶、一览众山小
  5. serve注解是加在哪个类_@Service注解是放实现类上的而非接口上
  6. STM32F0系列寄存器操作02:RCC时钟配置
  7. aee快递查询 在php_GitHub - tekintian/php-EAN-13-barcode at dd639319bbcf215aee728fd37eb9b7d39c8f45dd...
  8. 利用卷积神经网络对DWI的急性缺血性病变进行全自动分割
  9. ML之LoR:逻辑回归LoR算法的简介、应用、经典案例之详细攻略
  10. 离线强化学习(Offline RL)系列3: (算法篇) Onestep 算法详解与实现