l-transition.vue 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <template>
  2. <view class="l-transition l-class"
  3. v-if="destoryOnClose ? display && inited : inited"
  4. :class="[lClass, classes]"
  5. :style="styles + lStyle"
  6. @transitionend="finished">
  7. <slot/>
  8. </view>
  9. </template>
  10. <script lang="ts">
  11. // @ts-nocheck
  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 { computed, defineComponent} from '@/uni_modules/lime-shared/vue';
  40. import { useTransition, type UseTransitionOptions } from '@/uni_modules/lime-transition';
  41. import transitionsProps from './props';
  42. export default defineComponent({
  43. props: transitionsProps,
  44. options: {
  45. styleIsolation: "apply-shared",
  46. addGlobalClass: true,
  47. externalClasses: true,
  48. virtualHost: true,
  49. },
  50. externalClasses: ['l-class'],
  51. emits: ['before-enter', 'enter', 'after-enter', 'before-leave', 'leave', 'after-leave'],
  52. setup(props, {emit}) {
  53. const {inited, display, classes, finished, toggle} = useTransition({
  54. name: (): string => props.name,
  55. emits: (name:string) => {
  56. emit(name)
  57. },
  58. visible: (): boolean => props.visible,
  59. enterClass: props.enterClass,
  60. enterActiveClass: props.enterActiveClass,
  61. enterToClass: props.enterToClass,
  62. leaveClass: props.leaveClass,
  63. leaveActiveClass: props.leaveActiveClass,
  64. leaveToClass: props.leaveToClass,
  65. appear: props.appear,
  66. duration: props.duration,
  67. } as UseTransitionOptions)
  68. const styles = computed(()=>{
  69. let style = `transition-duration:${props.duration}ms; z-index:${props.zIndex};`
  70. if (!display.value) {
  71. style+=`display:none;`
  72. }
  73. return style
  74. })
  75. return {
  76. inited,
  77. styles,
  78. display,
  79. classes,
  80. finished
  81. }
  82. }
  83. })
  84. </script>
  85. <style lang="scss">
  86. @import './index';
  87. </style>