vite-uni-dev-tool 0.0.48 → 1.0.0

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 (292) hide show
  1. package/README.md +20 -0
  2. package/dist/const.cjs +1 -0
  3. package/dist/const.d.ts +78 -161
  4. package/dist/const.d.ts.map +1 -1
  5. package/dist/const.js +1 -47
  6. package/dist/core-shared.d.ts +44 -0
  7. package/dist/core-shared.d.ts.map +1 -0
  8. package/dist/core-shared.js +1 -0
  9. package/dist/core.d.ts +2 -40
  10. package/dist/core.d.ts.map +1 -1
  11. package/dist/core.js +4 -159
  12. package/dist/i18n/index.cjs +1 -0
  13. package/dist/i18n/index.d.ts +9 -0
  14. package/dist/i18n/index.d.ts.map +1 -0
  15. package/dist/i18n/index.js +1 -0
  16. package/dist/i18n/instance.cjs +1 -0
  17. package/dist/i18n/instance.d.ts +15 -0
  18. package/dist/i18n/instance.d.ts.map +1 -0
  19. package/dist/i18n/instance.js +1 -0
  20. package/dist/i18n/locales/en.cjs +1 -0
  21. package/dist/i18n/locales/en.d.ts +470 -0
  22. package/dist/i18n/locales/en.d.ts.map +1 -0
  23. package/dist/i18n/locales/en.js +1 -0
  24. package/dist/i18n/locales/zh-Hans.cjs +1 -0
  25. package/dist/i18n/locales/zh-Hans.d.ts +476 -0
  26. package/dist/i18n/locales/zh-Hans.d.ts.map +1 -0
  27. package/dist/i18n/locales/zh-Hans.js +1 -0
  28. package/dist/index.cjs +1 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +1 -1
  31. package/dist/modules/devConsole/index.cjs +4 -0
  32. package/dist/{devConsole → modules/devConsole}/index.d.ts +1 -1
  33. package/dist/modules/devConsole/index.d.ts.map +1 -0
  34. package/dist/modules/devConsole/index.js +4 -0
  35. package/dist/modules/devEvent/index.cjs +5 -0
  36. package/dist/modules/devEvent/index.d.ts +115 -0
  37. package/dist/modules/devEvent/index.d.ts.map +1 -0
  38. package/dist/modules/devEvent/index.js +5 -0
  39. package/dist/modules/devIntercept/index.cjs +13 -0
  40. package/dist/modules/devIntercept/index.d.ts +71 -0
  41. package/dist/modules/devIntercept/index.d.ts.map +1 -0
  42. package/dist/modules/devIntercept/index.js +13 -0
  43. package/dist/modules/devStore/index.cjs +1 -0
  44. package/dist/modules/devStore/index.d.ts +159 -0
  45. package/dist/modules/devStore/index.d.ts.map +1 -0
  46. package/dist/modules/devStore/index.js +1 -0
  47. package/dist/modules/devToolInfo/index.cjs +1 -0
  48. package/dist/modules/devToolInfo/index.d.ts +27 -0
  49. package/dist/modules/devToolInfo/index.d.ts.map +1 -0
  50. package/dist/modules/devToolInfo/index.js +1 -0
  51. package/dist/plugins/uniDevTool/transform/transformApp.cjs +44 -0
  52. package/dist/plugins/uniDevTool/transform/transformApp.d.ts.map +1 -1
  53. package/dist/plugins/uniDevTool/transform/transformApp.js +17 -17
  54. package/dist/plugins/uniDevTool/transform/transformMain.cjs +3 -0
  55. package/dist/plugins/uniDevTool/transform/transformMain.d.ts.map +1 -1
  56. package/dist/plugins/uniDevTool/transform/transformMain.js +3 -3
  57. package/dist/plugins/uniDevTool/transform/transformVue.cjs +41 -0
  58. package/dist/plugins/uniDevTool/transform/transformVue.d.ts +1 -2
  59. package/dist/plugins/uniDevTool/transform/transformVue.d.ts.map +1 -1
  60. package/dist/plugins/uniDevTool/transform/transformVue.js +32 -19
  61. package/dist/plugins/uniDevTool/uniDevTool.cjs +5 -0
  62. package/dist/plugins/uniDevTool/uniDevTool.d.ts +3 -11
  63. package/dist/plugins/uniDevTool/uniDevTool.d.ts.map +1 -1
  64. package/dist/plugins/uniDevTool/uniDevTool.js +3 -3
  65. package/dist/plugins/uniGlobalComponents/uniGlobalComponents.cjs +19 -0
  66. package/dist/plugins/uniGlobalComponents/uniGlobalComponents.d.ts.map +1 -1
  67. package/dist/plugins/uniGlobalComponents/uniGlobalComponents.js +11 -19
  68. package/dist/plugins/uniParseStock/index.d.ts +10 -0
  69. package/dist/plugins/uniParseStock/index.d.ts.map +1 -0
  70. package/dist/plugins/utils/index.cjs +2 -0
  71. package/dist/plugins/utils/index.d.ts +1 -3
  72. package/dist/plugins/utils/index.d.ts.map +1 -1
  73. package/dist/plugins/utils/index.js +2 -2
  74. package/dist/shims-uni.d.ts +140 -0
  75. package/dist/type.d.ts +174 -16
  76. package/dist/type.d.ts.map +1 -1
  77. package/dist/utils/array.cjs +1 -0
  78. package/dist/utils/array.d.ts.map +1 -1
  79. package/dist/utils/array.js +1 -12
  80. package/dist/utils/date.cjs +1 -0
  81. package/dist/utils/date.d.ts.map +1 -1
  82. package/dist/utils/date.js +1 -59
  83. package/dist/utils/file.cjs +1 -0
  84. package/dist/utils/file.d.ts.map +1 -1
  85. package/dist/utils/file.js +1 -85
  86. package/dist/utils/function.cjs +1 -0
  87. package/dist/utils/function.d.ts +13 -0
  88. package/dist/utils/function.d.ts.map +1 -1
  89. package/dist/utils/function.js +1 -68
  90. package/dist/utils/index.cjs +1 -0
  91. package/dist/utils/index.d.ts.map +1 -1
  92. package/dist/utils/index.js +1 -63
  93. package/dist/utils/ip.cjs +1 -0
  94. package/dist/utils/ip.d.ts +1 -1
  95. package/dist/utils/ip.d.ts.map +1 -1
  96. package/dist/utils/ip.js +1 -45
  97. package/dist/utils/language.cjs +1 -0
  98. package/dist/utils/language.d.ts +2 -1
  99. package/dist/utils/language.d.ts.map +1 -1
  100. package/dist/utils/language.js +1 -63
  101. package/dist/utils/object.cjs +1 -0
  102. package/dist/utils/object.d.ts +4 -5
  103. package/dist/utils/object.d.ts.map +1 -1
  104. package/dist/utils/object.js +1 -136
  105. package/dist/utils/openLink.cjs +1 -0
  106. package/dist/utils/openLink.d.ts.map +1 -1
  107. package/dist/utils/openLink.js +1 -28
  108. package/dist/utils/page.cjs +1 -0
  109. package/dist/utils/page.d.ts.map +1 -1
  110. package/dist/utils/page.js +1 -7
  111. package/dist/utils/platform.cjs +1 -0
  112. package/dist/utils/platform.d.ts.map +1 -1
  113. package/dist/utils/platform.js +1 -17
  114. package/dist/utils/string.cjs +1 -0
  115. package/dist/utils/string.d.ts.map +1 -1
  116. package/dist/utils/string.js +1 -114
  117. package/dist/utils/utils.cjs +1 -0
  118. package/dist/utils/utils.d.ts +1 -1
  119. package/dist/utils/utils.d.ts.map +1 -1
  120. package/dist/utils/utils.js +1 -126
  121. package/dist/v3/AppTransition/index.vue +170 -0
  122. package/dist/v3/AutoSizer/index.vue +4 -5
  123. package/dist/v3/AutoSizer/index1.vue +4 -6
  124. package/dist/v3/AutoSizer/utils.ts +1 -1
  125. package/dist/v3/CaptureScreen/index.vue +19 -8
  126. package/dist/v3/CircularButton/index.vue +64 -13
  127. package/dist/v3/ConsoleList/ConsoleItem.vue +56 -5
  128. package/dist/v3/ConsoleList/RunJSInput.vue +10 -6
  129. package/dist/v3/ConsoleList/index.vue +51 -35
  130. package/dist/v3/CustomSwiper/CustomSwiperItem.vue +49 -0
  131. package/dist/v3/CustomSwiper/index.vue +104 -0
  132. package/dist/v3/DevTool/fps-collector.render.ts +148 -0
  133. package/dist/v3/DevTool/index.vue +209 -102
  134. package/dist/v3/DevToolButton/index.vue +40 -59
  135. package/dist/v3/DevToolTitle/index.vue +4 -1
  136. package/dist/v3/DevToolWindow/DevToolOverlay.vue +182 -0
  137. package/dist/v3/DevToolWindow/const.ts +47 -69
  138. package/dist/v3/DevToolWindow/hooks/dataUtils.ts +48 -0
  139. package/dist/v3/DevToolWindow/hooks/useDevToolData.ts +338 -0
  140. package/dist/v3/DevToolWindow/hooks/useDevToolHandlers.ts +549 -0
  141. package/dist/v3/DevToolWindow/hooks/useDevToolOverlay.ts +184 -0
  142. package/dist/v3/DevToolWindow/index.css +89 -0
  143. package/dist/v3/DevToolWindow/index.vue +800 -1450
  144. package/dist/v3/DraggableContainer/index.vue +456 -0
  145. package/dist/v3/ElEvent/ElEventItem.vue +4 -3
  146. package/dist/v3/ElEvent/index.vue +26 -9
  147. package/dist/v3/Empty/index.vue +1 -0
  148. package/dist/v3/FilterInput/index.vue +8 -22
  149. package/dist/v3/FilterSelect/index.vue +37 -24
  150. package/dist/v3/Instance/components/InstanceTreeNode.vue +265 -0
  151. package/dist/v3/Instance/flatten.ts +226 -0
  152. package/dist/v3/Instance/index.vue +94 -0
  153. package/dist/v3/Instance/registry.ts +49 -0
  154. package/dist/v3/Instance/transformTree.ts +375 -0
  155. package/dist/v3/Instance/transformTreeCtx.ts +268 -0
  156. package/dist/v3/{InstanceTree → Instance}/typing.d.ts +15 -2
  157. package/dist/v3/InstanceDetail/index.vue +433 -44
  158. package/dist/v3/JsonDetail/index.vue +12 -8
  159. package/dist/v3/JsonPretty/components/Brackets/index.vue +1 -0
  160. package/dist/v3/JsonPretty/components/Carets/index.vue +2 -1
  161. package/dist/v3/JsonPretty/components/CheckController/index.vue +26 -15
  162. package/dist/v3/JsonPretty/components/TreeNode/index.vue +42 -20
  163. package/dist/v3/JsonPretty/index.vue +60 -37
  164. package/dist/v3/JsonPretty/utils/index.ts +41 -44
  165. package/dist/v3/MovableContainer/index.vue +89 -0
  166. package/dist/v3/NFCList/NFCItem.vue +14 -14
  167. package/dist/v3/NFCList/NFCTool.vue +99 -81
  168. package/dist/v3/NFCList/index.vue +14 -10
  169. package/dist/v3/NetworkList/InterceptConfig.vue +154 -364
  170. package/dist/v3/NetworkList/InterceptItem.vue +14 -6
  171. package/dist/v3/NetworkList/NetworkDetail.vue +34 -29
  172. package/dist/v3/NetworkList/NetworkIntercept.vue +11 -8
  173. package/dist/v3/NetworkList/NetworkItem.vue +27 -11
  174. package/dist/v3/NetworkList/NetworkSend.vue +132 -290
  175. package/dist/v3/NetworkList/hooks/useNetworkForm.ts +86 -0
  176. package/dist/v3/NetworkList/index.vue +32 -24
  177. package/dist/v3/NetworkList/utils.ts +101 -0
  178. package/dist/v3/Performance/index.vue +495 -0
  179. package/dist/v3/Performance/modules/PerformanceMetrics.vue +153 -0
  180. package/dist/v3/Performance/modules/PerformanceWidget.vue +249 -0
  181. package/dist/v3/Performance/modules/usePerformanceChart.ts +460 -0
  182. package/dist/v3/Performance/modules/usePerformanceData.ts +258 -0
  183. package/dist/v3/Pick/index.vue +322 -0
  184. package/dist/v3/PiniaList/index.vue +38 -17
  185. package/dist/v3/RouteList/index.vue +32 -15
  186. package/dist/v3/RunJS/index.vue +30 -10
  187. package/dist/v3/ScanCodeList/ScanCodeItem.vue +2 -9
  188. package/dist/v3/ScanCodeList/index.vue +12 -9
  189. package/dist/v3/SettingButton/index.vue +45 -0
  190. package/dist/v3/SettingList/index.css +120 -0
  191. package/dist/v3/SettingList/index.vue +96 -537
  192. package/dist/v3/SettingList/modules/SettingDevTool.vue +208 -0
  193. package/dist/v3/SettingList/modules/SettingInfo.vue +119 -0
  194. package/dist/v3/SettingList/modules/SettingLanguage.vue +74 -0
  195. package/dist/v3/SettingList/modules/SettingLog.vue +230 -0
  196. package/dist/v3/SettingList/modules/SettingNetwork.vue +120 -0
  197. package/dist/v3/SettingList/modules/SettingTheme.vue +312 -0
  198. package/dist/v3/SourceCode/Line.vue +15 -2
  199. package/dist/v3/SourceCode/index.vue +25 -24
  200. package/dist/v3/SourceCode/parseCode.ts +114 -56
  201. package/dist/v3/StorageList/index.vue +33 -33
  202. package/dist/v3/Tabs/index.vue +31 -28
  203. package/dist/v3/Tag/index.vue +39 -20
  204. package/dist/v3/TransferList/TransferDetail.vue +268 -0
  205. package/dist/v3/TransferList/TransferItem.vue +125 -0
  206. package/dist/v3/TransferList/index.vue +181 -0
  207. package/dist/v3/UniEvent/UniEventItem.vue +1 -0
  208. package/dist/v3/UniEvent/index.vue +28 -29
  209. package/dist/v3/{VirtualListPro → VirtualList}/AutoSize.vue +1 -1
  210. package/dist/v3/VirtualList/index.vue +382 -82
  211. package/dist/v3/VuexList/index.vue +38 -17
  212. package/dist/v3/WebSocket/WebSocketDetail.vue +142 -80
  213. package/dist/v3/WebSocket/WebSocketItem.vue +10 -4
  214. package/dist/v3/WebSocket/index.vue +44 -30
  215. package/dist/v3/hooks/useNFC/index.ts +6 -6
  216. package/dist/v3/hooks/useNFC/typing.d.ts +2 -2
  217. package/dist/v3/hooks/useNFC/useNFCAndroid.ts +215 -626
  218. package/dist/v3/hooks/useNFC/useNFCMpWeiXin.ts +54 -85
  219. package/dist/v3/hooks/useNFC/utils.ts +3 -3
  220. package/dist/v3/hooks/useRequest/index.ts +2 -2
  221. package/dist/v3/hooks/useScanCode/index.ts +10 -8
  222. package/dist/v3/styles/theme.css +290 -0
  223. package/dist/v3/styles/theme.ts +12 -0
  224. package/package.json +25 -5
  225. package/dist/devConsole/index.d.ts.map +0 -1
  226. package/dist/devConsole/index.js +0 -273
  227. package/dist/devEvent/index.d.ts +0 -328
  228. package/dist/devEvent/index.d.ts.map +0 -1
  229. package/dist/devEvent/index.js +0 -697
  230. package/dist/devEventBus/index.d.ts +0 -42
  231. package/dist/devEventBus/index.d.ts.map +0 -1
  232. package/dist/devEventBus/index.js +0 -70
  233. package/dist/devIntercept/index.d.ts +0 -281
  234. package/dist/devIntercept/index.d.ts.map +0 -1
  235. package/dist/devIntercept/index.js +0 -949
  236. package/dist/devRunJS/index.d.ts +0 -67
  237. package/dist/devRunJS/index.d.ts.map +0 -1
  238. package/dist/devStore/index.d.ts +0 -199
  239. package/dist/devStore/index.d.ts.map +0 -1
  240. package/dist/devStore/index.js +0 -562
  241. package/dist/devToolInfo/index.d.ts +0 -17
  242. package/dist/devToolInfo/index.d.ts.map +0 -1
  243. package/dist/devToolInfo/index.js +0 -15
  244. package/dist/v3/AutoSizer/utils.d.ts +0 -5
  245. package/dist/v3/AutoSizer/utils.d.ts.map +0 -1
  246. package/dist/v3/ConsoleList/staticTips.d.ts +0 -13
  247. package/dist/v3/ConsoleList/staticTips.d.ts.map +0 -1
  248. package/dist/v3/DevToolWindow/const.d.ts +0 -46
  249. package/dist/v3/DevToolWindow/const.d.ts.map +0 -1
  250. package/dist/v3/InstanceTree/components/InstanceTreeNode.vue +0 -81
  251. package/dist/v3/InstanceTree/flatten.d.ts +0 -10
  252. package/dist/v3/InstanceTree/flatten.d.ts.map +0 -1
  253. package/dist/v3/InstanceTree/flatten.ts +0 -75
  254. package/dist/v3/InstanceTree/index.vue +0 -51
  255. package/dist/v3/InstanceTree/transformTree.d.ts +0 -17
  256. package/dist/v3/InstanceTree/transformTree.d.ts.map +0 -1
  257. package/dist/v3/InstanceTree/transformTree.ts +0 -237
  258. package/dist/v3/JsonPretty/hooks/useClipboard.d.ts +0 -4
  259. package/dist/v3/JsonPretty/hooks/useClipboard.d.ts.map +0 -1
  260. package/dist/v3/JsonPretty/hooks/useError.d.ts +0 -8
  261. package/dist/v3/JsonPretty/hooks/useError.d.ts.map +0 -1
  262. package/dist/v3/JsonPretty/type.d.ts +0 -94
  263. package/dist/v3/JsonPretty/type.d.ts.map +0 -1
  264. package/dist/v3/JsonPretty/utils/index.d.ts +0 -10
  265. package/dist/v3/JsonPretty/utils/index.d.ts.map +0 -1
  266. package/dist/v3/NFCList/const.d.ts +0 -13
  267. package/dist/v3/NFCList/const.d.ts.map +0 -1
  268. package/dist/v3/NetworkList/const.d.ts +0 -5
  269. package/dist/v3/NetworkList/const.d.ts.map +0 -1
  270. package/dist/v3/SourceCode/parseCode.d.ts +0 -27
  271. package/dist/v3/SourceCode/parseCode.d.ts.map +0 -1
  272. package/dist/v3/UploadList/UploadDetail.vue +0 -255
  273. package/dist/v3/UploadList/UploadItem.vue +0 -122
  274. package/dist/v3/UploadList/index.vue +0 -125
  275. package/dist/v3/VirtualListPro/index.vue +0 -229
  276. package/dist/v3/hooks/useContainerStyle.d.ts +0 -15
  277. package/dist/v3/hooks/useContainerStyle.d.ts.map +0 -1
  278. package/dist/v3/hooks/useNFC/index.d.ts +0 -5
  279. package/dist/v3/hooks/useNFC/index.d.ts.map +0 -1
  280. package/dist/v3/hooks/useNFC/useNFCAndroid.d.ts +0 -2
  281. package/dist/v3/hooks/useNFC/useNFCAndroid.d.ts.map +0 -1
  282. package/dist/v3/hooks/useNFC/useNFCMpWeiXin.d.ts +0 -2
  283. package/dist/v3/hooks/useNFC/useNFCMpWeiXin.d.ts.map +0 -1
  284. package/dist/v3/hooks/useNFC/utils.d.ts +0 -95
  285. package/dist/v3/hooks/useNFC/utils.d.ts.map +0 -1
  286. package/dist/v3/hooks/useRequest/index.d.ts +0 -126
  287. package/dist/v3/hooks/useRequest/index.d.ts.map +0 -1
  288. package/dist/v3/hooks/useRequest/utils.d.ts +0 -35
  289. package/dist/v3/hooks/useRequest/utils.d.ts.map +0 -1
  290. package/dist/v3/hooks/useScanCode/index.d.ts +0 -36
  291. package/dist/v3/hooks/useScanCode/index.d.ts.map +0 -1
  292. /package/dist/v3/{VirtualListPro → VirtualList}/readme.md +0 -0
