l-transition.uvue 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <template>
  2. <view class="l-transition l-class"
  3. ref="rootRef"
  4. v-if="destoryOnClose ? display && inited : inited"
  5. :class="[lClass, classes]"
  6. :style="[styles, lStyle]"
  7. @transitionend="finished">
  8. <slot/>
  9. </view>
  10. </template>
  11. <script lang="uts" setup>
  12. /**
  13. * Transition 过渡动画组件
  14. * @description 用于实现元素显示/隐藏的过渡动画效果,支持自定义动画类名和参数
  15. * <br>插件类型:LTransitionComponentPublicInstance
  16. * @tutorial https://ext.dcloud.net.cn/plugin?name=lime-transition
  17. *
  18. * @property {boolean} appear 初始渲染是否应用动画(默认:false)
  19. * @property {string} lClass 自定义容器类名
  20. * @property {string} lStyle 自定义容器样式(CSS字符串)
  21. * @property {boolean} destoryOnClose 隐藏时销毁内容(默认:false)
  22. * @property {number} zIndex 层级(默认:100)
  23. * @property {number} duration 过渡持续时间(ms,默认:300)
  24. * @property {string} name 基础过渡类名前缀(默认:"fade")
  25. * @property {boolean} visible 是否显示(支持v-model)
  26. * @property {string} enterClass 进入动画初始状态类名
  27. * @property {string} enterActiveClass 进入动画激活状态类名
  28. * @property {string} enterToClass 进入动画结束状态类名
  29. * @property {string} leaveClass 离开动画初始状态类名
  30. * @property {string} leaveActiveClass 离开动画激活状态类名
  31. * @property {string} leaveToClass 离开动画结束状态类名
  32. * @event {Function} before-enter 进入动画开始前触发
  33. * @event {Function} enter 进入动画开始触发
  34. * @event {Function} after-enter 进入动画完成后触发
  35. * @event {Function} before-leave 离开动画开始前触发
  36. * @event {Function} leave 离开动画开始触发
  37. * @event {Function} after-leave 离开动画完成后触发
  38. */
  39. import { useTransition, type UseTransitionOptions, type TransitionEmitStatus } from '@/uni_modules/lime-transition';
  40. import { TransitionProps } from './type';
  41. const emit = defineEmits(['before-enter', 'enter', 'after-enter', 'before-leave', 'leave', 'after-leave'])
  42. const props = withDefaults(defineProps<TransitionProps>(), {
  43. appear: false,
  44. destoryOnClose: false,
  45. zIndex: 11000,
  46. duration: 300,
  47. name: 'fade', // transition
  48. visible: false,
  49. enterClass : '',
  50. enterActiveClass : '',
  51. enterToClass : '',
  52. leaveClass : '',
  53. leaveActiveClass : '',
  54. leaveToClass : ''
  55. })
  56. const rootRef = ref<UniElement|null>(null)
  57. const {inited, display, classes, finished} = useTransition({
  58. element: rootRef,
  59. defaultName: 'fade',
  60. name: (): string => props.name,
  61. emits: (name:TransitionEmitStatus) => { emit(name) },
  62. visible: (): boolean => props.visible,
  63. enterClass: props.enterClass,
  64. enterActiveClass: props.enterActiveClass,
  65. enterToClass: props.enterToClass,
  66. leaveClass: props.leaveClass,
  67. leaveActiveClass: props.leaveActiveClass,
  68. leaveToClass: props.leaveToClass,
  69. appear: props.appear,
  70. duration: props.duration,
  71. } as UseTransitionOptions)
  72. const styles = computed(():Map<string, any>=>{
  73. const style = new Map<string, any>()
  74. style.set('transition-duration', props.duration + 'ms')
  75. style.set('z-index', props.zIndex)
  76. // if (!display.value) {
  77. // style.set("display", "none")
  78. // }
  79. return style
  80. })
  81. // watchEffect(()=>{
  82. // console.log('inited', inited.value)
  83. // console.log('display', display.value)
  84. // console.log('classes', classes.value)
  85. // })
  86. </script>
  87. <style lang="scss">
  88. @import './index';
  89. </style>