l-divider.uvue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <template>
  2. <view class="l-divider" :class="classes" :style="[styles]" ref="resizeRef">
  3. <!-- #ifdef APP-ANDROID || APP-IOS -->
  4. <view ref="resizeInnerRef" class="l-divider__inner" v-if="hasContent">
  5. <text class="l-divider__content" :style="[contentStyle]" v-bind="$attrs">
  6. <slot>{{content}}</slot>
  7. </text>
  8. </view>
  9. <!-- #endif -->
  10. <!-- #ifndef APP-ANDROID || APP-IOS -->
  11. <view class="l-divider__content" v-bind="$attrs" v-if="hasContent">
  12. <slot>{{content}}</slot>
  13. </view>
  14. <!-- #endif -->
  15. </view>
  16. </template>
  17. <script lang="uts" setup>
  18. /**
  19. * LimeDivider 分割线
  20. * @description 分割线
  21. * @tutorial https://ext.dcloud.net.cn/plugin?id=xxxx
  22. * @property {Boolean} dashed 是否使用虚线
  23. * @property {String} content 文本
  24. * @property {Boolean} align = [left|right|center] 内容位置
  25. * @value left align 靠左
  26. * @value right align 靠右
  27. * @value center align 居中
  28. */
  29. import { DividerProps } from './type';
  30. // #ifdef APP-ANDROID || APP-IOS
  31. import { drawLine } from './line'
  32. // #endif
  33. const props = withDefaults(defineProps<DividerProps>(),{
  34. align: 'center',
  35. dashed: false,
  36. vertical: false,
  37. // #ifdef APP-ANDROID || APP-IOS
  38. color: '#e7e7e7',
  39. // #endif
  40. })
  41. const slots = defineSlots()
  42. const hasContent = computed(():boolean => slots['default'] != null || props.content != null)
  43. const classes = computed(():Map<string, any> =>{
  44. const cls = new Map<string, any>();
  45. const direction = props.vertical ? 'vertical' : 'horizontal';
  46. const borderStyle = props.dashed ? 'dashed' : 'solid';
  47. const name = 'l-divider'
  48. cls.set(`${name}--${direction}`, true)
  49. cls.set(`${name}--${props.align}`, true)
  50. cls.set(`${name}--${borderStyle}`, true)
  51. return cls
  52. })
  53. const styles = computed(():Map<string, any> =>{
  54. const style = new Map<string, any>();
  55. // #ifndef APP-ANDROID || APP-IOS
  56. if(props.color != null) {
  57. style.set('border-color', props.color!)
  58. }
  59. // #endif
  60. return style
  61. })
  62. const contentStyle = computed(():Map<string, any> =>{
  63. const style = new Map<string, any>();
  64. if(props.textColor != null) {
  65. style.set('color', props.textColor!)
  66. }
  67. return style
  68. })
  69. // #ifdef APP-ANDROID || APP-IOS
  70. const resizeRef = ref<UniElement|null>(null)
  71. const resizeInnerRef = ref<UniElement|null>(null)
  72. const init = ref(false)
  73. let drawKey = ''
  74. const resizeObserver = new UniResizeObserver((entries : Array<UniResizeObserverEntry>) => {
  75. const _drawKey = `${hasContent.value}${props.color}${props.align}${props.dashed}${props.vertical}`
  76. if(drawKey == _drawKey) return
  77. drawKey = _drawKey
  78. drawLine(resizeRef.value, resizeInnerRef.value, hasContent.value, props.color, props.align, props.dashed, props.vertical)
  79. })
  80. watchEffect(()=>{
  81. if(!init.value) return
  82. drawLine(resizeRef.value, resizeInnerRef.value, hasContent.value, props.color, props.align, props.dashed, props.vertical)
  83. })
  84. onMounted(()=>{
  85. nextTick(()=>{
  86. if(resizeRef.value == null) return
  87. resizeObserver.observe(resizeRef.value!)
  88. if(resizeInnerRef.value != null) {resizeObserver.observe(resizeInnerRef.value!)}
  89. drawKey = `${hasContent.value}${props.color}${props.align}${props.dashed}${props.vertical}`
  90. init.value = true
  91. })
  92. })
  93. onUnmounted(()=>{
  94. resizeObserver.disconnect()
  95. })
  96. // #endif
  97. </script>
  98. <style lang="scss">
  99. @import './index-u';
  100. </style>