是否需使用Vuex Getters?仅返回状态成员时用mapState可行吗?
这问题我太懂了!很多刚上手Vuex的同学都会纠结这个点,我来给你捋得明明白白~
核心结论:分场景选择,不用硬套“必须写getter”的规则
1. 当下仅需纯取state值:直接用mapState完全可行
你说得没错,写getters: { user (state) { return state.user } }这种纯转发的getter确实有点冗余。Vuex提供mapState就是为了简化这种直接读取state成员的场景,直接在组件里这么写:
computed: { ...mapState('auth', ['user']) }
代码清爽又省事儿,完全符合Vuex的设计初衷,没必要为了“看起来规范”硬加一层无意义的getter。
2. 考虑未来可扩展性:提前写getter更划算
如果这个state成员会被多个组件使用,或者你能预想到未来可能需要对它做加工(比如拼接用户全名、过滤敏感字段、结合其他state做动态计算),那getter的价值就体现出来了:
- 它是全局统一的逻辑入口:未来需求变化时,你只需要修改getter里的代码,所有用到这个值的组件都会自动更新,不用一个个去改组件里的computed。
- 自带缓存优化:Vuex的getter会基于依赖缓存结果,只有依赖的state变化时才会重新计算,比组件里自己写computed的缓存范围更可控(尤其是多组件共用时)。
举个对比例子:
- 现在用mapState,未来要加工user:
你得去每个用到user的组件里修改computed:computed: { user() { return `${this.$store.state.auth.user.firstName} ${this.$store.state.auth.user.lastName}` } } - 提前写了getter,未来要加工user:
只需要改store里的getter:
所有用// store/auth.js getters: { user: (state) => `${state.user.firstName} ${state.user.lastName}` }mapGetters('auth', ['user'])的组件都自动生效,零组件改动成本。
3. 折中方案:先mapState,需要时再重构到getter
如果你拿不准未来会不会改,完全可以先直接用mapState。等哪天需要加工这个值了,再把逻辑移到getter里,然后把组件里的mapState换成mapGetters就行——这个重构成本极低,只需要替换几行代码。
最后总结一下
- 单组件用、纯取state值:直接
mapState,拒绝冗余。 - 多组件共用、或预见未来有加工需求:提前写getter,为未来铺路。
- 拿不准就先
mapState,后续重构成本几乎可以忽略。
内容的提问来源于stack exchange,提问作者epeleg
相关产品推荐
相关产品推荐

