likes
comments
collection
share

关于vuex的使用方法详解(全)

作者站长头像
站长
· 阅读数 38

一.什么是vuex?

官方解释:vuex是一个专门为vue.js应用程序开发的“状态管理模式”。

个人理解:vuex就是一个管理者,集中管理组件的所有状态,是一个全局存储器,管理对象为众多组件的共享部门。它可以解决任何组件之间自由传值。

例如:用于管理用户的登录信息,购物车信息等。

总结:用于储存项目中需要多次用到的变量,便于在项目中复用,减少代码的冗余。

二.需要用到的变量和函数

1.state:存放要设置的全局访问变量state对象初始值

state:{ count:0, changeShowCom:true },

2.getters:实时监听state的变化(最新状态)

getters:{ 
    getCount:state=>state.count, // 承载变化的count的值 
    isShow:state=>state.changeShowCom // 承载变化的changeShowCom的值
},

3.mutations:将参数传递给mutations中的函数进行计算

mutations:{     
    // 这里面的参数除了state之外还传了需要增加的值sum     
    // +1     
    addCount(state,num){       
        state.count=state.count+num     
    },     
    // -2     
    subCount(state,num){       
        if(state.count>0){         
            state.count=state.count-num       
        }else{         
            state.count=0       
        }     
    }   

4.actions:类似于mutation,提交mutation中的函数,而不是直接更改状态,可以包含任意异步操作。

actions:{     
    // num为要变化的形参     
    getAddCount(context,num){       
        context.commit('addCount',num)     
    },     
    getSubCount(context,num){       
        context.commit('subCount',num)    
    }   
}

> 二.使用方法

方法1:直接用store对象提交mutations里addCount()方法,简单易懂适合小白。

this.$store.commit('addCount',1) // 方法1-提交更新内容

方法2:通过actions分发getAddCount()任务去提交mutations里的addCount()方法,action类似于中间件,不直接更改状态。

this.$store.dispatch('getAddCount',1) // 方法2-分发更新内容

方法3:通过辅助函数去提交内容,原理同方法2。

// 在使用辅助函数之前,需要进行引入 
import {mapState,mapGetters,mapActions} from 'vuex' // 方法3
// 初始化actions中的方法,可自定义新函数名接收:
methods:{ 
    ...mapActions({   
        getAddCountNew:'getAddCount', 
        getSubCountNew:'getSubCount' 
    }) } 
    // 获取state对象中的变量,以下有两种方法:
    computed:{    
        ...mapState({       
        count1:state=>state.count     
    }),     
    ...mapGetters([       
        'getCount',       
        'isShow'     
       ])   
    }

页面调用

this.getAddCountNew(1) // 方法3-辅助函数更新内容

最终效果

关于vuex的使用方法详解(全)

四.完整代码

index.js

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex) 
export default new Vuex.Store({   
    // 要设置的全局访问变量state对象-初始值   
    state:{     
        count:0,     
        changeShowCom:true   
    },   
    // 实时监听state的变化(最新状态)   
    getters:{     
        getCount:state=>state.count, // 承载变化的count的值    
        isShow:state=>state.changeShowCom // 承载变化的changeShowCom的值   
    },   
    // 参数传递给mutations中的函数进行计算   
    mutations:{     
        // 这里面的参数除了state之外还传了需要增加的值sum     
        // +1     
        addCount(state,num){       
            state.count=state.count+num     
        },     
        // -2     
        subCount(state,num){       
            if(state.count>0){         
                state.count=state.count-num       
            }else{         
                state.count=0      
            }     
         }  
     },  
     // action 类似于mutation   
     // action 提交的是mutation,而不是直接更改状态   
     // action 可以包含任意异步操作   
     actions:{     
         // num为要变化的形参     
         getAddCount(context,num){       
             context.commit('addCount',num)     
         },     
         getSubCount(context,num){       
             context.commit('subCount',num)     
         }   
     } 
  })

vuexPage.vue

<template>   
    <div class="">     
        <span>vuex</span>     
        <p>this.$store.state.count={{this.$store.state.count}}</p
        <p>this.$store.getters.getCount={{this.$store.getters.getCount}}</p>     
        <el-button @click="add">(+)</el-button>     
        <el-button @click="sub">(-)</el-button>     
        <p>from mapState={{count1}}</p>     
        <p>from mapGetters={{getCount}}</p>   
     </div> 
</template> 
<script> 
    // 在使用辅助函数之前,需要进行引入 
    import {mapState,mapGetters,mapActions} from 'vuex' 
    // 方法3 
    export default {   
      name:'',   
      data(){     
        return{}   
      },   
      mounted(){},   
      methods:{     
          add(){       
              // this.$store.commit('addCount',1) 
              // 方法1-提交更新内容       
              // this.$store.dispatch('getAddCount',1) 
              // 方法2-分发更新内容       
              this.getAddCountNew(1) 
              // 方法3-辅助函数更新内容     
          },       
          sub(){      
              // this.$store.commit('subCount',2) 
              // 方法1-提交更新内容       
              // this.$store.dispatch('getSubCount',2) 
              // 方法2-分发更新内容       
              this.getSubCountNew(2) 
              // 方法3-辅助函数更新内容     
          },     
          ...mapActions({       
              getAddCountNew:'getAddCount',       
              getSubCountNew:'getSubCount'     
          })   
      },   
      computed:{     
          ...mapState({       
              count1:state=>state.count     
          }),     
          ...mapGetters([       
              'getCount',       
              'isShow'     
          ])   
       } 
     } 
 </script>

转载请注明原作者 不喜勿喷,欢迎补充~~

转载自:https://juejin.cn/post/7270536928760414264
评论
请登录