@@ -1,89 +1,82 @@
1
1
  <template>
2
2
  <view class="uni-event-content">
3
- <DevToolTitle customStyle="padding: 0 16px">事件触发统计</DevToolTitle>
3
+ <DevToolTitle customStyle="padding: 0 16px">
4
+ {{ t('uniEvent.title') }}
5
+ </DevToolTitle>
4
6
  <view class="uni-event-statistics">
5
7
  <view class="uni-event-statistics-item">
6
- <view class="uni-event-statistics-item-name">on: </view>
8
+ <view class="uni-event-statistics-item-name">on:</view>
7
9
  <Tag
8
10
  mode="log"
9
11
  style="flex: 1"
10
- customStyle="display:flex; flex: 1; justify-content: center; width: 100%;"
11
- >
12
+ customStyle="display:flex; flex: 1; justify-content: center; width: 100%;">
12
13
  {{ eventCount?.on ?? 0 }}
13
14
  </Tag>
14
15
  </view>
15
16
  <view class="uni-event-statistics-item">
16
- <view class="uni-event-statistics-item-name">once: </view>
17
+ <view class="uni-event-statistics-item-name">once:</view>
17
18
  <Tag
18
19
  mode="warn"
19
20
  style="flex: 1"
20
- customStyle="display:flex; flex: 1; justify-content: center; width: 100%;"
21
- >
21
+ customStyle="display:flex; flex: 1; justify-content: center; width: 100%;">
22
22
  {{ eventCount?.once ?? 0 }}
