How to access Vuex module getters and mutations?

后端 未结 6 1237
长发绾君心
长发绾君心 2021-01-30 13:04

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

相关标签:
6条回答
  • 2021-01-30 13:08

    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.

    0 讨论(0)
  • 2021-01-30 13:08

    Try this approach!

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

    auth is my module name and getToken is my getter.

    0 讨论(0)
  • 2021-01-30 13:21

    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.

    0 讨论(0)
  • 2021-01-30 13:21

    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>
    
    0 讨论(0)
  • 2021-01-30 13:30

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

    Debug the Store
    In any case you can call console.log(this.$store) to debug the Store.
    If you do so you will see the getters are prefixed with the namespace in their name.

    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.

    0 讨论(0)
  • 2021-01-30 13:30

    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'
    })
    
    0 讨论(0)
提交回复
热议问题