Vuex状态管理基础

state、mutations、actions、getters的使用

getters类似于组件中的computed

actions用在异步操作时 

// store.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    count: 100
  },
  mutations: {
    increase (state) {
      state.count++
    }
  },
  getters: {
    money: (state) => {
      return state.count + '元'
    }
  },
  actions: {
    // {state, commit}用到了赋值结构,其实原来是store
    asyncIncrease ({state, commit}) {
      setTimeout(() => {
        commit('increase')
      }, 1000)
    }
  }
})

使用actions需要用dispatch分发 

// Home.vue
<template>
  <div class="home">
    {{$store.state.count}}
    {{$store.getters.money}}
    <button @click="inc">加</button>
    <button @click="asyncInc">异步加</button>
  </div>
</template>

<script>
export default {
  name: 'home',
  methods: {
    inc () {
      this.$store.commit('increase')
    },
    asyncInc () {
      this.$store.dispatch('asyncIncrease')
    }
  }
}
</script>

一些帮助方法增加vuex使用体验

state、getters简写

import { mapState, mapGetters } from 'vuex' 后在计算属性中导入就可以直接使用count,就不需要this.$store.state.countle 

<template>
  <div class="home">
    {{count}}
    {{money}}
    <button @click="inc">加</button>
    <button @click="asyncInc">异步加</button>
  </div>
</template>

<script>
import { mapState, mapGetters } from 'vuex'
export default {
  name: 'home',
  methods: {
    inc () {
      this.$store.commit('increase')
    },
    asyncInc () {
      this.$store.dispatch('asyncIncrease')
    }
  },
  computed: {
    // mapState是一个对象,类似{'count': this.$store.state.count},使用...解构赋值
    ...mapState(['count']),
    ...mapGetters(['money'])
  }
}
</script>

 mutations、actions简写

mapMutations, mapActions必须写在方法中

方法中加入...mapMutations(['increase']),...mapActions(['asyncIncrease']),

后就可以直接使用 this.increase(),没必要使用this.$store.commit('increase')了

<template>
  <div class="home">
    {{count}}
    {{money}}
    <button @click="inc">加</button>
    <button @click="asyncInc">异步加</button>
  </div>
</template>

<script>
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'
export default {
  name: 'home',
  methods: {
    ...mapMutations(['increase']),
    ...mapActions(['asyncIncrease']),
    inc () {
      // this.$store.commit('increase')
      this.increase()
    },
    asyncInc () {
      // this.$store.dispatch('asyncIncrease')
      this.asyncIncrease()
    }
  },
  computed: {
    // mapState是一个对象,类似{'count': this.$store.count}
    ...mapState(['count']),
    ...mapGetters(['money'])
  }
}
</script>

在actions中使用异步登录方法

promise对象接收一个参数为函数,函数有2个参数,resolve和reject

actions: {
    submitLogin({commit}) {
      return new Promise(resolve => {
        setTimeout(() => {
          commit('login')
          resolve(true)
        }, 2000)
      })
    }
  }


// 在组件的methods方法中获取异步的ret
async login () {
      let ret = await this.$store.dispatch('submitLogin')
      if (ret) { // 登录成功做重定向等操作
        const redirect = this.$route.query
        if (redirect) {
          this.$router.push(redirect)
        }
      } else {
        alert('登录失败,请重试')
      }
    }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风里有诗句哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值