23
23
  </Tag>
24
24
  </view>
25
25
  <view class="uni-event-statistics-item">
26
- <view class="uni-event-statistics-item-name">emit: </view>
26
+ <view class="uni-event-statistics-item-name">emit:</view>
27
27
  <Tag
28
28
  mode="main"
29
29
  style="flex: 1"
30
- customStyle="display:flex; flex: 1; justify-content: center; width: 100%;"
31
- >
30
+ customStyle="display:flex; flex: 1; justify-content: center; width: 100%;">
32
31
  {{ eventCount?.emit ?? 0 }}
33
32
  </Tag>
34
33
  </view>
35
34
  <view class="uni-event-statistics-item">
36
- <view class="uni-event-statistics-item-name">off: </view>
35
+ <view class="uni-event-statistics-item-name">off:</view>
37
36
  <Tag
38
37
  mode="error"
39
38
  style="flex: 1"
40
- customStyle="display:flex; flex: 1; justify-content: center; width: 100%;"
41
- >
39
+ customStyle="display:flex; flex: 1; justify-content: center; width: 100%;">
42
40
  {{ eventCount?.off ?? 0 }}
43
41
  </Tag>
44
42
  </view>
45
43
  </view>
46
44
  <DevToolTitle customStyle="padding: 0 16px">
