Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

vuex namespaced mapState with multiple modules

I must be missing something. How can I use vuex mapState with multiple modules?

As far as understand, besides passing an object as argument, namespaced mapState can take two arguments: namespace and an array of object names denoting the members of modules. Like this

// an imcomplete vue
export default {
   computed: mapState('user', ['addresses', 'creditCards']) 
};

But what if i'd like to add objects from a second namespace to computed? e.g. vendor like this:

mapState('vendor', ['products', 'ratings']) 

Currently I am merging both mapState like this:

let userMapState = mapState('user', ['addresses', 'creditCards']); 
let vendorMapState = mapState ('vendor', ['products', 'ratings']);
let mergedMapStates = Object.assign({}, userMapState, vendorMapState);

And then:

// an imcomplete vue
export default {
    computed: mergedMapStates
};

It works, but it's hardly the right way to do it. Or is it?

like image 305
LongHike Avatar asked Aug 09 '17 15:08

LongHike


2 Answers

Use the spread operator:

computed: {
  ...mapState('user', ['addresses', 'creditCards']),
  ...mapState('vendor', ['products', 'ratings']) 
}
like image 189
thanksd Avatar answered Oct 31 '22 12:10

thanksd


This is from the vuex docs, you can do it all within one ...mapState({}). Documentation

computed: {
  ...mapState({
    a: state => state.some.nested.module.a,
    b: state => state.some.nested.module.b
  })
},

Edit 2019

You can also pass a path to your nested module and make the module references cleaner (thanks @gijswijs)

computed: {
  ...mapState('some/nested/module', {
    a: state => state.a,
    b: state => state.b
  })
},
like image 41
thedanotto Avatar answered Oct 31 '22 12:10

thedanotto