Files
2026-01-20 08:04:15 +08:00

93 lines
3.2 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view class="l-transition l-class"
v-if="destoryOnClose ? display && inited : inited"
:class="[lClass, classes]"
:style="styles + lStyle"
@transitionend="finished">
<slot/>
</view>
</template>
<script lang="ts">
// @ts-nocheck
/**
* Transition 过渡动画组件
* @description 用于实现元素显示/隐藏的过渡动画效果,支持自定义动画类名和参数
* <br>插件类型LTransitionComponentPublicInstance
* @tutorial https://ext.dcloud.net.cn/plugin?name=lime-transition
*
* @property {boolean} appear 初始渲染是否应用动画默认false
* @property {string} lClass 自定义容器类名
* @property {string} lStyle 自定义容器样式CSS字符串
* @property {boolean} destoryOnClose 隐藏时销毁内容默认false
* @property {number} zIndex 层级默认100
* @property {number} duration 过渡持续时间ms默认300
* @property {string} name 基础过渡类名前缀(默认:"fade"
* @property {boolean} visible 是否显示支持v-model
* @property {string} enterClass 进入动画初始状态类名
* @property {string} enterActiveClass 进入动画激活状态类名
* @property {string} enterToClass 进入动画结束状态类名
* @property {string} leaveClass 离开动画初始状态类名
* @property {string} leaveActiveClass 离开动画激活状态类名
* @property {string} leaveToClass 离开动画结束状态类名
* @event {Function} before-enter 进入动画开始前触发
* @event {Function} enter 进入动画开始触发
* @event {Function} after-enter 进入动画完成后触发
* @event {Function} before-leave 离开动画开始前触发
* @event {Function} leave 离开动画开始触发
* @event {Function} after-leave 离开动画完成后触发
*/
import { computed, defineComponent} from '@/uni_modules/lime-shared/vue';
import { useTransition, UseTransitionOptions } from '@/uni_modules/lime-transition';
import transitionsProps from './props';
export default defineComponent({
props: transitionsProps,
options: {
styleIsolation: "apply-shared",
addGlobalClass: true,
externalClasses: true,
virtualHost: true,
},
externalClasses: ['l-class'],
emits: ['before-enter', 'enter', 'after-enter', 'before-leave', 'leave', 'after-leave'],
setup(props, {emit}) {
const {inited, display, classes, finished, toggle} = useTransition({
name: (): string => props.name,
emits: (name:string) => {
emit(name)
},
visible: (): boolean => props.visible,
enterClass: props.enterClass,
enterActiveClass: props.enterActiveClass,
enterToClass: props.enterToClass,
leaveClass: props.leaveClass,
leaveActiveClass: props.leaveActiveClass,
leaveToClass: props.leaveToClass,
appear: props.appear,
duration: props.duration,
} as UseTransitionOptions)
const styles = computed(()=>{
let style = `transition-duration:${props.duration}ms; z-index:${props.zIndex};`
if (!display.value) {
style+=`display:none;`
}
return style
})
return {
inited,
styles,
display,
classes,
finished
}
}
})
</script>
<style lang="scss">
@import './index';
</style>