38 lines
770 B
Vue
38 lines
770 B
Vue
![]() |
<template>
|
||
|
<component v-for="item in list" :key="item.name" :is="item.component" />
|
||
|
</template>
|
||
|
|
||
|
<script setup lang="ts">
|
||
|
import { isFunction, orderBy } from "lodash-es";
|
||
|
import { markRaw, onMounted, shallowRef } from "vue";
|
||
|
import { module } from "/@/cool";
|
||
|
|
||
|
const list = shallowRef<any[]>([]);
|
||
|
|
||
|
async function refresh() {
|
||
|
const arr = orderBy(
|
||
|
module.list.filter((e) => e.enable !== false && !!e.global).map((e) => e.global),
|
||
|
"order"
|
||
|
);
|
||
|
|
||
|
list.value = await Promise.all(
|
||
|
arr
|
||
|
.filter((e) => e?.component)
|
||
|
.map(async (e) => {
|
||
|
if (e) {
|
||
|
const c = await (isFunction(e.component) ? e.component() : e.component);
|
||
|
|
||
|
return {
|
||
|
...e,
|
||
|
component: markRaw(c.default || c)
|
||
|
};
|
||
|
}
|
||
|
})
|
||
|
);
|
||
|
}
|
||
|
|
||
|
onMounted(() => {
|
||
|
refresh();
|
||
|
});
|
||
|
</script>
|