hy-app 0.5.10 → 0.5.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/components/hy-action-sheet/hy-action-sheet.vue +200 -200
  2. package/components/hy-action-sheet/props.ts +71 -71
  3. package/components/hy-action-sheet/typing.d.ts +64 -64
  4. package/components/hy-address-picker/hy-address-picker.vue +1 -1
  5. package/components/hy-address-picker/props.ts +100 -100
  6. package/components/hy-address-picker/typing.d.ts +16 -16
  7. package/components/hy-avatar/hy-avatar.vue +163 -163
  8. package/components/hy-avatar/props.ts +78 -78
  9. package/components/hy-avatar/typing.d.ts +4 -4
  10. package/components/hy-back-top/hy-back-top.vue +90 -90
  11. package/components/hy-back-top/props.ts +60 -60
  12. package/components/hy-back-top/typing.d.ts +4 -4
  13. package/components/hy-badge/hy-badge.vue +97 -97
  14. package/components/hy-badge/props.ts +82 -82
  15. package/components/hy-badge/typing.d.ts +9 -9
  16. package/components/hy-button/hy-button.vue +17 -3
  17. package/components/hy-button/index.scss +24 -1
  18. package/components/hy-button/props.ts +9 -1
  19. package/components/hy-button/typing.d.ts +5 -0
  20. package/components/hy-calendar/header.vue +60 -60
  21. package/components/hy-calendar/hy-calendar.vue +362 -362
  22. package/components/hy-calendar/month.vue +537 -537
  23. package/components/hy-calendar/props.ts +159 -159
  24. package/components/hy-calendar/typing.d.ts +6 -6
  25. package/components/hy-card/hy-card.vue +161 -161
  26. package/components/hy-card/props.ts +122 -122
  27. package/components/hy-card/typing.d.ts +12 -12
  28. package/components/hy-cell/hy-cell.vue +33 -33
  29. package/components/hy-cell/props.ts +54 -54
  30. package/components/hy-cell/typing.d.ts +4 -4
  31. package/components/hy-cell-item/hy-cell-item.vue +161 -161
  32. package/components/hy-cell-item/props.ts +66 -66
  33. package/components/hy-cell-item/typing.d.ts +7 -7
  34. package/components/hy-check-button/hy-check-button.vue +96 -96
  35. package/components/hy-check-button/props.ts +74 -74
  36. package/components/hy-check-button/typing.d.ts +44 -44
  37. package/components/hy-checkbox/hy-checkbox.vue +227 -227
  38. package/components/hy-checkbox/props.ts +96 -96
  39. package/components/hy-checkbox/typing.d.ts +8 -8
  40. package/components/hy-checkbox-group/hy-checkbox-group.vue +45 -45
  41. package/components/hy-checkbox-group/props.ts +80 -80
  42. package/components/hy-checkbox-group/typing.d.ts +6 -6
  43. package/components/hy-checkbox-item/hy-checkbox-item.vue +199 -199
  44. package/components/hy-checkbox-item/props.ts +24 -24
  45. package/components/hy-checkbox-item/typing.d.ts +7 -7
  46. package/components/hy-code-input/hy-code-input.vue +231 -231
  47. package/components/hy-code-input/props.ts +88 -88
  48. package/components/hy-code-input/typing.d.ts +8 -8
  49. package/components/hy-config-provider/hy-config-provider.vue +53 -53
  50. package/components/hy-config-provider/props.ts +28 -28
  51. package/components/hy-count-down/hy-count-down.vue +170 -170
  52. package/components/hy-count-down/index.ts +52 -52
  53. package/components/hy-count-down/props.ts +32 -32
  54. package/components/hy-count-down/typing.d.ts +14 -14
  55. package/components/hy-count-to/hy-count-to.vue +218 -218
  56. package/components/hy-count-to/props.ts +62 -62
  57. package/components/hy-count-to/typing.d.ts +4 -4
  58. package/components/hy-coupon/hy-coupon.vue +12 -1
  59. package/components/hy-coupon/index.scss +167 -171
  60. package/components/hy-coupon/props.ts +6 -1
  61. package/components/hy-coupon/typing.d.ts +14 -14
  62. package/components/hy-datetime-picker/hy-datetime-picker.vue +521 -521
  63. package/components/hy-datetime-picker/props.ts +142 -142
  64. package/components/hy-datetime-picker/typing.d.ts +20 -20
  65. package/components/hy-divider/hy-divider.vue +132 -132
  66. package/components/hy-divider/props.ts +80 -80
  67. package/components/hy-dropdown/hy-dropdown.vue +60 -60
  68. package/components/hy-dropdown/props.ts +40 -40
  69. package/components/hy-dropdown-item/hy-dropdown-item.vue +206 -206
  70. package/components/hy-dropdown-item/props.ts +21 -21
  71. package/components/hy-dropdown-item/typing.d.ts +17 -17
  72. package/components/hy-empty/hy-empty.vue +116 -116
  73. package/components/hy-empty/icon.ts +72 -72
  74. package/components/hy-empty/props.ts +60 -60
  75. package/components/hy-empty/typing.d.ts +38 -38
  76. package/components/hy-flex/hy-flex.vue +53 -53
  77. package/components/hy-flex/index.scss +8 -8
  78. package/components/hy-flex/props.ts +58 -58
  79. package/components/hy-flex/typing.d.ts +21 -21
  80. package/components/hy-float-button/hy-float-button.vue +378 -378
  81. package/components/hy-float-button/props.ts +111 -111
  82. package/components/hy-float-button/typing.d.ts +35 -35
  83. package/components/hy-folding-panel/hy-folding-panel.vue +109 -109
  84. package/components/hy-folding-panel/props.ts +42 -42
  85. package/components/hy-folding-panel/typing.d.ts +19 -19
  86. package/components/hy-folding-panel-item/hy-folding-panel-item.vue +183 -183
  87. package/components/hy-folding-panel-item/props.ts +81 -81
  88. package/components/hy-folding-panel-item/typing.d.ts +37 -37
  89. package/components/hy-form/props.ts +37 -37
  90. package/components/hy-form/typing.d.ts +41 -41
  91. package/components/hy-form-group/hy-form-group.vue +333 -333
  92. package/components/hy-form-group/props.ts +105 -105
  93. package/components/hy-form-item/hy-form-item.vue +176 -176
  94. package/components/hy-form-item/index.scss +0 -1
  95. package/components/hy-form-item/props.ts +25 -25
  96. package/components/hy-form-item/typing.d.ts +30 -30
  97. package/components/hy-grid/hy-grid.vue +109 -109
  98. package/components/hy-grid/props.ts +60 -60
  99. package/components/hy-grid/typing.d.ts +35 -35
  100. package/components/hy-icon/hy-icon.vue +112 -112
  101. package/components/hy-icon/index.scss +0 -3
  102. package/components/hy-icon/props.ts +79 -79
  103. package/components/hy-icon/typing.d.ts +9 -9
  104. package/components/hy-image/hy-image.vue +192 -192
  105. package/components/hy-image/props.ts +107 -107
  106. package/components/hy-image/typing.d.ts +10 -10
  107. package/components/hy-input/hy-input.vue +1 -1
  108. package/components/hy-input/index.scss +1 -2
  109. package/components/hy-input/props.ts +3 -3
  110. package/components/hy-input/typing.d.ts +31 -31
  111. package/components/hy-line/hy-line.vue +55 -55
  112. package/components/hy-line/props.ts +43 -43
  113. package/components/hy-line-progress/hy-line-progress.vue +102 -102
  114. package/components/hy-line-progress/props.ts +33 -33
  115. package/components/hy-list/hy-list.vue +226 -226
  116. package/components/hy-list/props.ts +69 -69
  117. package/components/hy-list/typing.d.ts +6 -6
  118. package/components/hy-loading/hy-loading.vue +107 -107
  119. package/components/hy-loading/props.ts +65 -65
  120. package/components/hy-menu/hy-menu.vue +159 -159
  121. package/components/hy-menu/props.ts +44 -44
  122. package/components/hy-menu/typing.d.ts +34 -34
  123. package/components/hy-modal/hy-modal.vue +173 -173
  124. package/components/hy-modal/props.ts +90 -90
  125. package/components/hy-modal/typing.d.ts +11 -11
  126. package/components/hy-navbar/hy-navbar.vue +144 -144
  127. package/components/hy-navbar/props.ts +78 -78
  128. package/components/hy-navbar/typing.d.ts +6 -6
  129. package/components/hy-notice-bar/hy-column-notice.vue +94 -94
  130. package/components/hy-notice-bar/hy-notice-bar.vue +96 -96
  131. package/components/hy-notice-bar/hy-row-notice.vue +1 -1
  132. package/components/hy-notice-bar/props.ts +85 -85
  133. package/components/hy-notice-bar/typing.d.ts +8 -8
  134. package/components/hy-notify/hy-notify.vue +174 -174
  135. package/components/hy-notify/props.ts +51 -51
  136. package/components/hy-number-step/hy-number-step.vue +367 -367
  137. package/components/hy-number-step/props.ts +112 -112
  138. package/components/hy-number-step/typing.d.ts +16 -16
  139. package/components/hy-overlay/hy-overlay.vue +60 -60
  140. package/components/hy-overlay/props.ts +33 -33
  141. package/components/hy-overlay/typing.d.ts +4 -4
  142. package/components/hy-pagination/hy-pagination.vue +135 -135
  143. package/components/hy-pagination/props.ts +55 -55
  144. package/components/hy-pagination/typing.d.ts +10 -10
  145. package/components/hy-parse/node/node.vue +619 -422
  146. package/components/hy-parse/parser.js +1253 -1060
  147. package/components/hy-picker/hy-picker.vue +7 -5
  148. package/components/hy-picker/props.ts +7 -2
  149. package/components/hy-picker/typing.d.ts +9 -5
  150. package/components/hy-popover/hy-popover.vue +251 -251
  151. package/components/hy-popover/props.ts +51 -51
  152. package/components/hy-popover/typing.d.ts +39 -39
  153. package/components/hy-popup/hy-popup.vue +197 -197
  154. package/components/hy-popup/props.ts +85 -85
  155. package/components/hy-popup/typing.d.ts +10 -10
  156. package/components/hy-price/hy-price.vue +79 -79
  157. package/components/hy-price/props.ts +54 -54
  158. package/components/hy-price/typing.d.ts +4 -4
  159. package/components/hy-qrcode/hy-qrcode.vue +216 -216
  160. package/components/hy-qrcode/props.ts +70 -70
  161. package/components/hy-qrcode/qrcode.js +1304 -1304
  162. package/components/hy-qrcode/typing.d.ts +8 -8
  163. package/components/hy-radio/hy-radio.vue +226 -226
  164. package/components/hy-radio/props.ts +1 -1
  165. package/components/hy-radio/typing.d.ts +8 -8
  166. package/components/hy-rate/hy-rate.vue +239 -239
  167. package/components/hy-rate/props.ts +77 -77
  168. package/components/hy-rate/typing.d.ts +6 -6
  169. package/components/hy-read-more/hy-read-more.vue +130 -130
  170. package/components/hy-read-more/props.ts +45 -45
  171. package/components/hy-read-more/typing.d.ts +6 -6
  172. package/components/hy-rolling-num/hy-rolling-num.vue +188 -188
  173. package/components/hy-rolling-num/props.ts +68 -68
  174. package/components/hy-scroll-list/hy-scroll-list.vue +123 -123
  175. package/components/hy-scroll-list/props.ts +22 -22
  176. package/components/hy-scroll-list/typing.d.ts +6 -6
  177. package/components/hy-search/hy-search.vue +221 -221
  178. package/components/hy-search/props.ts +131 -131
  179. package/components/hy-search/typing.d.ts +22 -22
  180. package/components/hy-signature/hy-signature.vue +640 -640
  181. package/components/hy-signature/props.ts +118 -118
  182. package/components/hy-signature/typing.d.ts +93 -93
  183. package/components/hy-slider/hy-slider.vue +444 -444
  184. package/components/hy-slider/props.ts +77 -77
  185. package/components/hy-slider/typing.d.ts +10 -10
  186. package/components/hy-status-bar/hy-status-bar.vue +41 -41
  187. package/components/hy-status-bar/props.ts +8 -8
  188. package/components/hy-status-bar/typing.d.ts +12 -12
  189. package/components/hy-steps/hy-steps.vue +267 -267
  190. package/components/hy-steps/props.ts +49 -49
  191. package/components/hy-steps/typing.d.ts +21 -21
  192. package/components/hy-sticky/hy-sticky.vue +226 -226
  193. package/components/hy-sticky/props.ts +24 -24
  194. package/components/hy-sticky/typing.d.ts +4 -4
  195. package/components/hy-submit-bar/hy-submit-bar.vue +189 -189
  196. package/components/hy-submit-bar/props.ts +91 -91
  197. package/components/hy-submit-bar/typing.d.ts +24 -24
  198. package/components/hy-subsection/hy-subsection.vue +207 -207
  199. package/components/hy-subsection/props.ts +52 -52
  200. package/components/hy-subsection/typing.d.ts +13 -13
  201. package/components/hy-swipe-action/hy-swipe-action.vue +323 -323
  202. package/components/hy-swipe-action/index.ts +25 -25
  203. package/components/hy-swipe-action/props.ts +47 -47
  204. package/components/hy-swipe-action/typing.d.ts +25 -25
  205. package/components/hy-swiper/hy-swiper-indicator.vue +75 -75
  206. package/components/hy-swiper/hy-swiper.vue +224 -224
  207. package/components/hy-swiper/props.ts +128 -128
  208. package/components/hy-swiper/typing.d.ts +26 -26
  209. package/components/hy-switch/hy-switch.vue +173 -173
  210. package/components/hy-switch/props.ts +61 -61
  211. package/components/hy-switch/typing.d.ts +8 -8
  212. package/components/hy-tabbar/hy-tabbar.vue +136 -136
  213. package/components/hy-tabbar/props.ts +59 -59
  214. package/components/hy-tabbar/typing.d.ts +21 -21
  215. package/components/hy-tabbar-group/hy-tabbar-group.vue +87 -87
  216. package/components/hy-tabbar-group/props.ts +78 -78
  217. package/components/hy-tabbar-group/typing.d.ts +16 -16
  218. package/components/hy-tabbar-item/hy-tabbar-item.vue +103 -103
  219. package/components/hy-tabbar-item/typing.d.ts +10 -10
  220. package/components/hy-table/hy-table.vue +492 -271
  221. package/components/hy-table/index.scss +134 -159
  222. package/components/hy-table/props.ts +22 -7
  223. package/components/hy-table/typing.d.ts +6 -11
  224. package/components/hy-tabs/hy-tabs.vue +1 -1
  225. package/components/hy-tabs/props.ts +77 -77
  226. package/components/hy-tabs/typing.d.ts +33 -33
  227. package/components/hy-tag/hy-tag.vue +174 -174
  228. package/components/hy-tag/props.ts +89 -89
  229. package/components/hy-tag/typing.d.ts +13 -13
  230. package/components/hy-text/hy-text.vue +3 -3
  231. package/components/hy-text/props.ts +1 -1
  232. package/components/hy-text/typing.d.ts +6 -6
  233. package/components/hy-textarea/hy-textarea.vue +3 -2
  234. package/components/hy-textarea/index.scss +2 -3
  235. package/components/hy-textarea/props.ts +116 -116
  236. package/components/hy-textarea/typing.d.ts +22 -22
  237. package/components/hy-toast/hy-toast.vue +1 -1
  238. package/components/hy-toast/typing.d.ts +38 -38
  239. package/components/hy-tooltip/hy-tooltip.vue +277 -277
  240. package/components/hy-tooltip/props.ts +78 -78
  241. package/components/hy-tooltip/typing.d.ts +4 -4
  242. package/components/hy-transition/hy-transition.vue +157 -157
  243. package/components/hy-transition/props.ts +32 -32
  244. package/components/hy-transition/typing.d.ts +16 -16
  245. package/components/hy-upload/hy-upload.vue +385 -385
  246. package/components/hy-upload/props.ts +132 -132
  247. package/components/hy-upload/typing.d.ts +65 -65
  248. package/components/hy-warn/hy-warn.vue +115 -115
  249. package/components/hy-warn/props.ts +49 -49
  250. package/components/hy-warn/typing.d.ts +6 -6
  251. package/components/hy-waterfall/hy-waterfall.vue +191 -191
  252. package/components/hy-waterfall/props.ts +21 -21
  253. package/components/hy-watermark/hy-watermark.vue +978 -978
  254. package/components/hy-watermark/props.ts +104 -104
  255. package/components/index.ts +183 -183
  256. package/global.d.ts +91 -91
  257. package/index.ts +1 -1
  258. package/libs/api/http.ts +140 -140
  259. package/libs/api/index.ts +1 -1
  260. package/libs/common/index.ts +2 -2
  261. package/libs/common/queue.ts +28 -28
  262. package/libs/composables/index.ts +6 -6
  263. package/libs/composables/usePopover.ts +241 -241
  264. package/libs/composables/useQueue.ts +53 -53
  265. package/libs/composables/useShakeService.ts +64 -64
  266. package/libs/composables/useShare.ts +42 -42
  267. package/libs/composables/useToast.ts +45 -45
  268. package/libs/composables/useTouch.ts +51 -51
  269. package/libs/config/color.ts +7 -7
  270. package/libs/config/icon.ts +430 -430
  271. package/libs/config/index.ts +2 -2
  272. package/libs/css/iconfont.css +443 -443
  273. package/libs/css/theme.scss +1 -0
  274. package/libs/css/vars.scss +2 -2
  275. package/libs/global/index.ts +6 -6
  276. package/libs/global/register-properties.ts +37 -37
  277. package/libs/index.ts +7 -7
  278. package/libs/typing/index.ts +4 -4
  279. package/libs/typing/modules/common.d.ts +136 -136
  280. package/libs/typing/modules/enum.ts +67 -67
  281. package/libs/typing/modules/form.ts +5 -1
  282. package/libs/typing/modules/http.ts +17 -17
  283. package/libs/typing/modules/icon.d.ts +366 -366
  284. package/libs/typing/modules/rect.ts +10 -10
  285. package/libs/utils/base64.ts +119 -119
  286. package/libs/utils/calendar.js +1021 -1021
  287. package/libs/utils/colorGradient.ts +112 -112
  288. package/libs/utils/index.ts +5 -5
  289. package/libs/utils/inside.ts +11 -25
  290. package/libs/utils/inspect.ts +171 -171
  291. package/libs/utils/utils.ts +521 -521
  292. package/package.json +18 -18
  293. package/web-types.json +1 -1
