| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- import { reactive, computed } from 'vue'
- import { fetchCurrentMenu } from '@/api/menu'
- const state = reactive({
- loaded: false,
- loading: false,
- error: null,
- topMenus: [],
- activeId: null,
- })
- function bySort(a, b) {
- return (a?.sort ?? 0) - (b?.sort ?? 0)
- }
- function sortTree(list) {
- if (!Array.isArray(list)) return []
- return list
- .slice()
- .sort(bySort)
- .map((m) => ({ ...m, children: Array.isArray(m.children) ? sortTree(m.children) : [] }))
- }
- export function useMenu() {
- async function load(force = false) {
- if (state.loading) return
- if (state.loaded && !force) return
- state.loading = true
- state.error = null
- try {
- const data = await fetchCurrentMenu()
- const list = Array.isArray(data) ? data : []
- state.topMenus = sortTree(list)
- state.loaded = true
- if (!state.topMenus.some((m) => m.id === state.activeId)) {
- state.activeId = state.topMenus[0]?.id ?? null
- }
- } catch (err) {
- state.error = err
- } finally {
- state.loading = false
- }
- }
- function setActive(id) {
- if (state.activeId === id) return
- state.activeId = id
- }
- const activeTopMenu = computed(
- () => state.topMenus.find((m) => m.id === state.activeId) ?? null,
- )
- const subMenus = computed(() => {
- const cur = activeTopMenu.value
- return cur && Array.isArray(cur.children) ? cur.children : []
- })
- return { state, load, setActive, activeTopMenu, subMenus }
- }
|