| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- <template>
- <teleport to="body">
- <transition name="slide-down" mode="out-in" appear>
- <div class="ui-toast" :style="{ zIndex: zIndex }" v-if="show">
- <div class="ui-toast__box" :class="[type]">
- <i v-if="type !== 'fixed' && type" class="icon"></i>
- <div class="ui-toast__msg" v-html="content"></div>
- <i class="iconfont icon-close close" @click="close" v-if="showClose"></i>
- </div>
- </div>
- </transition>
- </teleport>
- </template>
- <script lang="ts">
- import { defineComponent, nextTick, ref } from 'vue'
- import { useZIndex } from '@kankan/hooks'
- const { currentZIndex } = useZIndex()
- export default defineComponent({
- name: 'UIToast',
- props: {
- type: String,
- delay: Number,
- content: String,
- destroy: Function,
- close: Function,
- showClose: Boolean,
- },
- setup: function (props, _) {
- const show = ref(true)
- const close = () => {
- show.value = false
- nextTick(() => {
- if (typeof props.close == 'function') {
- props.close()
- }
- typeof props.destroy === 'function' && props.destroy()
- })
- }
- if (props.type !== 'fixed') {
- setTimeout(() => close(), props.delay || 3000)
- }
- return {
- show,
- // type: props.type,
- // close,
- // content: props.content,
- zIndex: currentZIndex,
- }
- },
- })
- </script>
- <style scoped>
- .slide-down-enter-active,
- .slide-down-leave-active {
- will-change: transform;
- transition: all 0.35s ease-in-out;
- }
- .slide-down-enter-from {
- opacity: 0;
- transform: translate3d(0, -100%, 0);
- }
- .slide-down-enter {
- opacity: 1;
- transform: translate3d(-50%, 100%, 0);
- }
- .slide-down-leave-active {
- opacity: 0;
- transform: translate3d(0, -100%, 0);
- }
- </style>
|