diff --git a/src/components/app-vuero/VCodeSelect.vue b/src/components/app-vuero/VCodeSelect.vue index 233d023..b3e97ba 100644 --- a/src/components/app-vuero/VCodeSelect.vue +++ b/src/components/app-vuero/VCodeSelect.vue @@ -47,12 +47,13 @@ const classes = computed(() => { return ['select', props.multiple && 'is-multiple'] }) -const cdItems = ref>([]) +const cdItems = computed(() => { + return detailCode.getCodeList(props.cd_grp) +}) watch(() => props.cd_grp, async (newVal) => { if (newVal) { await detailCode.setDetailCode(newVal) - cdItems.value = detailCode.getCodeList(newVal) } }, { immediate: true }) diff --git a/src/stores/codeStore.ts b/src/stores/codeStore.ts index c26d058..2af784f 100644 --- a/src/stores/codeStore.ts +++ b/src/stores/codeStore.ts @@ -1,17 +1,27 @@ import { acceptHMRUpdate, defineStore } from 'pinia' -import { useStorage } from '@vueuse/core' import { getDetailCode } from '/@src/service/code' export const useCodes = defineStore('codeStore', () => { // 🟡 상태 const codes = ref>>({}) - // 🔵 액션: 코드 불러오기 + const loadingPromises = new Map>() + const setDetailCode = async (cd_grp: number) => { - if (!codes.value[cd_grp]) { - const res = await getDetailCode(cd_grp) - codes.value[cd_grp] = res + if (codes.value[cd_grp] && codes.value[cd_grp].length > 0) return + + if (loadingPromises.has(cd_grp)) { + return loadingPromises.get(cd_grp) } + + const p = getDetailCode(cd_grp).then((res) => { + codes.value[cd_grp] = res + }).finally(() => { + loadingPromises.delete(cd_grp) + }) + + loadingPromises.set(cd_grp, p) + return p } // 🟢 코드 목록 가져오기