Vuex内容用法详解--不拖泥带水

224 阅读2分钟

这是我参与11月更文挑战的第30天,活动详情查看:2021最后一次更文挑战 

state

如果想要使用state,基础用法是在组件的computed中通过方法 return this.$store.state.XXX

computed:{
    msg(){
        return this.$store.state.msg
    }
}
  • 这样的使用可能会比较麻烦,因此可以使用辅助函数mapState,使用方式如下
//首先是引入mapState
import {mapState} from 'vuex'
//mapState的使用方法有多种
computed:mapState({
    msg(state){ //这里的state相当于mutation中的state
        return state.msg
    },
    //也可以箭头函数的写法
    msg: state => state.msg,
    //也可以直接如下写法
    msg:'msg'
})
//或者直接这样使用
computed:mapState(['msg'])
//上面这种写法很好用,但有一定的问题,这样就没办法写正常的computed中的处理函数了,又因为mapState(['msg'])是一个对象,因此可以按下面这种写法来使用
computed:{
    ...mapState(['msg'])
}

mutation

mutation是修改state的唯一入口,如果想要修改state就必须使用mutation,mutation在写法上是一个函数,调用时需要使用commit,写法如下

const store = new Vuex.Store({
    mutation:{
        setCount(state,payload){ //payload是触发commit时候传递过来的数据
            //通过state.XXX来改变state中的值
            state.count++
        }
    }
})
//触发mutation的基础用法是常用在在组件的methods中,通过this.$store.commit('setCount','数据')
- 除了上述的方法还有简便的方法,如下
methoods:{
    setMsg(){
        this.$store.commit('setMsg','新的内容')
    },
    //<butto @click="setMsg('新值')"></button>
    ...mapMutations(['setMsg'])//这种写法如果在调用它的地方写上参数,也就是payload
    //上面这种写法我们就省了一个写函数的过程
    
    //<butto @click="clickHandleer('新值就是payload')"></button>
    ...mapMutations({
        clickHandleer:'setMsg'
    })
    //这种写法也是可以的
    
    注意:在使用mapMutations之前也是要引入的
    import {mapMutations} from 'vuex'
    
}

action

action类似于mutation,action需要通过this.$store.dispatch('action名字')对action进行分发

const store = new Vuex.Store({
       state:{
           list:[]
       },
       mutation:{
           setList(state,data){
               state.list = data
           }
       },
       action:{
           //在action中不能修改state,action中可以commit mutation
           //context就是store,我们用的其实就是store.commit来通过mutation来改变state中的值,这里可以用结构赋值的方法来写getList({commit}){}
           getList(context){
               axios.get().then(res =>{
                   context.commit('setList',res.data)
               })
           }
       }
])
//触发action的基础用法是this.$store.dispatch('getList')
- action也有简便写法,和mutations类似
 ...mapActions(['setMsg'])//两个名字(事件名字和action中的名字)一样时就用数组的形式,要不就用对象的形式
 ...mapActions({
     事件名字:'setMsg'
 })

getter

  • getter可以从state中获取到新的格式的数据(这里可以理解为组件中的computed的用法)
  • 我们在组件中可以把getter当做state来使用
  • getter的两个参数分别是state和getters,因此我们可以根据state或者getter来获取到我们想要的数据
   const store = new Vuex.Store({
       getters:{
           getter名字(state,getters){
               return 
           }
       }
   })
   //getter的基础用法this.$store.getters.XXX
   - getters也有简便用法,和state的简便用法类似

总结

上述所说的简便方法只是一种解耦,代码中看不到了$store而已,如果记不住只要会用基础用法也是可以的,vuex中的重要内容就是,state是状态管理,mutation是修改state的唯一方法(需要用commit)mutation中只能是同步操作,action中是异步操作,但不能更改state,所以要通过dispatch来分发,再通过mutation中的commit来修改state,getters就相当于我们组件中的computed,是让我们可以获取到新的格式的数据(比如说state中符合某个规则的数据)