Search code examples
javascriptinheritancevue.jsextendsvuex

Way to make inheritance in Vuex modules


Im building my app with VueJS and Vuex and I'm facing the issue when I have Multiple modules using the same data fields. Its about API configuration like dat.

getUsers ({ state, commit }) {
    axios.get(urls.API_USER_URL).then( response => {
        let data = response.data;
        parseApi(state, data, 'user');

    }).catch( err => {
        console.log('getUser error: ', err);
    })
},

And another function in other Modules is like

getPosts ({ state, commit }) {
    axios.get(urls.API_POST_URL).then( response => {
        let data = response.data;
        parseApi(state, data, 'posts');

    }).catch( err => {
        console.log('getUser error: ', err);
    })
},

I would like to know if I can just inheritence my Module and add additional datafields / functions in there?

My every module would have message and status field which I getting in response of my API.

export default {
    state : {
        message : "",
        status : 0
    },
    parseApi: function(state, data, property) {
        if (data.hasOwnProperty('message')) {
            state.message = data.message;
        }
        if (data.hasOwnProperty('status')) {
            state.status = data.status;
        }
        if (data.hasOwnProperty(property)) {
            state[property] = data[property];
        }
    }
}

It would be something like that.

Is there a way to write this code once and have it in every module Im using?

EDITED:

I even cant get this apiParse function in there, I need to make muttation for those fields. But repeting it all time is pointless... Any advices?


Solution

  • I put my reusable vuex code in small classes. E.g.

    crud.js

    export default class {
        constructor ( endpoint ) {
           this.state = {
              endpoint: endpoint,
              meta:     {},
              status:   null,
              known:    [],
              currentId: null,
           };
           this.getters = {
              id: state => id => state.known.find( o => o.id === id )
           };
           this.actions = {
              async store( context, payload ) {
                   *(call to API)*
              },
              async update( context, payload ) {
                   *(call to API)*
              },
              *...etc*
          };
          this.mutations = {
             STORED(state, item) {
                state.known.push(item);
             },
             *...etc*
          };
       }
    }
    

    Then I can use it in all of my modules:

    user.module.js

    import Crud from '/crud';
    var crud = new Crud('/api/users');
    
    const state = {
       ...crud.state,
    };
    const getters = {
       ...crud.getters,
    };
    const actions = {
       ...crud.actions,
    };
    const mutations = {
       ...crud.mutations,
    };
    
    export default {
       namespaced: true,
       state,
       getters,
       actions,
       mutations
    };