47
- 事件触发列表
45
+ {{ t('uniEvent.eventList') }}
48
46
  <Tag
49
47
  mode="clear"
50
48
  style="margin-left: auto"
51
49
  customStyle="margin-left: auto"
52
- @click="emit('clear')"
53
- >
54
- 清空
50
+ @click="emit('clear')">
51
+ {{ t('common.clear') }}
55
52
  </Tag>
56
53
  </DevToolTitle>
57
54
 
58
- <VirtualListPro
55
+ <VirtualList
59
56
  v-if="uniEventList && uniEventList?.length > 0"
60
57
  class="uni-event-list"
61
58
  scrollX
62
- virtual
63
59
  :pageSize="20"
64
60
  :height="contentHeight - 32 * 4"
65
61
  :data="uniEventList"
66
- :scrollWithAnimation="true"
67
- >
62
+ :scrollWithAnimation="true">
68
63
  <template #default="{ list, start, itemsHeight, onSizeChange }">
69
64
  <AutoSize
70
65
  v-for="(item, index) in list"
71
66
  :key="start + index"
72
67
  :index="start + index"
73
68
  :itemsHeight="itemsHeight"
74
- :onSizeChange="onSizeChange"
75
- >
69
+ :onSizeChange="onSizeChange">
76
70
  <UniEventItem
