l-overlay.vue 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <template>
  2. <view
  3. v-if="inited"
  4. class="l-overlay"
  5. :class="[lClass, classes]"
  6. :style="[styles, lStyle]"
  7. @click.stop="onClick"
  8. @touchmove.stop="noop"
  9. @transitionend="finished"
  10. :aria-role="ariaRole || 'button'"
  11. :aria-label="ariaLabel || '关闭'">
  12. <slot></slot>
  13. </view>
  14. </template>
  15. <script lang="ts">
  16. // @ts-nocheck
  17. /**
  18. * Overlay 遮罩层组件
  19. * @description 用于创建模态遮罩层,通常配合弹窗、对话框等组件使用
  20. * <br>插件类型:LOverlayComponentPublicInstance
  21. * @tutorial https://ext.dcloud.net.cn/plugin?name=lime-overlay
  22. *
  23. * @property {string} ariaLabel 无障碍访问标签(需语义化描述作用)
  24. * @property {string} ariaRole ARIA角色属性(默认:'presentation')
  25. * @property {string} lClass 自定义类名(会覆盖默认样式)
  26. * @property {string} bgColor 背景颜色(默认:'rgba(0, 0, 0, 0.7)')
  27. * @property {string} lStyle 自定义样式(最高优先级,支持CSS字符串)
  28. * @property {number} duration 背景过渡动画时长(单位:ms,默认:300)
  29. * @property {boolean} preventScrollThrough 阻止滚动穿透(默认:true)
  30. * @property {boolean} visible 是否显示遮罩层(支持v-model)
  31. * @property {number} zIndex 层级(默认:1000)
  32. * @event {Function} click 点击遮罩层时触发(常用于关闭操作)
  33. * @event {Function} before-enter
  34. * @event {Function} enter
  35. * @event {Function} after-enter
  36. * @event {Function} before-leave
  37. * @event {Function} leave
  38. * @event {Function} after-leave
  39. */
  40. import { computed, defineComponent } from '@/uni_modules/lime-shared/vue';
  41. import { useTransition, type UseTransitionOptions, type TransitionEmitStatus } from '@/uni_modules/lime-transition';
  42. import overlayProps from './props';
  43. export default defineComponent({
  44. props: overlayProps,
  45. emits: ['click', 'before-enter', 'enter', 'after-enter', 'before-leave', 'leave', 'after-leave'],
  46. options: {
  47. addGlobalClass: true,
  48. virtualHost: true,
  49. externalClasses: true,
  50. },
  51. externalClasses: ['l-class'],
  52. setup(props, { emit }) {
  53. const {inited, display, classes, finished} = useTransition({
  54. defaultName: 'fade',
  55. appear: props.visible,
  56. emits: (name:TransitionEmitStatus) => { emit(name) },
  57. visible: (): boolean => props.visible,
  58. duration: props.duration,
  59. } as UseTransitionOptions)
  60. const styles = computed(() => ({
  61. 'transition-duration': props.duration + 'ms',
  62. 'background': props.bgColor,
  63. 'z-index': props.zIndex,
  64. 'display': !display.value ? 'none' : '',
  65. }))
  66. const onClick = () => {
  67. emit('click', !props.visible)
  68. }
  69. const noop = (e) => {
  70. e?.preventDefault();
  71. return
  72. }
  73. return {
  74. inited,
  75. styles,
  76. classes,
  77. noop,
  78. onClick,
  79. finished
  80. }
  81. }
  82. })
  83. </script>
  84. <style lang="scss">
  85. @import './index';
  86. </style>