有没有办法迭代所有Vuex模块?我像这样注册了我的命名空间模块:
$store.registerModule('module-xyz', module);
现在有什么方法可以获取所有这些的列表吗?
它没有文档记录,但您可以通过
_modules
属性获取所有模块:
console.log(this.$store._modules.root._children);
hasModule
: 检查模块是否存在
console.log(this.$store.hasModule('module-xyz'));
如果您的商店模块是命名空间的,则模块名称将在您的商店状态中作为属性提供。因此,您可以对照
$store.hasModule()
检查这些属性以获取所有模块的列表。
示例:
Object.keys(this.$store.state).filter((stateKey) => this.$store.hasModule(stateKey))
// ['moduleA', 'moduleB']
如果您有嵌套模块并且需要表示嵌套的结构,则可以在检查模块时递归循环嵌套状态。
获取所有模块(包括嵌套)的示例:
function getStoreModules(store, state = store.state, parentModules = []) {
return Object.keys(state)
.filter((stateKey) => store.hasModule([...parentModules, stateKey]))
.flatMap((moduleName) => {
const modulePath = [...parentModules, moduleName];
return [modulePath.join('/'), ...getStoreModules(store, state[moduleName], modulePath)];
});
}
getStoreModules(this.$store);
// ['moduleA', 'moduleA/nestedModuleA', 'moduleB']