34 lines
1.3 KiB
JavaScript
34 lines
1.3 KiB
JavaScript
/**
|
|
* Returns computed properties two way bound to vuex
|
|
*
|
|
* @param {(string[]|Object[])} list - list of string matching state keys or list objects
|
|
* @param {string} list[].key - the key matching the key present in the vuex state
|
|
* @param {string} list[].getter - the name of the getter, leave it empty to not use a getter
|
|
* @param {string} list[].updateFn - the name of the action, leave it empty to use the default action
|
|
* @param {string} defaultUpdateFn - the default function to dispatch
|
|
* @param {string} root - the key of the state where to search fo they keys described in list
|
|
* @returns {Object} a dictionary with all the computed properties generated
|
|
*/
|
|
export const mapComputed = (list, defaultUpdateFn, root) => {
|
|
const result = {};
|
|
list.forEach((item) => {
|
|
const [getter, key, updateFn] =
|
|
typeof item === 'string'
|
|
? [false, item, defaultUpdateFn]
|
|
: [item.getter, item.key, item.updateFn || defaultUpdateFn];
|
|
result[key] = {
|
|
get() {
|
|
if (getter) {
|
|
return this.$store.getters[getter];
|
|
} else if (root) {
|
|
return this.$store.state[root][key];
|
|
}
|
|
return this.$store.state[key];
|
|
},
|
|
set(value) {
|
|
this.$store.dispatch(updateFn, { [key]: value });
|
|
},
|
|
};
|
|
});
|
|
return result;
|
|
};
|