Search code examples
vue.jsnuxt.jsvuexgetter-setter

How to use a Nuxt component to pass a parameter to a vuex getter method? (while maintaining three dot notation)


GOAL: I would like to watch a vuex state object (MATCH_DATA) for changes, specific to the value of a prop (topicId). So, I would like to set the watcher to watch MATCH_DATA[topicId]. And whenever MATCH_DATA[topicId] updates, I'd like to call a function (in this early case just logging it).

However, since MATCH_DATA is a getter how would I pass a parameter to it? The vuex getter does not seem to be designed to take in parameters. I have seen some examples by explicitly calling this.$store.state.etc.etc. but is there a way to do this while retaining the three dot notation I currently have?

Or, is there some better way of achieving this goal that does not involve a vuex getter?

Current Code:

Nuxt component:

<script>
import { mapGetters, mapActions } from 'vuex';

export default {
    props: ['topicId'],

    computed: {
        ...mapGetters('sessionStorage', ['MATCH_DATA']),
    },

    watch: {
        MATCH_DATA (newMatchData, oldMatchData) {
            console.log(newMatchData);
        }
    },
    
    mounted() {
        this.SUBSCRIBE_TO_TOPIC(this.topicId);
    },
    
    methods: {
        ...mapActions('sessionStorage', ['SUBSCRIBE_TO_TOPIC'])
    }
}

vuex store:

/* State */
export const state = () => ({
    MATCHES: {},
});

/* GETTERS */
export const getters = {
    MATCH_DATA: (state) => {
        return state.MATCHES;
    },
};

Solution

  • Your getter can simply return a function like this:

    export const getters = {
        MATCH_DATA: (state) => {
            return topicId => {
              // return something
            }}
        },
    };
    

    Then you can create a computed property to access those getter:

    export default {
      computed: {
        ...mapGetters('sessionStorage', ['MATCH_DATA']),
    
        yourComputedProperty () {
          return this.MATCH_DATA(this.topicId)
        }
      }
    }
    

    Then you can watch the computed property to react on changes.

    watch: {
      yourComputedProperty (newData, oldData) {
        console.log(newData);
      }
    }