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 如 ...
最新文章
- 如何利用高斯混合模型建立更好、更精确的集群?
- Oracle数据库中有关记录个数的查询
- c# 连接Redis报错:WRONGTYPE Operation against a key holding the wrong kind of value:类型搞混弄出的错误...
- 微信公众平台开发—利用OAuth2.0获取微信用户基本信息
- 深度学习之基于CNN实现汉字版手写数字识别(Chinese-Mnist)
- chisel快速入门(二)
- ASP.NET Core on K8S深入学习(7)Dashboard知多少
- Silverlight:Downloader的使用(event篇)
- 现代软件工程 作业 团队第一个作业
- 用python对单一微博文档进行分词——jieba分词(加保留词和停用词)
- 软工网络15个人作业5--软件工程总结
- 打开你的脑洞:NER如何进行数据增强 ?
- Java开发快递物流项目(5)
- git上传提示鉴权失败的问题
- 几种常用交叉验证(cross validation)方式的比较
- 用ChatGPT实现变现的多种方法
- QQ空间迁移_【Frame_relay子接口的两种配置方法】
- 【论文阅读】KLD模型
- 卡塔尔世界杯安防难题如何通过视频监控技术突破
- App前端,Web前端,后端,微信小程序到底该学啥?
热门文章
- web应用 —— JavaScript
- 会当凌绝顶,一览众山小。
- js文本内容显示6行,超出6行出现显示更多按钮,css样式超出行数只能使用...去替代
- 考研笔记之数据结构之线性表(严蔚敏版)
- 希捷硬盘的问题/移动硬盘/USB 硬盘和芯片
- 《让时间陪你慢慢变富》读书笔记
- 从数理角度理解生活中的“二八定律”
- 第一章、统计学习方法概论
- 【ChatGLM】基于 ChatGLM-6B + langchain 实现本地化知识库检索与智能答案生成: 中文 LangChain 项目的实现开源工作
- 工业机器人——1如何描述刚体的运动状态?(台大机器人学学习笔记)