@@ -1,358 +1,579 @@
1
1
  <template>
2
- <view class="hy-table" :style="{ height: addUnit(height) }">
3
- <!-- 主容器 -->
4
- <view class="hy-table__container">
5
- <!-- 表头区域 -->
6
- <view class="hy-table__header">
7
- <!-- 固定左列表头 -->
8
- <view v-if="leftFixedColumns.length > 0" class="hy-table__header--left">
2
+ <view class="hy-table" :style="{ height: addUnit(containerHeight) }">
3
+ <!-- 列头 -->
4
+ <view class="hy-table__header" v-if="showHeader">
5
+ <scroll-view
6
+ class="hy-table__header--scroll"
7
+ scroll-x
8
+ :scroll-left="scrollLeft"
9
+ :scroll-y="false"
10
+ @scroll="onHeaderScroll"
11
+ >
12
+ <view class="hy-table__header--wrapper" :style="{ width: addUnit(totalWidth) }">
13
+ <!-- 左侧固定列头 -->
9
14
  <view
10
- class="hy-table__header__th"
11
- v-for="(col, index) in leftFixedColumns"
12
- :key="col.key || index"
13
- :style="[getCellStyle(col, true)]"
14
- @click="handleSort(col)"
15
+ v-if="leftFixedColumns.length > 0"
16
+ :class="['hy-table__header--wrapper__left', scrollLeft && 'is-shadow']"
17
+ :style="{ width: addUnit(leftFixedWidth), zIndex: 3 }"
15
18
  >
