导图社区 Vuex
什么是Vuex? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生...
编辑于2022-07-11 11:57:20Vuex
Vuex的概述
什么是vuex
Vuex是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间的数据共享
Vuex管理数据的优点
A.能够在vuex中集中管理共享的数据,便于开发和后期进行维护 B.能够高效的实现组件之间的数据共享,提高开发效率 C.存储在vuex中的数据是响应式的,当数据发生改变时,页面中的数据也会同步更新
Vuex的基本使用步骤
1.安装 npm i vuex --save
2.在src文件目录下新建store>index.js文件
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); const store = new Vuex.Store(); export default store;
3, 入口文件里面引入store,然后再全局注入
import store from './store'//引入store new Vue({ el: '#app', router, store,//使用store template: '', components: { App } })
4.使用
0,在state中定义数据
Vue.use(Vuex) const store = new Vuex.Store({ state:{ count:1 } })
1,Getter相当于vue中的computed计算属性,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,Getters 可以用于监听、state中的值的变化,返回计算后的结果
getters:{ getCount:state=>{ return state.count+1 }
2,给action注册事件处理函数,当这个函数被触发时候,将状态提交到mutations中处理。actions里面自定义的函数接收一个context参数和要变化的形参
actions:{ addFun(context,n){ context.commit('add',n) } , removeFun(context){ context.commit("remove") } }
3,mutations是一个对象里。面的方法 都是同步事务,是更改state初始状态的唯一合法方法,具体的用法就是给里面的方法传入参数state或额外的参数
mutations:{ add(state,n){ state.count = state.count+n }, remove(){ state.count=state.count-1 } },
dispatch:含有异步操作,例如向后台提交数据,写法: this.$store.dispatch('action方法名',值) commit:同步操作,写法:this.$store.commit('mutations方法名',值)
export defult{ data(){ return{ mag:'aaa' } }, methods:{ addCount(){ this.$store.commit('add') }, reoveCount:function(){ this.$store.commit('remove') }, addFun(){ let n =2; this.$store.dispatch('addFun',n) }, removeFun(){ this.$store.dispatch('removeFun') } } }
Vuex中的核心特性
State
State提供唯一的公共数据源,所有共享的数据都要统一放到Store中的State中存储
在组件中访问State的方式:
1).this.$store.state.全局数据名称 如:this.$store.state.count
2).先按需导入mapState函数: import { mapState } from 'vuex' 然后数据映射为计算属性: computed:{ ...mapState(['全局数据名称']) }
Mutation
Mutation用于修改变更$store中的数据
使用方式第一种
打开store.js文件,在mutations中添加代码如下
mutations: { add(state,step){ //第一个形参永远都是state也就是$state对象 //第二个形参是调用add时传递的参数 state.count+=step; } }
然后在Addition.vue中给按钮添加事件代码如下:
<button @click="Add">+1</button> methods:{ Add(){ //使用commit函数调用mutations中的对应函数, //第一个参数就是我们要调用的mutations中的函数名 //第二个参数就是传递给add函数的参数 this.$store.commit('add',10) } }
使用mutations的第二种方式:
import { mapMutations } from 'vuex' methods:{ ...mapMutations(['add']) }
import { mapState,mapMutations } from 'vuex' export default { data() { return {} }, methods:{ //获得mapMutations映射的sub函数 ...mapMutations(['sub']), //当点击按钮时触发Sub函数 Sub(){ //调用sub函数完成对数据的操作 this.sub(10); } }, computed:{ ...mapState(['count']) } }
Action
在mutations中不能编写异步的代码,会导致vue调试器的显示出错。 在vuex中我们可以使用Action来执行异步操作。
操作步骤如下:
打开store.js文件,修改Action,如下:
actions: { addAsync(context,step){ setTimeout(()=>{ context.commit('add',step); },2000) } }
然后在Addition.vue中给按钮添加事件代码如下
<button @click="AddAsync">...+1</button> methods:{ AddAsync(){ this.$store.dispatch('addAsync',5) } }
第二种方式:
import { mapActions } from 'vuex' methods:{ ...mapMutations(['subAsync']) }
如下:
import { mapState,mapMutations,mapActions } from 'vuex' export default { data() { return {} }, methods:{ //获得mapMutations映射的sub函数 ...mapMutations(['sub']), //当点击按钮时触发Sub函数 Sub(){ //调用sub函数完成对数据的操作 this.sub(10); }, //获得mapActions映射的addAsync函数 ...mapActions(['subAsync']), asyncSub(){ this.subAsync(5); } }, computed:{ ...mapState(['count']) } }
Getter
Getter用于对Store中的数据进行加工处理形成新的数据 它只会包装Store中保存的数据,并不会修改Store中保存的数据,当Store中的数据发生变化时,Getter生成的内容也会随之变化
打开store.js文件,添加getters,如下:
export default new Vuex.Store({ ....... getters:{ //添加了一个showNum的属性 showNum : state =>{ return '最新的count值为:'+state.count; } } })
然后打开Addition.vue中,添加插值表达式使用getters
或者也可以在Addition.vue中,导入mapGetters,并将之映射为计算属性
import { mapGetters } from 'vuex' computed:{ ...mapGetters(['showNum']) }