magiccube-vue3
Version:
vue3-js版组件库
60 lines (51 loc) • 1.55 kB
JavaScript
import { createVNode, render as $render } from 'vue'
import script from './Component'
import store from '../../../utils/store'
const toast = (opt) => {
return new Promise((resolve) => {
let props = {
duration: 1500,
content: '',
}
if (typeof opt === 'string') {
props.content = opt
} else {
props = { ...props, ...opt }
}
const container = document.createElement('div')
const vm = createVNode(script, props)
$render(vm, container)
const el = container.firstElementChild
const state = store.getState()
let target = document.body
if (state.teleportName) {
target = document.querySelector(`#${state.teleportName}`) || document.querySelector(`.${state.teleportName}`) || document.body
}
target.appendChild(el)
animateToVisible(el)
setTimeout(() => {
animateToHidden ? animateToHidden(el) : el.parentNode.removeChild(el)
resolve()
}, props.duration)
})
}
function animateToVisible(el) {
let op = 0
const ani = setInterval(() => {
if (op === 10) clearInterval(ani)
el.style.opacity = op / 10
op++
}, 20)
}
function animateToHidden(el, cb) {
let op = 10
const ani = setInterval(() => {
if (op === 0) {
clearInterval(ani)
el.parentNode.removeChild(el)
}
el.style.opacity = op / 10
op--
}, 20)
}
export default toast