Vuex(个人理解)

Vuex(个人理解)

  • state:初始化数据—全局状态
  • mutations:同步,更改state的数据
  • actions:异步,提交mutation来更改数据
  • getters:对state进行二次处理,比如筛选、过滤等。类似于计算属性
  • modules:模块化,将store分成多个模块
//store.js 定义vuex


import Vue from 'vue';
import Vuex from 'vuex'
Vue.use(Vuex)

//payload:支持对象、数字、字符串
 export default new Vuex.Store({
     state:{
        count:1,
        todoList:[{id:1,done:true},{id:2,done:false}]
    },
    mutations:{
        increment:(state,payload)=>{
            state.count += payload.num;
        },
        decrement:(state,payload)=>{
            state.count -= payload.num;
        }
    },
    actions:{
        //第一种定时任务
        incrementAsync:(context,payload)=>{
            settimeout(()=>{
                context.commit('increment',payload.num);
            },1000);
        },
        //第二种Promise对象
        incrementPromise:(context,payload)=>{
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    context.commit('increment',payload.num);
                    resolve();
                }, 1000);
            })
        },
        //第三种action互调
        actionsA:(context,payload)=>{
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    context.commit('increment',payload.num);
                    resolve();
                }, 1000)
            })
        },
        actionB:(context,payload)=>{
            return context.dispatch('actionA',payload.num).then(()=>{
                //提交其他mutation
                context.commit('decrement',payload.num);
            });
        }
    },
    getters:{
        //属性方式
        todoDoneList:(state)=>{
            //即返回的是todolist里的done:true的数据
            return state.todolist.filter(todo=>todo.done);
        },
        //方法方式
        todoDoneListById:(state)=>(id)=>{
            //即返回的是todolist里的done:true的数据
            return state.todolist.find(todo => todo.id === id);
        },
    }
 })

//index.vue 引用vuex

import {mapState,mapMutations,mapActions,mapGetters} from 'vuex';

export default{
    data(){
        return{
            localCount:2
        }
    },
    computed:{
        //mapState的使用方式
            //第一种调用方式
                count(){
                    return this.$store.state.count;
                },
            //第二种调用方式
                ...mapState(['todoList']),
            //第三种调用方式
                ...mapState({
                    //1. 箭头函数可使代码更简练
                    count: state => state.count,
                    //2. 传字符串参数 'count' 等同于this.countAlis = `state => state.count`
                    countAlias: 'count',
                    //3. 为了能够使用 `this` 获取局部状态,必须使用常规函数
                    countPlusLocalState (state) {
                      return state.count + this.localCount;
                    }
            }),
        //mapGetters的使用方式
            //属性方式
                //第一种调用方式
                    todoDoneList(){
                        return this.$store.state.getters.todoDoneList;//{id:1,done:true}
                    },
                //第二种调用方式
                    ...mapGetters(['todoDoneList']);
            //方法方式
                    todoDoneListById(){
                        return this.$store.state.getters.todoDoneListById(2);//{id:2,done:false}
                    },
    },
    methods:{
        //mapMutations的使用方式  
            //第一种调用方式
                increment(){
                    //提交mutation来改变vuex中的count的值, 2 + 4。
                    this.$store.commit('increment',{num:4});
                },
                incrementAsync(){
                    //提交actions提交mutation来改变vuex中的count的值, 2 + 6。
                    this.$store.dispatch('incrementAsync',{num:6})
                },
        
            //第二种调用方式
            //将 `this.increment()` 映射为this.$store.commit('increment');
                ...mapMutations(['increment']);
        
            //第三种调用方式
            //取别名 `this.incrementAlias()` 映射为this.$store.commit('increment');
                ...mapMutations({
                    incrementAlias:'increment'
                })
        
        //mapActions的使用方式
            //第一种调用方式
            increment(){
                //调用action异步提交mutation来改变vuex中的count的值, 2 + 4。
                this.$store.dispatch('incrementAsync',{num:4});
            },
        
            //第二种调用方式
            increment(){
                this.$store.dispatch({type: 'incrementAsync',{num:4}});
            }
            //第三种调用方式
            increment(){
                this.$store.diapatch('incrementAsync').then(()=>{
                    //do something
                })
            }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值