16
- <text class="hy-table__header__th--text">{{ col.title }}</text>
17
- <!-- 排序图标 -->
18
- <view v-if="col.sortable" class="hy-table__header__th--sort">
19
- <hy-icon
20
- :name="IconConfig.ARROW_UP_FILL"
21
- size="10"
22
- :custom-class="sortKey === col.key && sortType === 'asc' ? 'is-active' : ''"
23
- />
24
- <hy-icon
25
- :name="IconConfig.ARROW_DOWN_FILL"
26
- size="10"
27
- :custom-class="sortKey === col.key && sortType === 'desc' ? 'is-active' : ''"
28
- />
19
+ <view
20
+ v-for="(col, colIndex) in leftFixedColumns"
21
+ :key="colIndex"
22
+ class="hy-table__header--wrapper__cell"
23
+ :style="getHeaderCellStyle(col)"
24
+ @tap="handleSort(col)"
25
+ >
26
+ <slot v-if="$slots['left-head']" name="left-head" :col="col">
27
+ <text class="header-text">{{ col.title }}</text>
28
+ </slot>
29
+ <text v-else class="hy-table__header--wrapper__cell--text">{{
30
+ col.title
31
+ }}</text>
32
+ <view
33
+ v-if="col.sortable"
34
+ class="hy-table__header--wrapper__cell--sortable"
35
+ >
36
+ <hy-icon
37
+ :name="IconConfig.ARROW_UP_FILL"
38
+ size="12"
39
+ :custom-class="
40
+ sortField === col.key && sortOrder === 'asc'
41
+ ? 'is-active'
42
+ : ''
43
+ "
44
+ @click.stop="handleSort(col, 'asc')"
45
+ ></hy-icon>
46
+
47
+ <hy-icon
48
+ :name="IconConfig.ARROW_DOWN_FILL"
49
+ size="12"
50
+ :custom-class="
51
+ sortField === col.key && sortOrder === 'desc'
52
+ ? 'is-active'
53
+ : ''
54
+ "
55
+ @click.stop="handleSort(col, 'desc')"
56
+ ></hy-icon>
57
+ </view>
29
58
  </view>
