feat: toast내부 div 객체가 무한히 쌓이지 않도록

This commit is contained in:
2021-12-31 02:22:42 +09:00
parent 7310aa6971
commit 02e86fd2e9
+88 -23
View File
@@ -1,34 +1,40 @@
<template> <template>
<CToaster class="z99" placement="top-end"> <CToaster
<CToast class="z99 my-toaster"
v-for="(toast, index) in modelValue" placement="top-end"
:key="index" v-if="toasts.length > 0"
:delay="toast.delay??delay"
> >
<CToastHeader <template v-for="(toast, index) in toasts" :key="index">
:class="['text-white', `bg-${toast.type ?? 'primary'}`]" <CToast :delay="toast.delay ?? delay">
close <CToastHeader
> :class="['text-white', `bg-${toast.type ?? 'primary'}`]"
<span class="me-auto fw-bold">{{ toast.title }}</span> >
</CToastHeader> <span class="me-auto fw-bold">{{ toast.title }}</span>
<CToastBody> <CToastClose class="my-close" color="secondary" size="sm" />
{{ toast.content }} </CToastHeader>
</CToastBody> <CToastBody> {{ toast.content }} {{ toast.visible }} </CToastBody>
</CToast> </CToast>
</CToaster> </template>
</template> </CToaster>
</template>
<script lang="ts"> <script lang="ts">
import { defineComponent, PropType } from "vue"; import { defineComponent, PropType, ref, watch } from "vue";
import { ToastType } from "@/defs"; import { ToastType } from "@/defs";
import { CToaster, CToast, CToastHeader, CToastBody } from "@coreui/vue/src/components/toast"; import {
CToaster,
CToast,
CToastHeader,
CToastBody,
CToastClose,
} from "@coreui/vue/src/components/toast";
export default defineComponent({ export default defineComponent({
name: "MyToast",
components: { components: {
CToaster, CToaster,
CToast, CToast,
CToastHeader, CToastHeader,
CToastBody, CToastBody,
CToastClose,
}, },
emits: ["update:modelValue"], emits: ["update:modelValue"],
props: { props: {
@@ -37,10 +43,61 @@ export default defineComponent({
required: true, required: true,
}, },
delay: { delay: {
type: Number, type: Number,
required:false, required: false,
default:5000, default: 5000,
},
},
setup(props, { emit }) {
let doneCnt = 0;
const doneMap = new Map<ToastType, boolean>();
let toasts = ref(props.modelValue);
function onClose(toast: ToastType) {
const status = doneMap.get(toast);
if (status === undefined) {
return;
}
if (status) {
return;
}
doneCnt -= 1;
if (doneCnt != 0) {
doneMap.set(toast, true);
return;
}
console.log("clear!");
doneMap.clear();
toasts.value.length = 0;
emit("update:modelValue", toasts);
console.log(toasts.value);
} }
watch(props.modelValue, (values) => {
for (const item of values) {
if (!doneMap.has(item)) {
doneMap.set(item, false);
doneCnt += 1;
setTimeout(() => {
onClose(item);
}, (item.delay ?? props.delay) + 1000);
}
}
if(toasts.value !== values){
toasts.value = values;
}
toasts.value = values;
console.log(values, toasts.value);
});
return {
onClose,
toasts,
};
}, },
}); });
</script> </script>
@@ -49,3 +106,11 @@ export default defineComponent({
z-index: 199; z-index: 199;
} }
</style> </style>
<style>
.my-toaster .btn.btn-close.my-close,
.my-toaster .btn.btn-close.my-close:hover,
.my-toaster .btn.btn-close.my-close:active {
border: 0;
padding: 0;
}
</style>