77
71
  :eventItem="item"
78
72
  :mode="mode"
79
73
  :useDevSource="useDevSource"
80
74
  :sourceFileServers="sourceFileServers"
81
75
  :zIndex="zIndex"
82
- @openCode="emit('openCode', $event)"
83
- />
76
+ @openCode="emit('openCode', $event)" />
84
77
  </AutoSize>
85
78
  </template>
86
- </VirtualListPro>
79
+ </VirtualList>
87
80
 
88
81
  <Empty v-else />
89
82
  </view>
@@ -93,9 +86,12 @@ import DevToolTitle from '../DevToolTitle/index.vue';
93
86
  import UniEventItem from './UniEventItem.vue';
94
87
  import Tag from '../Tag/index.vue';
95
88
  import Empty from '../Empty/index.vue';
96
- import VirtualListPro from '../VirtualListPro/index.vue';
97
- import AutoSize from '../VirtualListPro/AutoSize.vue';
98
- import type { DevTool } from '@/dev/type';
89
+ import VirtualList from '../VirtualList/index.vue';
90
+ import AutoSize from '../VirtualList/AutoSize.vue';
91
+ import type { DevTool } from '../../type';
92
+ import { useI18n } from '../../i18n';
93
+
94
+ const { t } = useI18n();
99
95
 
100
96
  defineProps<{
101
97
  uniEventList?: DevTool.UniEventItem[];
@@ -128,14 +124,17 @@ const emit = defineEmits<{
128
124
  box-sizing: border-box;
129
125
  gap: 12px;
130
126
  }
127
+
131
128
  .uni-event-statistics-item {
132
129
  display: flex;
133
130
  align-items: center;
134
131
  width: 25%;
135
132
  }
133
+
136
134
  .uni-event-statistics-item-name {
137
135
  margin-right: 8px;
138
136
  }
137
+
139
138
  .uni-event-list {
140
139
  height: calc(100% - 32px * 3);
141
140
  overflow: auto;
@@ -10,7 +10,7 @@ import { uniqueId } from '../../utils';
10
10
  const props = defineProps<{
11
11
  index: number;
12
12
  customStyle?: string | Record<string, any>;
13
- itemsHeight: number[];
13
+ itemsHeight: number[] | Record<number, number>;
14
14
  onSizeChange: (index: number, height: number) => void;
15
15
  }>();
16
16
 
@@ -1,112 +1,412 @@
1
1
  <template>
2
- <scroll-view
3
- v-if="autoVirtual"
4
- scroll-y
5
- class="virtual-list"
6
- :style="{
7
- height: `${props.height}px`,
8
- }"
9
- @scroll="onVirtualScroll"
10
- >
11
- <view
12
- class="virtual-list-holder"
13
- :style="{
14
- height: `${props.data.length * props.itemHeight}px`,
15
- }"
16
- >
17
- <view
18
- class="virtual-list-holder-inner"
19
- :style="{
20
- transform: `translateY(${state.translateY}px)`,
21
- }"
22
- >
23
- <slot :list="state.visibleData"></slot>
2
+ <view :class="['virtual-list-wrapper', className]" :style="wrapperStyle">
3
+ <scroll-view
4
+ scroll-y
5
+ :scroll-x="scrollX && !isEdgeSwipe"
6
+ class="virtual-list-scroll"
7
+ :scroll-top="scrollTopVal"
8
+ :scroll-with-animation="scrollWithAnimation"
9
+ :scroll-into-view="scrollIntoView"
10
+ @scroll="handleScroll"
11
+ @touchstart="onTouchStart"
12
+ @touchmove="onTouchMove"
13
+ @touchend="onTouchEnd"
14
+ @mousedown="onMouseDown">
15
+ <!-- 滚动容器:统一负责撑开横向和纵向的滚动区域 -->
16
+ <view class="virtual-list-container" :style="containerStyle">
17
+ <!-- 实际渲染内容的列表块 -->
18
+ <view class="virtual-list-content" :style="contentStyle">
19
+ <view class="virtual-list-measure-inner">
20
+ <slot
21
+ :list="visibleData"
22
+ :startIndex="startIndex"
23
+ :start="startIndex"
24
+ :current="Math.floor(startIndex / props.pageSize) + 1"
25
+ :itemsHeight="itemsHeightMap"
26
+ :onSizeChange="onSizeChange"></slot>
27
+ </view>
28
+ </view>
24
29
  </view>