30
59
  </view>
31
- </view>
32
- <!-- 中间表头 -->
33
- <view class="hy-table__header--center" :style="{ paddingLeft: `${leftFixedWidth}px`, paddingRight: `${rightFixedWidth}px` }">
34
- <view
35
- class="hy-table__header__th"
36
- v-for="(col, index) in scrollColumns"
37
- :key="col.key || index"
38
- :style="[getCellStyle(col, true)]"
39
- @click="handleSort(col)"
40
- >
41
- <text class="hy-table__header__th--text">{{ col.title }}</text>
42
- <!-- 排序图标 -->
43
- <view v-if="col.sortable" class="hy-table__header__th--sort">
44
- <hy-icon
45
- :name="IconConfig.ARROW_UP_FILL"
46
- size="10"
47
- :custom-class="sortKey === col.key && sortType === 'asc' ? 'is-active' : ''"
48
- />
49
- <hy-icon
50
- :name="IconConfig.ARROW_DOWN_FILL"
51
- size="10"
52
- :custom-class="sortKey === col.key && sortType === 'desc' ? 'is-active' : ''"
53
- />
60
+
61
+ <!-- 中间滚动列头 -->
62
+ <view class="hy-table__header--wrapper__center">
63
+ <view
64
+ v-for="(col, colIndex) in scrollColumns"
65
+ :key="colIndex"
66
+ class="hy-table__header--wrapper__cell"
67
+ :style="getHeaderCellStyle(col)"
68
+ @tap="handleSort(col)"
69
+ >
70
+ <slot v-if="$slots.head" name="head" :col="col"></slot>
71
+ <text v-else class="hy-table__header--wrapper__cell--text">{{
72
+ col.title
73
+ }}</text>
74
+ <view
75
+ v-if="col.sortable"
76
+ class="hy-table__header--wrapper__cell--sortable"
77
+ >
78
+ <hy-icon
79
+ :name="IconConfig.ARROW_UP_FILL"
80
+ size="12"
81
+ :custom-class="
82
+ sortField === col.key && sortOrder === 'asc'
83
+ ? 'is-active'
84
+ : ''
85
+ "
86
+ @click.stop="handleSort(col, 'asc')"
87
+ ></hy-icon>
88
+
89
+ <hy-icon
90
+ :name="IconConfig.ARROW_DOWN_FILL"
91
+ size="12"
92
+ :custom-class="
93
+ sortField === col.key && sortOrder === 'desc'
94
+ ? 'is-active'
95
+ : ''
96
+ "
97
+ @click.stop="handleSort(col, 'desc')"
98
+ ></hy-icon>
99
+ </view>
54
100
  </view>
55
101
  </view>
56
- </view>
57
- <!-- 固定右列表头 -->
58
- <view v-if="rightFixedColumns.length > 0" class="hy-table__header--right">
102
+
103
+ <!-- 右侧固定列头 -->
59
104
  <view
60
- class="hy-table__header__th"
61
- v-for="(col, index) in rightFixedColumns"
62
- :key="col.key || index"
63
- :style="[getCellStyle(col, true)]"
64
- @click="handleSort(col)"
105
+ v-if="rightFixedColumns.length > 0"
106
+ class="hy-table__header--wrapper__right"
107
+ :style="{ width: addUnit(rightFixedWidth), zIndex: 3 }"
65
108
  >
