5分钟让你掌握Vuex,深入浅出
5分钟让你掌握Vuex,深入浅出
一、什么是Vuex?
概念:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
简单点来说(说人话),就是实现任意组件中通信,并可以检测数据的变化。
二、Vuex原理
Vuex是集中于MVC模式中的Model层,规定所有的数据操作必须通过 action - mutation - state
的流程来进行,再结合Vue的数据视图v-moder等双向绑定特性来实现页面的展示更新。
下面看一张图来了解全过程。
简述主要方法详情:
- Vue Components:Vue组件。展示页面,负责接收用户操作等交互行为,执行dispatch方法触发对应action进行回应。
- dispatch:操作行为触发方法。是唯一能执行action的方法。
- actions:操作行为处理模块。处理Vue Components接收到的所有交互行为。包含同步/异步操作,支持多个同名方法,按照注册的顺序依次触发。向后台API请求的操作就在这个模块中进行,包括触发其他action以及提交mutation的操作。该模块提供了Promise的封装,以支持action的链式触发。
- commit:状态改变提交操作方法。对mutation进行提交,是唯一能执行mutation的方法。
- mutations:状态改变操作方法。是Vuex修改state的唯一推荐方法,其他修改方式在严格模式下将会报错。该方法只能进行同步操作,且方法名只能全局唯一。操作之中会有一些hook暴露出来,以进行state的监控等。
- state:页面状态管理容器对象。集中存储Vue components中data对象的零散数据,全局唯一,以进行统一的状态管理。页面显示所需的数据从该对象中进行读取,利用Vue的细粒度数据响应机制来进行高效的状态更新。
总的一句话简述就是:
Vue组件接收交互行为,调用dispatch方法触发action相关处理,若页面状态需要改变,则调用commit方法提交mutation修改state,通过getters获取到state新值,响应数据或状态给Vue 组件,界面随之更新。
三、Vuex的使用
1.安装
npm install vuex --save
2.新建一个文件夹store,创建inde.js
随便叫啥,随便建不建立文件夹。为了规范。
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
//准备actions---用于响应组件中的动作
const actions={
}
//准备mutations---用于操作数据(state)
const mutations={
}
//准备state---相当于data,用于存储数据
const state={
}
//实例化创建并导出store
export default new Vuex.Store({
namespaced: true,//解决模块命名冲突
actions,
mutations,
state,
})
注意:
我们在这一步创建index.js文件的时候导入并引用Vuex,因为我们要实例化Vuex对象。如果在main引入,会导致在main.js导入store的时候报错。
3.在main.js中引入上一步的index.js,并在实例化 Vue对象时加入 store 对象 :
import store from './store/index' //引入写好的store
.....
new Vue({
el: '#app',
router,
store,//使用store
template: '',
components: { App }
})
ok,环境搭好,开始操作。
4.简单使用:
先来一点简单的存放数据,取出查看。在一系列操作之后我们的VM(View Model)和VC(View component)身上都已经都有store这个数据源对象。所以我们可以从store身上使用this.$store.state.xxx
获取数据。
在index.js中准备数据
const state={
name:'浪漫主义码农',
age:18,
}
在组件中获取数据
<template>
<div>
我放在store中的数据是 {{this.$store.state.name}}, {{this.$store.state.age}}
</div>
</template>
5.mutation、anction
在知道每一个vm和vc身上都有store就可以好好操作了。
mutation--更改store中状态的唯一方法
根据上面的原理图,我们能知道vuex中规定只能通过提交mutation的方式去更改store中的状态,包括action中的操作,也是通过提交mutation去修改。另外一点就是vuex中规定mutation中不能包含异步操作
我们来修改上面的name、age属性。
const mutations = {
modify_age(state) {//不带参数修改age属性,state是默认的参数
state.name = "张三";
state.age = 20;
},
modify_age2(state,payload) {//带参数修改,payload是传入的对象,官网叫载荷(payload)
state.name=payload.name;
state.age=payload.age;
}
}
在组件中,我们要使用this.$store.commit('xxx(方法名)', 参数;
参数可以是对象也可以是单一属性
<template>
<div>
我放在store中的数据是 {{ this.$store.state.name }},
{{ this.$store.state.age }}
<button @click="setDefault">不带参修改</button>
<button @click="setparameter">带参修改</button>
</div>
</template>
<script>
export default {
methods: {
setDefault() {
this.$store.commit("modify_age");
},
setparameter() {
this.$store.commit("modify_age2",{name:"王五",age:100});//载荷形式,传入可以使对象或者单个属性
// this.$store.commit({//对象形式,传入可以使对象或者单个属性
// type: "modify_age2",
// name: "王五",
// age: 100,
// });
});
},
},
};
</script>
anction--同步/异步更改状态
Action 类似于 mutation,不同在于:
- Action 提交的是 mutation,而不是直接变更状态。
- Action 可以包含任意异步操作。
后台API请求在这个模块进行请求。所有的操作最后都要到达mutation进行操作,更改state的状态。
还是上面一个例子,异步修改state的属性
先上代码
const actions = {
asy_modify (context) {//无参
setTimeout(() => {//异步操作
context.commit("modify_age")
}, 2000);
},
asy_modify2 (context,plyload) {//有参
setTimeout(() => {
context.commit("modify_age2",plyload);
}, 2000);
}
}
const mutations = {
modify_age(state) {//不带参数修改age属性,state是默认的参数
state.name = "张三";
state.age = 20;
},
modify_age2(state,payload) {//带参数修改,payload是传入的对象,官网叫载荷(payload)
state.name=payload.name;
state.age=payload.age;
}
}
const state = {
name: '浪漫主义码农',
age: 18,
}
在组件中使用this.$store.dispatch('xxx')
<template>
<div>
我放在store中的数据是 {{ this.$store.state.name }},
{{ this.$store.state.age }}
<button @click="setDefault">不带参修改</button>
<button @click="setparameter">带参修改</button>
</div>
</template>
<script>
export default {
methods: {
setDefault() {
this.$store.dispatch("asy_modify");
},
setparameter() {
this.$store.dispatch("asy_modify2",{name:"王五",age:100});//载荷形式,传入可以使对象或者单个属性
// this.$store.dispatch({//对象形式,传入可以使对象或者单个属性
// type: "asy_modify2",
// name: "王五",
// age: 100,
// });
},
},
};
</script>
注意观察时间,2s后变化。
分析一波:
Action 里面的函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用
context.commit
提交一个 mutation,或者通过context.state
和context.getters
来获取 state 和 getters。action事件的触发同样可以使用载荷和对象两种方式
6. getter
getter,我们可以理解为是对store中state的一些派生状态,也可以理解为一种计算属性,它类似于计算属性一样,返回值会根据它的依赖被缓存起来,且依赖对象发生改变的时候它才会被重新计算。
getter属性相当于很多个组件需要对数据进行一样的处理,可以理解为公共的计算属性。
这样就很清晰了
Getter 接受 state 作为其第一个参数,也可以使用箭头函数。
const getters = {
get_object: function (state) {//无参
if (state.age < 18) {
return state.name + '未成年'
}
return state.name + '已经成年了'
},
get_object2: function (state) {//有参数
return function(value){
return state.name + value;
}
}
}
组件中{this.$store.getters.xxx
来获取
<template>
<div>
我放在store中的数据是 {{ this.$store.state.name }},
{{ this.$store.state.age }}
<br>
<span>不带参数的数据:{{ this.$store.getters.get_object }}</span>
<br>
<span>带参数的数据(携带一个刚好18岁):{{
this.$store.getters.get_object2("刚好18岁")
}}</span>
</div>
</template>
7.Modoules
Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块。这里就不过多介绍了,看官方文档(Module | Vuex (vuejs.org))
8.辅助函数
vuex提供了几个的辅助函数,有mapState、mapGetter、mapMutation、mapAction。都是一些复杂语句的简写形式。
引入函数
import {mapState,mapGetters,mapMutation,mapAction} from 'vuex'
mapState
如果state中的数据很多,那我们要重复写很多这样的this.$store.state.XXX
代码,我们就可以通过mapState来映射。
数组的写法
export default {
computed:{
...mapState(['name','age'])//自动就添加到了计算属性中,此时就可以直接像访问计算属性一样访问它
}
};
如果你想取名别名的话,就要写成对象的形式
...mapState(
{
myname: 'name',
myage: "age",
}
mapGetters
mapGetters和mapState很相似,只不过是映射Getters。替代this.$store.getters.XXX
computed: {
...mapGetters(['get_object','get_object2']),//数组形式写法
...mapGetters({get1:'get_object',get2:'get_object2'})//可以取别名,对象形式写法
},
mapMutation
替代this.$store.commit('XXX')
computed: {
...mapMutation(['modify_age','modify_age2']),//数组形式写法
...mapMutation({modify:'modify_age',modify2:'modify_age2'}),//可以取别名,对象形式写法
},
mapAction
替代this.$store.dispatch('XXX')
computed: {
...mapAction(['asy_modify','asy_modify2']),//数组形式写法
...mapAction({act_modify:'asy_modify',act_modify2:'asy_modify2'})//对象形式写法
},
以上这些辅助函数,涉及到传参都需在使用的计算属性的时候传入。
四、写在最后
更具体的请看官网文档,欢迎各位大佬指点江山。
看到最后点赞收藏吧!
5分钟让你掌握Vuex,深入浅出的更多相关文章
- 5分钟带你入门vuex(vue状态管理)
如果你之前使用过vue.js,你一定知道在vue中各个组件之间传值的痛苦,在vue中我们可以使用vuex来保存我们需要管理的状态值,值一旦被修改,所有引用该值的地方就会自动更新,那么接下来我们就来学习 ...
- vuex深入浅出
本文主要记录使用vuex的使用场景.重要组成部分和学习心得. 1.说在前面 学习vue有两周的时间了,目前已经对vue的基础使用比较熟悉了.但是一直对vuex的使用耿耿于怀,这么说是因为总是不太理解, ...
- vuex和vuejs
前言:在最近学习 Vue.js 的时候,看到国外一篇讲述了如何使用 Vue.js 和 Vuex 来构建一个简单笔记的单页应用的文章.感觉收获挺多,自己在它的例子的基础上进行了一些优化和自定义功能,在这 ...
- 用vuex构建单页
原文地址:点我 前言:在最近学习 Vue.js 的时候,看到国外一篇讲述了如何使用 Vue.js 和 Vuex 来构建一个简单笔记的单页应用的文章.感觉收获挺多,自己在它的例子的基础上进行了一些优化和 ...
- 使用 Vuex + Vue.js 构建单页应用
鉴于该篇文章阅读量大,回复的同学也挺多的,特地抽空写了一篇 vue2.0 下的 vuex 使用方法,传送门:使用 Vuex + Vue.js 构建单页应用[新篇] ------------------ ...
- 深入浅出的webpack4构建工具--webpack4+vue+vuex+mock模拟后台数据(十九)
mock的官网文档 mock官网 关于mockjs的优点,官网这样描述它:1)可以前后端分离.2)增加单元测试的真实性(通过随机数据,模拟各种场景).3)开发无侵入(不需要修改既有代码,就可以拦截 A ...
- 深入浅出的webpack4构建工具--webpack4+vue+route+vuex项目构建(十七)
阅读目录 一:vue传值方式有哪些? 二:理解使用Vuex 三:webpack4+vue+route+vuex 项目架构 回到顶部 一:vue传值方式有哪些? 在vue项目开发过程中,经常会使用组件来 ...
- Vue.js——十分钟入门Vuex
一. 什么是Vuex? Vuex Vuex是一个专门为Vue.js应用程序开发的状态管理模式, 它采用集中式存储管理所有组件的公共状态, 并以相应的规则保证状态以一种可预测的方式发生变化. Vue ...
- 五分钟搞懂Vuex
这段时间一直在用vue写项目,vuex在项目中也会依葫芦画瓢使用,但是总有一种朦朦胧胧的感觉.于是决定彻底搞懂它. 看了一下午的官方文档,以及资料,才发现vuex so easy! 作为一个圈子中的人 ...
随机推荐
- 分布式系列-分布式ID
一.数据库自增(单实例) 1.方案描述 基于数据库自增ID(auto_increment)利用其来充当分布式ID.实现方式就是用一张表来充当ID生成器,当我们需要ID时,向表中插入一条记录返回主键ID ...
- 小白2分钟学会Visual Studio将引用包打包到NuGet上
前言 之前我们说 10分钟学会Visual Studio将自己创建的类库打包到NuGet进行引用(net,net core,C#),过程有些许繁琐,并且需要有一定的基础. 怎么办呢,不慌,看法宝. 两 ...
- java设计模式—单例模式(包含单例的破坏)
什么是单例模式? 保证一个了类仅有一个实例,并提供一个访问它的全局访问点. 单例模式的应用场景? 网站的计数器,一般也是采用单例模式实现,否则难以同步: Web应用的配置对象的读取,一般也应用单例模式 ...
- GDAL 矢量裁剪栅格
本节将介绍如何在Python中用GDAL实现根据矢量边界裁剪栅格数据. from osgeo import gdal, gdal_array import shapefile import numpy ...
- 20210821 打表,蛇,购物,ants
考场 T1 没看懂 T4 一眼回滚莫队,但忘记怎么写了,小慌 模拟 T1 题意的时候教练让 zsy 澄清了一下,确定了我不会做... T2 一看就是毒瘤题,T3 感觉比较可做 T4 确定了回滚的细节, ...
- Gitlab(1)- 简单介绍
什么是 Gitlab 一个开源分布式版本控制系统 开发语言:Ruby 功能:管理项目源代码.版本控制.代码复用与查找.权限管控 Git 家族成员 Git:是一种版本控制系统,是一个命令,是一种工具 G ...
- docker一分钟搭建nginx服务器
运行nginx服务 拉取: docker pull nginx:1.17.9 运行: docker run -d --name nginx -P 80:80 nginx:1.17.9 -d表示在后台启 ...
- JS012. 变量存储含class、id等其他属性的标签元素(动态渲染DOM结点)
项目中有一处源码需要用变量存储html标签,包含类名和其他一些属性,再动态地将其渲染到页面上. 看下普通的存储方式: initHtml: function () { var me = this; // ...
- 【转】mysql实现随机获取几条数据的方法
sql语句有几种写法 1:SELECT * FROM tablename ORDER BY RAND() LIMIT 想要获取的数据条数: 2:SELECT *FROM `table` WHERE i ...
- Java基础系列(1)- JDK、JRE、JVM
Java三大版本(Write Once:Run Anywhere) JavaSE:标准版 JavaME:嵌入式开发 JavaEE:E企业级开发 JDK.JRE.JVM JDK是开发工具包 JRE是编译 ...