30
+ </scroll-view>
31
+
32
+ <!-- 返回顶部按钮:移出 scroll-view,绝对定位在 wrapper 内部 -->
33
+ <view
34
+ :style="{ display: showBackTop && scrollTop > 200 ? 'flex' : 'none' }"
35
+ class="virtual-back-top"
36
+ @click="scrollToTop">
37
+
25
38
  </view>
26
- </scroll-view>
27
- <view
28
- v-else
29
- class="normal-list"
30
- :style="{
31
- height: `${props.height}px`,
32
- }"
33
- >
34
- <slot :list="state.visibleData"></slot>
35
39
  </view>
36
40
  </template>
41
+
37
42
  <script lang="ts" setup>
38
- import { computed, onMounted, reactive, watchEffect } from 'vue';
39
- const props = defineProps<{
40
- /** 虚拟列表高度 */
41
- height: number;
42
- /** 每一项高度 */
43
- itemHeight: number;
44
- /** 渲染的数据列表 */
43
+ import {
44
+ ref,
45
+ reactive,
46
+ computed,
47
+ watch,
48
+ nextTick,
49
+ getCurrentInstance,
50
+ onMounted,
51
+ } from 'vue';
52
+
53
+ interface Props {
54
+ /** 渲染数据源 */
45
55
  data: any[];
46
- /** 虚拟列表自动开启行数 */
47
- autoVirtualRow?: number;
56
+ /** 容器高度 */
57
+ height?: number | string;
58
+ /** 每页渲染数量 (虚拟化块大小) */
59
+ pageSize?: number;
60
+ /** 预估的项高度 (用于初次计算) */
61
+ itemHeight?: number;
62
+ /** 额外的缓冲区数量 (防止滚动过快白屏) */
63
+ buffer?: number;
64
+ /** 自定义类名 */
65
+ className?: string;
66
+ /** 是否显示返回顶部 */
67
+ showBackTop?: boolean;
68
+ /** 数据更新时是否自动滚动到顶部 */
69
+ dataChangeScrollToTop?: boolean;
70
+ /** 预加载高度 (兼容 Pro) */
71
+ preLodeHeight?: number;
72
+ /** 默认当前页 (从 1 开始) */
73
+ defaultCurrent?: number;
74
+ /** 横向滚动 */
75
+ scrollX?: boolean;
76
+ /** 滚动动画 */
77
+ scrollWithAnimation?: boolean;
78
+ /** 滚动到指定元素 ID */
79
+ scrollIntoView?: string;
80
+ }
81
+
82
+ const props = withDefaults(defineProps<Props>(), {
83
+ height: '100%',
84
+ pageSize: 20,
85
+ itemHeight: 50,
86
+ buffer: 5,
87
+ showBackTop: true,
88
+ dataChangeScrollToTop: true,
89
+ preLodeHeight: 100,
90
+ defaultCurrent: 1,
91
+ scrollX: false,
92
+ scrollWithAnimation: false,
93
+ scrollIntoView: '',
94
+ });
95
+
96
+ const emit = defineEmits(['scroll']);
97
+
98
+ /** 定义插槽类型 */
99
+ defineSlots<{
100
+ default(props: {
101
+ /** 当前可见数据列表 */
102
+ list: any[];
103
+ /** 起始索引 (绝对索引) */
104
+ startIndex: number;
105
+ /** 起始索引 (别名,同 startIndex) */
106
+ start: number;
107
+ /** 当前页码 (基于 startIndex 和 pageSize 计算) */
108
+ current: number;
109
+ /** 各项高度映射记录 */
110
+ itemsHeight: Record<number, number>;
111
+ /** 子项尺寸变化回调 */
112
+ onSizeChange: (index: number, height: number) => void;
113
+ }): any;
48
114
  }>();
49
115
 
50
- const state = reactive<{ translateY: number; visibleData: any[] }>({
51
- translateY: 0,
52
- visibleData: [],
116
+ // --- 状态变量 ---
117
+ const scrollTop = ref(0);
118
+ const scrollTopVal = ref(0); // 用于控制转跳的响应式值
119
+ const startIndex = ref(0);
120
+ const itemsHeightMap = reactive<Record<number, number>>({}); // 存储每一项的实际高度
121
+
122
+ const isEdgeSwipe = ref(false);
123
+ const isCapturing = ref(false); // 是否由当前列表锁定捕获手势
124
+ let containerRect = { left: 0, right: 0, width: 0 };
125
+
126
+ const instance = getCurrentInstance();
127
+ const maxWidth = ref(0);
128
+
129
+ onMounted(() => {
130
+ // 获取容器位置和宽度,用于边缘检测
131
+ uni
132
+ .createSelectorQuery()
133
+ .in(instance)
134
+ .select('.virtual-list-wrapper')
135
+ .boundingClientRect((data: any) => {
136
+ if (data) {
137
+ containerRect = data;
138
+ }
139
+ })
140
+ .exec();
141
+ });
142
+
143
+ function onTouchStart(e: TouchEvent | MouseEvent) {
144
+ if (!props.scrollX) return;
145
+ const touch = (e as TouchEvent).touches
146
+ ? (e as TouchEvent).touches[0]
147
+ : (e as MouseEvent);
148
+ const x = touch.clientX;
149
+
150
+ // 如果从边缘 40px 内开始滑动,则视为侧滑切换 Tab,允许事件冒泡到父级
151
+ const threshold = 40;
152
+ if (
153
+ x < containerRect.left + threshold ||
154
+ x > containerRect.right - threshold
155
+ ) {
156
+ isEdgeSwipe.value = true;
157
+ isCapturing.value = false;
158
+ } else {
159
+ isEdgeSwipe.value = false;
160
+ isCapturing.value = true;
161
+ // 重要:锁定在此,阻止事件冒泡到 CustomSwiper
162
+ e.stopPropagation();
163
+ }
164
+ }
165
+
166
+ function onTouchMove(e: TouchEvent) {
167
+ if (isCapturing.value) {
168
+ // 已经锁定时,继续阻止冒泡,确保父级不会触发滑屏逻辑
169
+ e.stopPropagation();
170
+ }
171
+ }
172
+
173
+ function onTouchEnd(e: TouchEvent | MouseEvent) {
174
+ if (isCapturing.value) {
175
+ e.stopPropagation();
176
+ }
177
+ isCapturing.value = false;
178
+ isEdgeSwipe.value = false;
179
+ }
180
+
181
+ function onMouseDown(e: MouseEvent) {
182
+ onTouchStart(e);
183
+ }
184
+
185
+ // 根据 defaultCurrent 初始化位置
186
+ if (props.defaultCurrent > 1) {
187
+ startIndex.value = Math.max(0, (props.defaultCurrent - 1) * props.pageSize);
188
+ }
189
+ const offset = ref(0);
190
+
191
+ // 初始化 offset
192
+ if (startIndex.value > 0) {
193
+ let initialOffset = 0;
194
+ for (let i = 0; i < startIndex.value; i++) {
195
+ initialOffset += itemsHeightMap[i] || props.itemHeight;
196
+ }
197
+ offset.value = initialOffset;
198
+ }
199
+
200
+ // --- 计算属性 ---
201
+ // 外层容器样式
202
+ const wrapperStyle = computed(
203
+ () =>
204
+ ({
205
+ height:
206
+ typeof props.height === 'number' ? `${props.height}px` : props.height,
207
+ position: 'relative' as const,
208
+ overflow: 'hidden' as const,
209
+ }) as any,
210
+ );
211
+
212
+ // 计算总高度:已测量的高度 + 未测量的默认高度
213
+ const totalHeight = computed(() => {
214
+ let total = 0;
215
+ for (let i = 0; i < props.data.length; i++) {
216
+ total += itemsHeightMap[i] || props.itemHeight;
217
+ }
218
+ return total;
219
+ });
220
+
221
+ // 可见数据切片
222
+ const visibleData = computed(() => {
223
+ // 我们多渲染一点,避免滚动白屏
224
+ const end = Math.min(
225
+ startIndex.value + props.pageSize + props.buffer,
226
+ props.data.length,
227
+ );
228
+ return props.data.slice(startIndex.value, end);
53
229
  });
54
230
 
55
- const autoVirtual = computed(() => {
56
- if (typeof props.autoVirtualRow === 'number') {
57
- if (props.data.length > props.autoVirtualRow) {
58
- return true;
231
+ // 滚动容器样式 (撑开滚动区域的核心)
232
+ const containerStyle = computed(() => {
233
+ const style: any = {
234
+ height: `${totalHeight.value}px`,
235
+ position: 'relative',
236
+ width: '100%',
237
+ };
238
+ if (props.scrollX) {
239
+ if (maxWidth.value) {
240
+ style.minWidth = `${maxWidth.value}px`;
59
241
  }
60
- return false;
61
242
  }
62
- return true;
243
+ return style;
63
244
  });
64
245
 
65
- function updateVisibleData(scrollTop: number = 0) {
66
- const flatDataValue = props.data ?? [];
67
- if (autoVirtual.value) {
68
- const visibleCount = props.height / props.itemHeight;
69
- const scrollCount = Math.floor(scrollTop / props.itemHeight);
70
- let start =
71
- scrollCount < 0
72
- ? 0
73
- : scrollCount + visibleCount > flatDataValue.length
74
- ? flatDataValue.length - visibleCount
75
- : scrollCount;
76
- if (start < 0) {
77
- start = 0;
246
+ // 内容块样式
247
+ const contentStyle = computed(() => {
248
+ return {
249
+ transform: `translateY(${offset.value}px)`,
250
+ position: 'absolute' as const,
251
+ left: 0,
252
+ top: 0,
253
+ width: '100%',
254
+ // minWidth: 'max-content',
255
+ };
256
+ });
257
+
258
+ // --- 方法 ---
259
+
260
+ /**
261
+ * 核心滚动处理函数
262
+ */
263
+ const handleScroll = (e: any) => {
264
+ // Uni-app 环境下 e.detail.scrollTop 可能存在,标准 H5 下是 e.target.scrollTop
265
+ const st = e.detail?.scrollTop ?? e.target?.scrollTop ?? 0;
266
+ scrollTop.value = st;
267
+
268
+ // 根据当前滚动位置计算 startIndex
269
+ let accumulatedHeight = 0;
270
+ let index = -1;
271
+ const dataLen = props.data.length;
272
+
273
+ for (let i = 0; i < dataLen; i++) {
274
+ const h = itemsHeightMap[i] || props.itemHeight;
275
+ if (accumulatedHeight + h > st) {
276
+ index = i;
277
+ break;
78
278
  }
79
- const end = start + visibleCount;
80
- state.translateY = start * props.itemHeight;
81
- state.visibleData = state.visibleData = props.data.slice(start, end);
82
- } else {
83
- state.visibleData = flatDataValue;
279
+ accumulatedHeight += h;
84
280
  }
85
- }
86
281
 
87
- function onVirtualScroll(e: { detail: { scrollTop: number } }) {
88
- updateVisibleData(e?.detail?.scrollTop ?? 0);
89
- }
282
+ // 修复核心:如果 st 很大,超过了所有项的高度和,或者刚好在最后,确保 index 不会回滚到 0
283
+ if (index === -1) {
284
+ index = dataLen > 0 ? dataLen - 1 : 0;
285
+ }
286
+
287
+ // 加上缓冲区处理
288
+ const targetIndex = Math.max(0, index - props.buffer);
90
289
 
91
- watchEffect(() => {
92
- if (props.data) {
93
- updateVisibleData();
290
+ // 更新状态
291
+ if (targetIndex !== startIndex.value) {
292
+ startIndex.value = targetIndex;
293
+
294
+ // 计算内容块的偏移量:即渲染起始项之前的全部高度
295
+ let currentOffset = 0;
296
+ for (let i = 0; i < targetIndex; i++) {
297
+ currentOffset += itemsHeightMap[i] || props.itemHeight;
298
+ }
299
+ offset.value = currentOffset;
94
300
  }
301
+
302
+ emit('scroll', e);
303
+ };
304
+
305
+ /**
306
+ * 子项尺寸变化时更新高度映射
307
+ */
308
+ const onSizeChange = (index: number, height: number) => {
309
+ if (height > 0 && itemsHeightMap[index] !== height) {
310
+ itemsHeightMap[index] = height;
311
+ }
312
+ };
313
+
314
+ /**
315
+ * 滚动到指定位置
316
+ */
317
+ const scrollToTop = () => {
318
+ scrollTopVal.value = scrollTop.value; // 先同步一次
319
+ nextTick(() => {
320
+ scrollTopVal.value = 0;
321
+ scrollTop.value = 0;
322
+ });
323
+ };
324
+
325
+ // 暴露 API 给外部使用
326
+ defineExpose({
327
+ scrollToTop,
328
+ itemsHeightMap,
95
329
  });
96
330
 
97
- onMounted(() => {
98
- updateVisibleData();
331
+ /**
332
+ * 更新记录的最大宽度
333
+ */
334
+ const updateMaxWidth = () => {
335
+ if (!props.scrollX) return;
336
+ uni
337
+ .createSelectorQuery()
338
+ .in(instance)
339
+ .select('.virtual-list-measure-inner')
340
+ .boundingClientRect((res: any) => {
341
+ // 只有当检测到更大的宽度时才更新,实现“只增不减”
342
+ if (res && res.width > maxWidth.value) {
343
+ maxWidth.value = res.width;
344
+ }
345
+ })
346
+ .exec();
347
+ };
348
+
349
+ // 监听可见数据变化,更新最大宽度
350
+ watch(visibleData, () => {
351
+ nextTick(() => {
352
+ updateMaxWidth();
353
+ });
99
354
  });
355
+
356
+ // 数据变化处理
357
+ watch(
358
+ () => props.data,
359
+ () => {
360
+ if (props.dataChangeScrollToTop) {
361
+ maxWidth.value = 0; // 只有在需要回到顶部(彻底换数据)时才重置宽度
362
+ scrollToTop();
363
+ // 数据重置时,立即更新内部索引,防止旧位置引起的白屏
364
+ startIndex.value = 0;
365
+ offset.value = 0;
366
+ scrollTop.value = 0;
367
+ }
368
+ },
369
+ { deep: false },
370
+ );
100
371
  </script>
372
+
101
373
  <style scoped>
102
- .normal-list,
103
- .virtual-list {
104
- position: relative;
374
+ .virtual-list-wrapper {
375
+ box-sizing: border-box;
376
+ }
377
+
378
+ .virtual-list-scroll {
105
379
  width: 100%;
106
- overflow: auto;
380
+ height: 100%;
381
+ }
382
+
383
+ .virtual-list-measure-inner {
384
+ /* width: max-content; */
385
+ min-width: 100%;
386
+ }
387
+
388
+ .virtual-back-top {
389
+ position: absolute;
390
+ bottom: 24px;
391
+ right: 24px;
392
+ width: 44px;
393
+ height: 44px;
394
+ background-color: var(--dev-tool-main-color, #9254de);
395
+ color: #fff;
396
+ border-radius: 50%;
397
+ display: flex;
398
+ align-items: center;
399
+ justify-content: center;
400
+ box-shadow: 0 4px 12px rgb(0 0 0 / 15%);
401
+ font-size: 20px;
402
+ z-index: 1000;
403
+ cursor: pointer;
404
+ transition:
405
+ opacity 0.3s,
406
+ transform 0.2s;
107
407
  }
108
408
 
109
- .virtual-list-holder {
110
- position: relative;
409
+ .virtual-back-top:active {
410
+ transform: scale(0.9);
111
411
  }
112
412
  </style>