You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Vuex中mapState、mapGetters等四个辅助函数的区别与用法咨询

嘿,很高兴你已经熟练使用mapState了!这几个Vuex辅助函数本质上都是语法糖——帮你减少重复的this.$store.xxx代码,让组件和Vuex的交互更简洁。我一个个给你讲清楚剩下三个的用途和用法:

1. mapGetters:映射派生状态到组件计算属性

Vuex的getters是用来处理派生状态的——比如对state里的数据做过滤、拼接、计算后再使用(类似组件里的computed,但作用于全局状态)。mapGetters就是把这些全局的getters映射到组件的computed中,不用每次都写this.$store.getters.xxx

举个例子:
假设你的store里有用户的 firstName 和 lastName,想要得到全名,或者判断用户是否成年:

// store/getters.js
export default {
  fullName: state => `${state.user.firstName} ${state.user.lastName}`,
  isAdult: state => state.user.age >= 18
}

在组件里使用mapGetters

import { mapGetters } from 'vuex'

export default {
  computed: {
    // 直接映射同名的getters
    ...mapGetters(['fullName', 'isAdult']),
    // 如果想重命名,用对象形式
    ...mapGetters({
      userFullName: 'fullName' // 组件里用this.userFullName对应store的fullName
    })
  }
}

之后你就能在模板或组件逻辑里直接用{{ fullName }}或者this.isAdult啦。

2. mapMutations:映射修改状态的方法到组件

Vuex规定只能通过mutations修改state(而且mutations必须是同步操作)。mapMutations可以把组件的methods映射为store.commit调用,省去每次手动写this.$store.commit('mutationName')的麻烦。

举个例子:
先在store里定义修改用户信息的mutations:

// store/mutations.js
export default {
  UPDATE_USER_NAME(state, newName) {
    state.user.name = newName
  },
  UPDATE_USER_AGE(state, newAge) {
    state.user.age = newAge
  }
}

组件里使用mapMutations

import { mapMutations } from 'vuex'

export default {
  methods: {
    // 直接映射同名的mutations
    ...mapMutations(['UPDATE_USER_NAME', 'UPDATE_USER_AGE']),
    // 重命名写法
    ...mapMutations({
      setUserName: 'UPDATE_USER_NAME' // 组件里用this.setUserName对应store的UPDATE_USER_NAME
    })
  },
  // 调用示例
  mounted() {
    this.UPDATE_USER_NAME('张三') // 等价于 this.$store.commit('UPDATE_USER_NAME', '张三')
    this.setUserName('李四') // 等价于 this.$store.commit('UPDATE_USER_NAME', '李四')
  }
}

3. mapActions:映射异步操作方法到组件

actions是用来处理异步逻辑的(比如请求后端数据、定时器等),它不会直接修改state,而是通过提交mutation来完成状态更新。mapActions就是把组件的methods映射为store.dispatch调用,简化异步操作的触发。

举个例子:
先在store里定义处理异步的actions:

// store/actions.js
export default {
  // 异步获取用户信息
  async fetchUserInfo({ commit }) {
    const res = await fetch('/api/user')
    const userData = await res.json()
    // 提交mutation修改状态
    commit('UPDATE_USER_NAME', userData.name)
    commit('UPDATE_USER_AGE', userData.age)
  },
  // 异步更新地址
  updateUserAddress({ commit }, newAddress) {
    setTimeout(() => {
      commit('UPDATE_USER_ADDRESS', newAddress)
    }, 1000)
  }
}

组件里使用mapActions

import { mapActions } from 'vuex'

export default {
  methods: {
    // 直接映射同名的actions
    ...mapActions(['fetchUserInfo', 'updateUserAddress']),
    // 重命名写法
    ...mapActions({
      getUserInfo: 'fetchUserInfo' // 组件里用this.getUserInfo对应store的fetchUserInfo
    })
  },
  mounted() {
    this.fetchUserInfo() // 等价于 this.$store.dispatch('fetchUserInfo')
    this.updateUserAddress({ province: '北京', city: '朝阳区' }) // 带参数调用
  }
}

最后再总结下

  • mapState/mapGetters:放在组件的computed里,因为它们关联的是响应式状态,需要随state变化自动更新。
  • mapMutations/mapActions:放在组件的methods里,因为它们是操作方法,需要主动触发。

这些辅助函数都只是简化代码,本质和直接调用this.$store的API是一样的,根据场景选择使用就好~

内容的提问来源于stack exchange,提问作者hidar

火山引擎 最新活动