Vuex 3使用总结
版本问题
截止博客发布前,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使用总结相关推荐
- 【实用】Angular中如何实现类似Vuex的全局变量状态变化功能?
什么是Vuex?只需三分钟!只需创建一个vuex.js文件,让你马上学会使用Vuex,尽管Vuex是个鸡肋!(扔掉store文件夹和里面的index.getters.actions.mutations ...
- 只需三分钟!只需创建一个vuex.js文件,让你马上学会使用Vuex,尽管Vuex是个鸡肋!(扔掉store文件夹和里面的index、getters、actions、mutations等js文件吧!)
前情提示:有一天,我要实现一个效果→点击某个按钮改变一个全局变量,并且要让绑定了该变量的所有位置异步渲染.我试过用一个全局的js文件存放该变量,该变量值虽然改变了,但是没有做到异步渲染.接着我用win ...
- vuex+vue-router拦截
干就完了 项目中经常遇到这样一个场景,用户信息或者进行增删改的一些模块,需要根据用户是否登录,进行路由拦截,直接上代码 在store文件夹下的store.js中存放一个默认登录状态 /** store ...
- mutations vuex 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...
前言 Vuex源码系列不知不觉已经到了第六篇.前置的五篇分别如下: 长篇连载:Vuex源码学习(一)功能梳理 长篇连载:Vuex源码学习(二)脉络梳理 作为一个Web前端,你知道Vuex的instal ...
- 在vue中使用vuex,修改state的值示例
1. 安装 vuex npm install vuex -S 2.在目录下创建store文件 3. 在store.js编辑一个修改state的方法 然后在mian.js中全局引入 最后在组件中使用 这 ...
- vue之mapMutaions的使用 vuex中 action 用法示例 api.js的使用
vue之mapMutations的使用 我们通过Mutation来改变store中的state,方法往往是在子组件中使用 this.$store.commit(); 来实现,但是这样的缺点是不容易查看 ...
- 基于Vue, Vuex 和 ElementUI 构建轻量单页Hexo主题Lite
Hexo Theme Lite Keep Calm, Lite and Writing. light single page blog application theme, using Vue, Vu ...
- 详解 Vue Vuex 实践
2019独角兽企业重金招聘Python工程师标准>>> 随着应用复杂度的增加,我们需要考虑如何进行应用的状态管理,将业务逻辑与界面交互相剥离,详细讨论参考笔者的2016-我的前端之路 ...
- vue总结 08状态管理vuex
状态管理 类 Flux 状态管理的官方实现 由于状态零散地分布在许多组件和组件之间的交互中,大型应用复杂度也经常逐渐增长.为了解决这个问题,Vue 提供 vuex:我们有受到 Elm 启发的状态管理库 ...
- 使用vue2.0 vue-router vuex 模拟ios7操作
其实你也可以,甚至做得更好... 首先看一下效果:用vue2.0实现SPA:模拟ios7操作 与 通讯录实现 github地址是:https://github.com/QRL909109/ios7 如 ...
最新文章
- H.264(MPEG-4 AVC)级别(Level)、DPB 与 MaxDpbMbs 详解(转载)
- 简单分析Guava中RateLimiter中的令牌桶算法的实现
- Docker的部署-包括网关服务(Ocelot)+认证服务(IdentityServer4)+应用服务
- 【概率与期望】[UVA11021]Tribles
- 2018年各大互联网前端面试题五(今日头条)
- 前端学习(768):构造对象与对象区别
- [飞秋]局域网聊天写的代码旁人从来看不
- 下滑加载更多js_vue.js怎么实现滑动到底部加载更多数据效果?
- Fedora七年风雨路:寻访14个版本的足迹
- Android JS 通过X5WebView相互调用详解
- vb 运行错误429 mysql_win7系统运行VB工具提示“运行时错误429 ActiveX部件不能创建对象”的解决方法...
- 家庭作业(贪心 + 并查集)
- strtok用法详解
- 媒体 | 冒志鸿:理想nine percent最难寻
- MAXENT模型生物多样性
- PWorld2016大会演讲PPT+访谈视频大合集,总有一款是你在找的!
- 黑帽seo收徒之 微信视频号创作 变现
- Vue路由懒加载(resolve),嵌套路由 3
- 计算机二级办公软件的函数,《计算机二级办公软件常用excel函数》.doc
- 《HTML5 2D游戏编程核心技术》——第1章,第1.1节Snail Bait游戏
热门文章
- java番茄钟_个人用的简单番茄时钟
- 玫瑰花的折法:如何用钱折玫瑰(组图全说明)
- Go语言学习笔记 (网络编程)
- Oracle GraalVM 介绍:会当凌绝顶、一览众山小
- serve注解是加在哪个类_@Service注解是放实现类上的而非接口上
- STM32F0系列寄存器操作02:RCC时钟配置
- aee快递查询 在php_GitHub - tekintian/php-EAN-13-barcode at dd639319bbcf215aee728fd37eb9b7d39c8f45dd...
- 利用卷积神经网络对DWI的急性缺血性病变进行全自动分割
- ML之LoR:逻辑回归LoR算法的简介、应用、经典案例之详细攻略
- 离线强化学习(Offline RL)系列3: (算法篇) Onestep 算法详解与实现