66
- <text class="hy-table__header__th--text">{{ col.title }}</text>
67
- <!-- 排序图标 -->
68
- <view v-if="col.sortable" class="hy-table__header__th--sort">
69
- <hy-icon
70
- :name="IconConfig.ARROW_UP_FILL"
71
- size="10"
72
- :custom-class="sortKey === col.key && sortType === 'asc' ? 'is-active' : ''"
73
- />
74
- <hy-icon
75
- :name="IconConfig.ARROW_DOWN_FILL"
76
- size="10"
77
- :custom-class="sortKey === col.key && sortType === 'desc' ? 'is-active' : ''"
78
- />
109
+ <view
110
+ v-for="(col, colIndex) in rightFixedColumns"
111
+ :key="colIndex"
112
+ class="hy-table__header--wrapper__cell"
113
+ :style="getHeaderCellStyle(col)"
114
+ @tap="handleSort(col)"
115
+ >
116
+ <slot v-if="$slots['right-head']" name="right-head" :col="col"></slot>
117
+ <text v-else class="hy-table__header--wrapper__cell--text">{{
118
+ col.title
119
+ }}</text>
120
+ <view
121
+ v-if="col.sortable"
122
+ class="hy-table__header--wrapper__cell--sortable"
123
+ >
124
+ <hy-icon
125
+ :name="IconConfig.ARROW_UP_FILL"
126
+ size="12"
127
+ :custom-class="
128
+ sortField === col.key && sortOrder === 'asc'
129
+ ? 'is-active'
130
+ : ''
131
+ "
132
+ @click.stop="handleSort(col, 'asc')"
133
+ ></hy-icon>
134
+
135
+ <hy-icon
136
+ :name="IconConfig.ARROW_DOWN_FILL"
137
+ size="12"
138
+ :custom-class="
139
+ sortField === col.key && sortOrder === 'desc'
140
+ ? 'is-active'
141
+ : ''
142
+ "
143
+ @click.stop="handleSort(col, 'desc')"
144
+ ></hy-icon>
145
+ </view>
79
146
  </view>
80
147
  </view>
81
148
  </view>
149
+ </scroll-view>
150
+ </view>
151
+
152
+ <!-- 表格主体 -->
153
+ <view class="hy-table__body">
154
+ <view v-if="loading" class="hy-table__body--loading">
155
+ <hy-loading text="加载中..." mode="circle"></hy-loading>
156
+ </view>
157
+ <view v-if="!data.length" class="hy-table__body--empty">
158
+ <slot v-if="$slots.empty" name="empty"></slot>
159
+ <hy-empty v-else :image-url="emptyUrl" :description="emptyDes"></hy-empty>
82
160
  </view>
83
-
84
- <!-- 内容区域 -->
85
- <scroll-view
86
- class="hy-table__body"
161
+ <!-- 左侧固定列 -->
162
+ <scroll-view
163
+ v-if="processedData.length"
164
+ :class="['hy-table__body--left', scrollLeft && 'is-shadow']"
87
165
  scroll-y
88
166
  :scroll-top="scrollTop"
89
- @scroll="handleScroll"
167
+ :style="{ width: addUnit(leftFixedWidth), height: addUnit(bodyHeight) }"
168
+ @scroll="onLeftScroll"
90
169
  >
91
- <!-- 内容包装器 -->
92
- <view class="hy-table__body__wrapper">
93
- <!-- 固定左列内容 -->
94
- <view v-if="leftFixedColumns.length > 0" class="hy-table__body--left">
170
+ <view class="hy-table__body--content">
171
+ <view
172
+ v-for="(row, rowIndex) in processedData"
173
+ :key="rowIndex"
174
+ :class="rowClass(rowIndex)"
175
+ :style="getRowStyle(rowIndex)"
176
+ >
95
177
  <view
96
- class="hy-table__body__tr"
97
- v-for="(row, rowIndex) in tableData"
98
- :key="`left-${row[rowKey] || rowIndex}`"
178
+ v-for="(col, colIndex) in leftFixedColumns"
179
+ :key="colIndex"
180
+ class="hy-table__body--content__row--cell"
181
+ :style="getBodyCellStyle(col, rowIndex)"
182
+ @tap="onCellClick(row, rowIndex)"
99
183
  >
100
- <view
101
- class="hy-table__body__td"
102
- v-for="(col, colIndex) in leftFixedColumns"
103
- :key="col.key || colIndex"
104
- :style="[getCellStyle(col, false)]"
105
- @click.stop="handleCellClick(row, col)"
184
+ <slot
185
+ v-if="$slots.left"
186
+ name="left"
187
+ :row="row"
188
+ :col="col"
189
+ :index="rowIndex"
190
+ ></slot>
191
+ <text
192
+ v-else
193
+ class="hy-table__body--content__row--cell__text"
194
+ :class="{ 'is-ellipsis': col.ellipsis }"
106
195
  >
107
- <slot name="default" :row="row" :col="col" :index="rowIndex">
108
- <text :class="{ 'hy-table__body__td--ellipsis': col.ellipsis }">{{ row[col.key] }}</text>
109
- </slot>
110
- </view>
196
+ {{ getCellValue(row, col) }}
197
+ </text>
111
198
  </view>
112
199
  </view>
113
- <!-- 中间内容 -->
114
- <view class="hy-table__body--center" :style="{ paddingLeft: `${leftFixedWidth}px`, paddingRight: `${rightFixedWidth}px` }">
200
+ </view>
201
+ </scroll-view>
202
+
203
+ <!-- 中间滚动区域 -->
204
+ <scroll-view
205
+ v-if="processedData.length"
206
+ class="hy-table__body--center"
207
+ scroll-y
208
+ :scroll-top="scrollTop"
209
+ @scroll="onScroll"
210
+ :style="{
211
+ width: `calc(100% - ${leftFixedWidth + rightFixedWidth}px)`,
212
+ height: addUnit(bodyHeight),
213
+ left: addUnit(leftFixedWidth),
214
+ right: addUnit(rightFixedWidth)
215
+ }"
216
+ >
217
+ <scroll-view
218
+ scroll-x
219
+ :scroll-left="scrollLeft"
220
+ class="hy-table__body--content"
221
+ @scroll="onCrosswiseScroll"
222
+ >
223
+ <view
224
+ v-for="(row, rowIndex) in processedData"
225
+ :key="rowIndex"
226
+ :class="rowClass(rowIndex)"
227
+ :style="getRowStyle(rowIndex)"
228
+ >
115
229
  <view
