ChatGPT解决这个技术问题 Extra ChatGPT

How to access Vuex module getters and mutations?

I'm trying to switch to using Vuex instead of my homegrown store object, and I must say I'm not finding the docs as clear as elsewhere in the Vue.js world. Let's say I have a Vuex module called 'products', with its own state, mutations, getters, etc. How do I reference an action in that module called, say, 'clearWorking Data'? The docs give this example of accessing a module's state:

store.state.a // -> moduleA's state

But nothing I can see about getters, mutations, actions, etc.

Agree: the docs for vuex are abysmal. Really not helpful.
@geoidesic i've definitely noticed areas that could be better. Have you considered raising an issue on GitHub with suggested improvements?

P
Penny Liu

In Addition to the accepted answer I wanna provide you with a workarround for the getter which is missing in the answer.

https://i.stack.imgur.com/Kkq5f.png

Access namespaced getter

this.$store.getters['yourModuleName/someGetterMethod']

Dispatch namespaced

this.$store.dispatch('yourModuleName/doSomething')

Dispatch namespaced with params

this.$store.getters['yourModuleName/someGetterMethod'](myParam)

Conclusion The key is to handle the namespace like a file System like Justin explained.

Edit: found a nice library for handling vuex Store
In addition to the basic knowledge I'd like to add this vuex library as a nice addition for working effectivly and fast with the vuex store. https://github.com/davestewart/vuex-pathify .
It looks pretty interesting and cares much of the configuration for you and also allows you to handle 2waybinding directly with vuex.

** Edit: Thanks to the other Answers. Added Dispatching method with params for wholeness.


So where I was using return store.getters.individuals before adding namespaced=true, I now have to use return store.getters['individual/individuals'] Thank you for this additional answer. Spent half an hour on this and found zero examples of accessing the namespaced getter until your answer here.
The reason for the change should have been obvious to me. You can't use dot notation for a property with a name that includes special characters like '/', so you have to use bracket notation. could use bracket notation in all cases, it's just not as elegant. So dot notation is often used unless it can't be like in this example.
Don't forget to set namespaced: true in each of your module, to be able to use getters like that.
Thank you for complementing the getters part that was not exposed in the accepted answer...you made my day
Access namespaced getter! YES! Thank you! Why?.. Why they didn't include this in documentation? 🤦🏻‍♂️
J
Justin MacArthur

In your example it would be store.dispatch('products/clearWorkingData') you can think of actions/mutations as a file system in a way. The deeper the modules are nested the deeper in the tree they are.

so you could go store.commit('first/second/third/method') if you had a tree that was three levels deep.


Ah, OK! Is this dependent on setting namespaced: true?
@JohnMoore Yes sorry for not mentioning it, any module you want to have separated needs to have namespaced: true, set. if not then it'll inherit the namespace of the parent module.
@JustinMacArthur does this method of accessing data from a module within a vuex store also work if you are trying to access it from within the composition api setup() method?
@PA-GW This was written for V2.x and the appropriate Vuex. I'm not sure if it would work with the composition api. I don't see why not depending on execution time.
P
Peter Kassenaar

As another addition to the accepted answer, if you need to pass parameter(s) to the getter (for instance to fetch a specific item from the store collection), you need to pass it as follows:

this.$store.getters['yourModuleName/someGetterMethod'](myParam)

I don't think I like this notation very much, but it is what it is - at least for the moment.


Using Vuex4, in setup of composition api, I added the following. setup(props) { const store = useStore() const randomNumber = computed(() => store.getters['item/getRandomNumber']) return { randomNumber }; }, But getting lint error: @typescript-eslint/no-unsafe-member-access: Unsafe member access ['item/getRandomNumber'] on an any value.
k
kissu

Try this approach!

getCounter(){
  return this.$store.getters['auth/getToken'];     
}

auth is my module name and getToken is my getter.


B
Ben Hoffmann

Using Vuex mapGetters and mapActions you can now do this pretty easily. But I agree, it still isn't very obvious in the documentation.

Assuming your store module 'products' has a getter called 'mostPopular' and an action called 'clearWorkingData':

<template>
 <div>
  <p>{{mostPopularProduct}}<p>
  <p><button @click="clearProductData">Clear data</button></p>
 </div>
</template>
<script>
import { mapGetters, mapActions } from "vuex";

export default {
 computed: mapGetters({
  mostPopularProduct: "products/mostPopular"
 }),
 methods: mapActions({
  clearProductData: "products/clearWorkingData"
 })
}
</script>

B
Bhushan Patil

The mapGetters helper simply maps store getters to local computed properties:

    import { mapGetters } from 'vuex'

    export default {
  // ...
  computed: {
    // mix the getters into computed with object spread operator
    ...mapGetters([
      'doneTodosCount',
      'anotherGetter',
      // ...
    ])
  }
}
If you want to map a getter to a different name, use an object:

    ...mapGetters({
  // map `this.doneCount` to `this.$store.getters.doneTodosCount`
  doneCount: 'doneTodosCount'
})

This doesn't account for the core of the question: how to access a specific vuex module's getter
C
Can PERK

You have to be aware of using namespaced: true when configuring particular store object


关注公众号,不定期副业成功案例分享
Follow WeChat

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now