Vuex

Vuex核心概念图

在这里插入图片描述

vuex有哪⼏种属性?

答:有五种,分别是 State、 Getter、Mutation 、Action、 Module
state => 基本数据(数据源存放地) getters => 从基本数据派⽣出来的数据 mutations => 提交更改数据的⽅法,同步! actions => 像⼀个装饰器,包裹mutations,使之可以异步。 modules => 模块化Vuex

vuex和普通全局对象区别

1、Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
2、你不能直接改变 store 中的状态。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化,从而让我们能够实现一些工具帮助我们更好地了解我们的应用。

Vuex状态库的创建

store.js

//引入vue和vuex
import Vue from 'vue';
import Vuex from 'vuex';
//使用vuex
Vue.use(Vuex);
//创建vue实例

const state={   //要设置的全局访问的state对象
     showFooter: true,
     //要设置的初始属性值
   };
   
const getters = {   //相当于计算属性
    isShow(state) {
       return state.showFooter
    }
};
const mutations = {//同步更改状态
    show(state) {   //自定义改变state初始值的方法,这里面的参数除了state之外还可以再传额外的参数(变量或对象);
        state.showFooter = true;
    }
};
const actions = {//异步更改状态
    hideFooter(context) {  //自定义触发mutations里函数的方法,context与store 实例具有相同方法和属性
        context.commit('hide');
    },
};
const store = new Vuex.Store(
{
   state,
   getters,
   mutations,
   actions
});
 
export default store;

modules

项目特别复杂的时候,可以让每一个模块拥有自己的state、mutation、action、getters,使得结构非常清晰,方便管理。

const moduleA = {
  state: { ... },
  mutations: { ... },
  actions: { ... },
  getters: { ... }
 }
const moduleB = {
  state: { ... },
  mutations: { ... },
  actions: { ... }
 }

const store = new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB
})

在组件内使用Vuex状态

直接获取、修改:

//state
this.$store.state.count
//getter
this.$store.getters.count
//调用 action 修改 state 值,不带参数
this.$store.dispatch('increment');
//调用 action 修改 state 值,带参数
this.$store.dispatch('increment',{value :123});

通过辅助函数 获取、修改vuex:

vuex提供了三种辅助函数用于获取、修改vuex:
mapState、mapGetters、mapActions
即将vuex的变量或者方法映射到vue组件this指针上。
获取共享变量使用:

使用state获取共享变量

<script type="text/javascript">
import { mapState } from 'vuex'
export default{
    computed : {
        ...mapState([
            'count',
            'buttonShow'
        ])
    }
}
</script>

使用getters获取共享变量,

<script type="text/javascript">
import { mapGetters } from 'vuex'
export default{
    computed : {
        ...mapGetters([
            'count',
            'buttonShow'
        ])
    }
}
</script>

使用actions修改共享变量

<script type="text/javascript">
import { mapActions } from 'vuex'
export default{
    methods : {
    	...mapActions({increment:'increment',decrement:'decrement'}),
    }
}
</script>

通过map获取到的变量或者方法,可通过 this 直接使用或者调用。

vuex异步修改状态

在调用vuex中的方法action的时候,添加异步操作实现异步修改

const actions = {
    asyncInCrement({ commit }, n){
        return new Promise(resolve => {
            setTimeout(() => {
                commit(types.TEST_INCREMENT, n);
                resolve();
            },3000)
        })
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值