116
- class="hy-table__body__tr"
117
- v-for="(row, rowIndex) in tableData"
118
- :key="row[rowKey] || rowIndex"
119
- @click="handleRowClick(row, rowIndex)"
230
+ v-for="(col, colIndex) in scrollColumns"
231
+ :key="colIndex"
232
+ class="hy-table__body--content__row--cell"
233
+ :class="{ ellipsis: col.ellipsis }"
234
+ :style="getBodyCellStyle(col, rowIndex)"
235
+ @tap="onCellClick(row, rowIndex)"
120
236
  >
121
- <view
122
- class="hy-table__body__td"
123
- v-for="(col, colIndex) in scrollColumns"
124
- :key="col.key || colIndex"
125
- :style="[getCellStyle(col, false)]"
126
- @click.stop="handleCellClick(row, col)"
237
+ <slot
238
+ v-if="$slots.default"
239
+ name="default"
240
+ :row="row"
241
+ :col="col"
242
+ :index="rowIndex"
243
+ ></slot>
244
+ <text
245
+ v-else
246
+ class="hy-table__body--content__row--cell__text"
247
+ :class="{ 'is-ellipsis': col.ellipsis }"
127
248
  >
128
- <slot name="default" :row="row" :col="col" :index="rowIndex">
129
- <text :class="{ 'hy-table__body__td--ellipsis': col.ellipsis }">{{ row[col.key] }}</text>
130
- </slot>
131
- </view>
249
+ {{ getCellValue(row, col) }}
250
+ </text>
132
251
  </view>
133
252
  </view>
134
- <!-- 固定右列内容 -->
135
- <view v-if="rightFixedColumns.length > 0" class="hy-table__body--right">
253
+ </scroll-view>
254
+ </scroll-view>
255
+
256
+ <!-- 右侧固定列 -->
257
+ <scroll-view
258
+ v-if="processedData.length"
259
+ class="hy-table__body--right"
260
+ scroll-y
261
+ :scroll-top="scrollTop"
262
+ :style="{
263
+ width: addUnit(rightFixedWidth),
264
+ height: addUnit(bodyHeight),
265
+ right: '0'
266
+ }"
267
+ @scroll="onRightScroll"
268
+ >
269
+ <view class="hy-table__body--content">
270
+ <view
271
+ v-for="(row, rowIndex) in processedData"
272
+ :key="rowIndex"
273
+ :class="rowClass(rowIndex)"
274
+ :style="getRowStyle(rowIndex)"
275
+ >
136
276
  <view
137
- class="hy-table__body__tr"
138
- v-for="(row, rowIndex) in tableData"
139
- :key="`right-${row[rowKey] || rowIndex}`"
277
+ v-for="(col, colIndex) in rightFixedColumns"
278
+ :key="colIndex"
279
+ class="hy-table__body--content__row--cell"
280
+ :style="getBodyCellStyle(col, rowIndex)"
281
+ @tap="onCellClick(row, rowIndex)"
140
282
  >
141
- <view
142
- class="hy-table__body__td"
143
- v-for="(col, colIndex) in rightFixedColumns"
144
- :key="col.key || colIndex"
145
- :style="[getCellStyle(col, false)]"
146
- @click.stop="handleCellClick(row, col)"
283
+ <slot
284
+ v-if="$slots.right"
285
+ name="right"
286
+ :row="row"
287
+ :col="col"
288
+ :index="rowIndex"
289
+ ></slot>
290
+ <text
291
+ v-else
292
+ class="hy-table__body--content__row--cell__text"
293
+ :class="{ 'is-ellipsis': col.ellipsis }"
147
294
  >
148
- <slot name="default" :row="row" :col="col" :index="rowIndex">
149
- <text :class="{ 'hy-table__body__td--ellipsis': col.ellipsis }">{{ row[col.key] }}</text>
150
- </slot>
151
- </view>
295
+ {{ getCellValue(row, col) }}
296
+ </text>
152
297
  </view>
153
298
  </view>
154
299
  </view>
155
-
156
- <!-- 空状态 -->
157
- <hy-empty
158
- v-if="!loading && tableData.length === 0"
159
- :description="emptyText"
160
- ></hy-empty>
161
-
162
- <!-- 加载状态 -->
163
- <hy-loading
164
- v-if="loading"
165
- text="加载中..."
166
- mode="circle"
167
- direction="column"
168
- custom-class="hy-table__body--loading"
169
- ></hy-loading>
170
300
  </scroll-view>
171
301
  </view>
172
302
  </view>
173
303
  </template>
174
304
 
175
- <script lang="ts">
176
- export default {
177
- name: 'hy-table',
178
- options: {
179
- addGlobalClass: true,
180
- virtualHost: true,
181
- styleIsolation: 'shared'
182
- }
183
- }
184
- </script>
185
-
186
305
  <script setup lang="ts">
187
- import { computed, ref, watch } from 'vue'
306
+ import { ref, computed, watch, onMounted } from 'vue'
307
+ import { addUnit, IconConfig, sleep, getPx } from '../../libs'
308
+ import type { ITableColumn, ITableEmits } from './typing'
188
309
  import tableProps from './props'
189
- import type { ITableColumn, ITableEmits, SortType } from './typing'
190
- import { addUnit, IconConfig } from '../../libs'
191
310
  // 组件
311
+ import HyIcon from '../hy-icon/hy-icon.vue'
192
312
  import HyEmpty from '../hy-empty/hy-empty.vue'
193
313
  import HyLoading from '../hy-loading/hy-loading.vue'
194
- import HyIcon from '../hy-icon/hy-icon.vue'
195
-
196
- /**
197
- * 用于展示多条结构类似的数据, 可对数据进行排序等操作。
198
- * @displayName hy-table
199
- */
200
- defineOptions({})
201
314
 
202
315
  const props = defineProps(tableProps)
203
316
  const emit = defineEmits<ITableEmits>()
204
317
 
205
- // --- 状态管理 ---
206
- const sortKey = ref<string>('')
207
- const sortType = ref<SortType>('normal')
208
- const tableData = ref<any[]>([]) // 内部维护的数据,用于排序展示
209
- const scrollTop = ref<number>(0) // 滚动位置,用于控制表头定位
318
+ // 响应式数据
319
+ const scrollLeft = ref(0)
320
+ const scrollTop = ref(0)
321
+ const rowHeights = ref<number[]>([])
322
+ const sortField = ref<string>('')
323
+ const sortOrder = ref<'asc' | 'desc'>('asc')
210
324
 
211
- // --- 监听数据变化 ---
212
- watch(
213
- () => props.data,
214
- (val) => {
215
- tableData.value = [...val]
216
- // 如果当前有排序状态,重新应用排序
217
- if (sortKey.value && sortType.value) {
218
- localSort()
219
- }
220
- },
221
- { immediate: true, deep: true }
325
+ // 防止滚动循环触发和抖动的标志位
326
+ const isUpdatingScroll = ref(false)
327
+
328
+ // 计算属性
329
+ const leftFixedColumns = computed(() => props.columns.filter((col) => col.fixed === 'left'))
330
+
331
+ const rightFixedColumns = computed(() => props.columns.filter((col) => col.fixed === 'right'))
332
+
333
+ const scrollColumns = computed(() => props.columns.filter((col) => !col?.fixed))
334
+
335
+ const leftFixedWidth = computed(() =>
336
+ leftFixedColumns.value.reduce((sum, col) => sum + col.width, 0)
222
337
  )
223
338
 
224
- // --- 计算固定列和滚动列 ---
225
- const leftFixedColumns = computed(() => {
226
- return props.columns.filter(col => col.fixed === 'left')
227
- })
339
+ const rightFixedWidth = computed(() =>
340
+ rightFixedColumns.value.reduce((sum, col) => sum + col.width, 0)
341
+ )
228
342
 
229
- const rightFixedColumns = computed(() => {
230
- return props.columns.filter(col => col.fixed === 'right')
231
- })
343
+ const scrollWidth = computed(() => scrollColumns.value.reduce((sum, col) => sum + col.width, 0))
344
+
345
+ const totalWidth = computed(() => leftFixedWidth.value + scrollWidth.value + rightFixedWidth.value)
232
346
 
233
- const scrollColumns = computed(() => {
234
- return props.columns.filter(col => !col.fixed)
347
+ const containerHeight = computed(() => props.height)
348
+
349
+ const bodyHeight = computed(() => {
350
+ // 减去表头高度
351
+ return props.showHeader ? getPx(props.height) - 50 : props.height
235
352
  })
236
353
 
237
- // --- 计算固定列总宽度 ---
238
- const leftFixedWidth = computed(() => {
239
- let width = 0
240
- leftFixedColumns.value.forEach(col => {
241
- const w = parseInt(String(col.width || 100))
242
- width += w
243
- })
244
- return width
354
+ const processedData = computed(() => {
355
+ let data = [...props.data]
356
+
357
+ if (sortField.value) {
358
+ data.sort((a, b) => {
359
+ const aVal = a[sortField.value]
360
+ const bVal = b[sortField.value]
361
+
362
+ if (aVal === bVal) return 0
363
+ if (sortOrder.value === 'asc') {
364
+ return aVal > bVal ? 1 : -1
365
+ } else {
366
+ return aVal < bVal ? 1 : -1
367
+ }
368
+ })
369
+ }
370
+
371
+ return data
245
372
  })
246
373
 
247
- const rightFixedWidth = computed(() => {
248
- let width = 0
249
- rightFixedColumns.value.forEach(col => {
250
- const w = parseInt(String(col.width || 100))
251
- width += w
252
- })
253
- return width
374
+ // 方法
375
+ const getHeaderCellStyle = (col: ITableColumn) => {
376
+ return {
377
+ width: addUnit(col.width),
378
+ textAlign: col.align || 'left',
379
+ flexShrink: 0
380
+ }
381
+ }
382
+
383
+ const getBodyCellStyle = (col: ITableColumn, rowIndex: number) => {
384
+ const rowHeight = rowHeights.value[rowIndex] || props.rowHeight
385
+ return {
386
+ width: addUnit(col.width),
387
+ textAlign: col.align || 'left',
388
+ flexShrink: 0,
389
+ height: addUnit(rowHeight),
390
+ lineHeight: addUnit(rowHeight)
391
+ }
392
+ }
393
+
394
+ /**
395
+ * 行类名
396
+ * */
397
+ const rowClass = computed(() => {
398
+ return (rowIndex: number) => {
399
+ const classes = ['hy-table__body--content__row']
400
+
401
+ if (props.stripe && rowIndex % 2 === 1) {
402
+ classes.push('is-stripe')
403
+ }
404
+
405
+ return classes
406
+ }
254
407
  })
408
+ /**
409
+ * 行样式
410
+ * */
411
+ const getRowStyle = computed(() => {
412
+ return (rowIndex: number) => {
413
+ const rowHeight = rowHeights.value[rowIndex] || props.rowHeight
414
+ const styles: any = {
415
+ width: addUnit(scrollWidth.value),
416
+ height: addUnit(rowHeight),
417
+ lineHeight: addUnit(rowHeight)
418
+ }
255
419
 
256
- // --- 计算总宽度 (用于 scroll-view 横向滚动) ---
257
- const totalMinWidth = computed(() => {
258
- let width = 0
259
- scrollColumns.value.forEach((col) => {
260
- // 简单估算:如果有明确宽度则累加,否则给个默认值 100
261
- const w = parseInt(String(col.width || 100))
262
- width += w
263
- })
264
- return width
420
+ return styles
421
+ }
265
422
  })
266
423
 
267
- // --- 事件处理 ---
268
- // 处理滚动事件
269
- const handleScroll = (e: any) => {
270
- scrollTop.value = e.detail.scrollTop
424
+ const getCellValue = (row: any, col: ITableColumn) => {
425
+ if (col.formatter) {
426
+ return col.formatter(row[col.key], row)
427
+ }
428
+ return row[col.key] || ''
271
429
  }
272
430
 
273
- // --- 样式计算 ---
274
- const getCellStyle = (col: ITableColumn, isHeader: boolean) => {
275
- const style: any = {}
431
+ const onHeaderScroll = async (e: any) => {
432
+ if (isUpdatingScroll.value) return
276
433
 
277
- // 处理宽度
278
- if (col.width) {
279
- const w = typeof col.width === 'number' ? `${col.width}px` : col.width
280
- style.width = w
281
- style.flex = `0 0 ${w}` // 固定宽度,不伸缩
282
- } else {
283
- style.flex = 1 // 自动填充
284
- style.minWidth = '150rpx' // 最小宽度防止太挤
434
+ const newScrollLeft = e.detail.scrollLeft
435
+ if (Math.abs(newScrollLeft - scrollLeft.value) > 1) {
436
+ isUpdatingScroll.value = true
437
+ scrollLeft.value = newScrollLeft
438
+ // 在下一个事件循环重置标志位
439
+ await sleep(0)
440
+ isUpdatingScroll.value = false
285
441
  }
442
+ }
286
443
 
287
- // 处理对齐
288
- style.justifyContent =
289
- col.align === 'center' ? 'center' : col.align === 'right' ? 'flex-end' : 'flex-start'
290
- style.textAlign = col.align || 'left'
444
+ /**
445
+ * 中间内容竖直滚动
446
+ * */
447
+ const onScroll = async (e: any) => {
448
+ if (isUpdatingScroll.value) return
449
+
450
+ const newScrollTop = e.detail.scrollTop
451
+ isUpdatingScroll.value = true
452
+ if (Math.abs(newScrollTop - scrollTop.value) > 1) {
453
+ scrollTop.value = newScrollTop
454
+ }
291
455
 
292
- return style
456
+ // 在下一个事件循环重置标志位
457
+ await sleep(0)
458
+ isUpdatingScroll.value = false
293
459
  }
294
460
 
295
- // --- 排序逻辑 ---
296
- const handleSort = (col: ITableColumn) => {
297
- if (!col.sortable) return
461
+ /**
462
+ * 中间内容横向滚动
463
+ * */
464
+ const onCrosswiseScroll = async (e: any) => {
465
+ if (isUpdatingScroll.value) return
298
466
 
299
- // 切换排序状态: '' -> 'asc' -> 'desc' -> ''
300
- if (sortKey.value !== col.key) {
301
- sortKey.value = col.key
302
- sortType.value = 'asc'
303
- } else {
304
- if (sortType.value === 'asc') sortType.value = 'desc'
305
- else if (sortType.value === 'desc') sortType.value = 'normal'
306
- else sortType.value = 'asc' // 逻辑闭环
467
+ const newScrollLeft = e.detail.scrollLeft
468
+ isUpdatingScroll.value = true
469
+ // 使用阈值来减少频繁更新,避免抖动
470
+ if (Math.abs(newScrollLeft - scrollLeft.value) > 1) {
471
+ scrollLeft.value = newScrollLeft
307
472
  }
308
-
309
- // 触发本地排序或远程排序事件
310
- localSort()
311
- emit('sort-change', { key: sortKey.value, type: sortType.value })
473
+ // 在下一个事件循环重置标志位
474
+ await sleep(0)
475
+ isUpdatingScroll.value = false
312
476
  }
313
477
 
314
- const localSort = () => {
315
- if (!sortType.value) {
316
- tableData.value = [...props.data] // 还原
317
- return
478
+ /**
479
+ * 左侧列表滚动
480
+ * */
481
+ const onLeftScroll = async (e: any) => {
482
+ if (isUpdatingScroll.value) return
483
+
484
+ const newScrollTop = e.detail.scrollTop
485
+ if (Math.abs(newScrollTop - scrollTop.value) > 1) {
486
+ isUpdatingScroll.value = true
487
+ scrollTop.value = newScrollTop
488
+ // 在下一个事件循环重置标志位
489
+ await sleep(0)
490
+ isUpdatingScroll.value = false
318
491
  }
492
+ }
493
+
494
+ /**
495
+ * 右侧列表滚动
496
+ * */
497
+ const onRightScroll = async (e: any) => {
498
+ if (isUpdatingScroll.value) return
319
499
 
320
- tableData.value.sort((a, b) => {
321
- const valA = a[sortKey.value]
322
- const valB = b[sortKey.value]
500
+ const newScrollTop = e.detail.scrollTop
501
+ if (Math.abs(newScrollTop - scrollTop.value) > 1) {
502
+ isUpdatingScroll.value = true
503
+ scrollTop.value = newScrollTop
504
+ // 在下一个事件循环重置标志位
505
+ await sleep(0)
506
+ isUpdatingScroll.value = false
507
+ }
508
+ }
323
509
 
324
- // 简单的数字和字符串比较
325
- if (valA === valB) return 0
510
+ /**
511
+ * 点击排序
512
+ * @param col 列标题
513
+ * @param sort 排序
514
+ * */
515
+ const handleSort = (col: ITableColumn, sort?: 'asc' | 'desc') => {
516
+ if (!col.sortable) return
326
517
 
327
- let result = 0
328
- if (typeof valA === 'number' && typeof valB === 'number') {
329
- result = valA - valB
518
+ if (sort) {
519
+ sortOrder.value = sort
520
+ sortField.value = col.key
521
+ } else {
522
+ if (sortField.value === col.key) {
523
+ sortOrder.value = sortOrder.value === 'asc' ? 'desc' : 'asc'
330
524
  } else {
331
- result = String(valA).localeCompare(String(valB))
525
+ sortField.value = col.key
526
+ sortOrder.value = 'asc'
332
527
  }
528
+ }
333
529
 
334
- return sortType.value === 'asc' ? result : -result
335
- })
530
+ emit('sort-change', sortField.value, sortOrder.value)
336
531
  }
337
532
 
338
- // --- 交互逻辑 ---
339
- const handleRowClick = (row: any, index: number) => {
533
+ /**
534
+ * 点击单元格
535
+ * @param row 行数据
536
+ * @param index 第几列
537
+ * */
538
+ const onCellClick = (row: AnyObject, index: number) => {
340
539
  emit('row-click', row, index)
341
540
  }
342
541
 
343
- // 处理单元格点击(主要用于Tooltip)
344
- const handleCellClick = (row: any, col: ITableColumn) => {
345
- // 如果开启了 tooltip,显示完整内容
346
- if (col.tooltip && col.ellipsis) {
347
- const content = row[col.key]
348
- if (content) {
349
- uni.showToast({ title: String(content), icon: 'none' })
350
- }
351
- }
352
- emit('cell-click', row, col)
353
- }
542
+ // 初始化行高
543
+ onMounted(() => {
544
+ rowHeights.value = new Array(props.data.length).fill(props.rowHeight)
545
+ })
546
+
547
+ // 监听数据变化
548
+ watch(
549
+ () => props.data,
550
+ () => {
551
+ rowHeights.value = new Array(props.data.length).fill(props.rowHeight)
552
+ },
553
+ { deep: true }
554
+ )
354
555
  </script>
355
556
 
356
- <style lang="scss" scoped>
557
+ <style scoped lang="scss">
357
558
  @import './index.scss';
559
+
560
+ .header-text {
561
+ white-space: nowrap;
562
+ }
563
+
564
+ .sort-icons {
565
+ display: flex;
566
+ flex-direction: column;
567
+ margin-left: 4px;
568
+ }
569
+
570
+ .sort-icon {
571
+ font-size: 10px;
572
+ color: #ccc;
573
+ line-height: 0.8;
574
+ }
575
+
576
+ .sort-icon.active {
577
+ color: #1890ff;
578
+ }
358
579
  </style>