iov-pro-components 0.0.3

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 (133) hide show
  1. package/.eslintignore +5 -0
  2. package/.eslintrc.js +192 -0
  3. package/.gitignore +3 -0
  4. package/README.md +4 -0
  5. package/babel.config.js +5 -0
  6. package/docs/.vuepress/config.js +169 -0
  7. package/docs/.vuepress/styles/index.styl +62 -0
  8. package/docs/.vuepress/styles/palette.styl +20 -0
  9. package/docs/.vuepress/theme/enhanceApp.js +100 -0
  10. package/docs/.vuepress/theme/index.js +3 -0
  11. package/docs/README.md +13 -0
  12. package/docs/components/description.md +519 -0
  13. package/docs/components/dialog-select.md +91 -0
  14. package/docs/components/display.md +36 -0
  15. package/docs/components/enums.md +33 -0
  16. package/docs/components/icon.md +406 -0
  17. package/docs/components/link-group.md +39 -0
  18. package/docs/components/page-detail.md +48 -0
  19. package/docs/components/page-module.md +51 -0
  20. package/docs/components/pro-form.md +958 -0
  21. package/docs/components/pro-table.md +683 -0
  22. package/docs/components/request.md +44 -0
  23. package/docs/components/search-table.md +963 -0
  24. package/docs/components/space.md +35 -0
  25. package/docs/components/sub-title.md +24 -0
  26. package/docs/components/submit-module.md +24 -0
  27. package/docs/template/add.md +124 -0
  28. package/docs/template/confirm.md +28 -0
  29. package/docs/template/detail.md +240 -0
  30. package/docs/template/dialog.md +339 -0
  31. package/docs/template/list.md +464 -0
  32. package/docs/template/tabs-mini.md +32 -0
  33. package/docs/template/tabs.md +32 -0
  34. package/jsconfig.json +19 -0
  35. package/lib/iov-pro-components.css +1 -0
  36. package/lib/iov-pro-components.min.js +7 -0
  37. package/lib/postcss.config.js +8 -0
  38. package/package.json +75 -0
  39. package/patches/vue-server-renderer+2.7.16.patch +13 -0
  40. package/rollup.config.mjs +79 -0
  41. package/src/App.vue +103 -0
  42. package/src/main.js +33 -0
  43. package/src/packages/column-tooltip/index.js +7 -0
  44. package/src/packages/column-tooltip/src/main.vue +127 -0
  45. package/src/packages/description/index.js +7 -0
  46. package/src/packages/description/src/main.vue +375 -0
  47. package/src/packages/description/src/text.vue +103 -0
  48. package/src/packages/dialog-select/index.js +7 -0
  49. package/src/packages/dialog-select/src/main.vue +308 -0
  50. package/src/packages/display/index.js +7 -0
  51. package/src/packages/display/src/main.vue +44 -0
  52. package/src/packages/enums/index.js +7 -0
  53. package/src/packages/enums/src/main.vue +23 -0
  54. package/src/packages/export/index.js +7 -0
  55. package/src/packages/export/src/main.vue +316 -0
  56. package/src/packages/fixed-button-group/index.js +7 -0
  57. package/src/packages/fixed-button-group/src/main.vue +104 -0
  58. package/src/packages/form/index.js +7 -0
  59. package/src/packages/form/src/collapse.vue +149 -0
  60. package/src/packages/form/src/main.vue +1190 -0
  61. package/src/packages/form-collapse/index.js +7 -0
  62. package/src/packages/index.js +86 -0
  63. package/src/packages/link-group/index.js +7 -0
  64. package/src/packages/link-group/src/main.vue +52 -0
  65. package/src/packages/page-detail/index.js +7 -0
  66. package/src/packages/page-detail/src/main.vue +123 -0
  67. package/src/packages/page-module/index.js +7 -0
  68. package/src/packages/page-module/src/main.vue +56 -0
  69. package/src/packages/preview/index.js +7 -0
  70. package/src/packages/preview/src/eval-image-viewer.js +50 -0
  71. package/src/packages/preview/src/image-viewer.vue +366 -0
  72. package/src/packages/preview/src/main.vue +97 -0
  73. package/src/packages/request/index.js +7 -0
  74. package/src/packages/request/src/main.vue +125 -0
  75. package/src/packages/search-table/index.js +7 -0
  76. package/src/packages/search-table/src/inner-tabs.vue +237 -0
  77. package/src/packages/search-table/src/main.vue +472 -0
  78. package/src/packages/search-table/src/outer-tabs.vue +45 -0
  79. package/src/packages/search-table-inner-tabs/index.js +7 -0
  80. package/src/packages/search-table-outer-tabs/index.js +7 -0
  81. package/src/packages/space/index.js +7 -0
  82. package/src/packages/space/src/main.vue +74 -0
  83. package/src/packages/sub-title/index.js +7 -0
  84. package/src/packages/sub-title/src/main.vue +70 -0
  85. package/src/packages/submit-module/index.js +7 -0
  86. package/src/packages/submit-module/src/main.vue +67 -0
  87. package/src/packages/table/index.js +7 -0
  88. package/src/packages/table/src/filter.vue +89 -0
  89. package/src/packages/table/src/main.vue +668 -0
  90. package/src/packages/table/src/search.vue +90 -0
  91. package/src/packages/table/src/sort.vue +118 -0
  92. package/src/packages/theme/index.scss +15 -0
  93. package/src/packages/theme/src/column-tooltip.scss +23 -0
  94. package/src/packages/theme/src/common/color.scss +134 -0
  95. package/src/packages/theme/src/description.scss +56 -0
  96. package/src/packages/theme/src/dialog-select.scss +32 -0
  97. package/src/packages/theme/src/fixed-button-group.scss +25 -0
  98. package/src/packages/theme/src/form.scss +11 -0
  99. package/src/packages/theme/src/link-group.scss +43 -0
  100. package/src/packages/theme/src/page-detail.scss +61 -0
  101. package/src/packages/theme/src/page-module.scss +46 -0
  102. package/src/packages/theme/src/preview.scss +67 -0
  103. package/src/packages/theme/src/search-table.scss +185 -0
  104. package/src/packages/theme/src/space.scss +12 -0
  105. package/src/packages/theme/src/sub-title.scss +47 -0
  106. package/src/packages/theme/src/submit-module.scss +13 -0
  107. package/src/packages/theme/src/table.scss +129 -0
  108. package/src/packages/theme/src/toolbar.scss +109 -0
  109. package/src/packages/toolbar/index.js +7 -0
  110. package/src/packages/toolbar/src/main.vue +126 -0
  111. package/src/packages/toolbar/src/setting.vue +217 -0
  112. package/src/packages/toolbar/src/style.vue +68 -0
  113. package/src/packages/toolbar/src/zoom.vue +65 -0
  114. package/src/router.js +83 -0
  115. package/src/utils/config-center.js +218 -0
  116. package/src/utils/function-eval.js +84 -0
  117. package/src/utils/index.js +104 -0
  118. package/src/views/column-tooltip.vue +37 -0
  119. package/src/views/components/OtherSelect.vue +18 -0
  120. package/src/views/description.vue +60 -0
  121. package/src/views/detail.vue +146 -0
  122. package/src/views/directive/number.js +82 -0
  123. package/src/views/enums.vue +22 -0
  124. package/src/views/export.vue +9 -0
  125. package/src/views/form-collapse.vue +185 -0
  126. package/src/views/form.vue +402 -0
  127. package/src/views/link-group.vue +16 -0
  128. package/src/views/preview.vue +33 -0
  129. package/src/views/request.vue +56 -0
  130. package/src/views/search-table.vue +297 -0
  131. package/src/views/table.vue +145 -0
  132. package/src/views/toolbar.vue +30 -0
  133. package/vue.config.js +22 -0
@@ -0,0 +1,366 @@
1
+ <template>
2
+ <transition name="viewer-fade">
3
+ <div
4
+ ref="el-image-viewer__wrapper"
5
+ tabindex="-1"
6
+ class="image-viewer el-image-viewer__wrapper"
7
+ :style="{ 'z-index': zIndex }"
8
+ >
9
+ <div class="el-image-viewer__mask" />
10
+ <!-- CLOSE -->
11
+ <span
12
+ class="el-image-viewer__btn el-image-viewer__close image-viewer__close"
13
+ @click="hide"
14
+ >
15
+ <i class="iov-icon-close" />
16
+ </span>
17
+ <!-- ARROW -->
18
+ <template v-if="!isSingle">
19
+ <span
20
+ class="el-image-viewer__btn el-image-viewer__prev"
21
+ :class="{ 'is-disabled': isFirst }"
22
+ @click="prev"
23
+ >
24
+ <i
25
+ :class="{ 'is-disabled-icon': isFirst }"
26
+ class="iov-icon-left"
27
+ />
28
+ </span>
29
+ <span
30
+ class="el-image-viewer__btn el-image-viewer__next"
31
+ :class="{ 'is-disabled': isLast }"
32
+ @click="next"
33
+ >
34
+ <i
35
+ :class="{ 'is-disabled-icon': isLast }"
36
+ class="iov-icon-left"
37
+ />
38
+ </span>
39
+ </template>
40
+ <!-- ACTIONS -->
41
+ <div class="el-image-viewer__btn el-image-viewer__actions">
42
+ <div class="el-image-viewer__actions__inner">
43
+ <i
44
+ class="el-icon-zoom-out"
45
+ @click="handleActions('zoomOut')"
46
+ />
47
+ <i
48
+ class="el-icon-zoom-in"
49
+ @click="handleActions('zoomIn')"
50
+ />
51
+ <i
52
+ :class="mode.icon"
53
+ @click="toggleMode"
54
+ />
55
+ <i
56
+ class="el-icon-refresh-left"
57
+ @click="handleActions('anticlocelise')"
58
+ />
59
+ <i
60
+ class="el-icon-refresh-right"
61
+ @click="handleActions('clocelise')"
62
+ />
63
+ </div>
64
+ </div>
65
+ <!-- CANVAS -->
66
+ <div class="el-image-viewer__canvas">
67
+ <template v-for="(item, i) in urlList">
68
+ <img
69
+ v-if="!item.url && i === index "
70
+ ref="img"
71
+ :key="item"
72
+ class="el-image-viewer__img"
73
+ :src="currentImg"
74
+ :style="imgStyle"
75
+ @load="handleImgLoad"
76
+ @error="handleImgError"
77
+ @mousedown="handleMouseDown"
78
+ >
79
+ <section
80
+ v-else
81
+ :key="item.id"
82
+ >
83
+ <img
84
+ v-if="i === index"
85
+ ref="img"
86
+ class="el-image-viewer__img"
87
+ :src="currentImg.url || item.url"
88
+ :style="imgStyle"
89
+ @load="handleImgLoad"
90
+ @error="handleImgError"
91
+ @mousedown="handleMouseDown"
92
+ >
93
+ <div
94
+ v-if="i === index"
95
+ class="el-image-view__tools"
96
+ >
97
+ <span>{{ item.label }}</span><span>|</span><span>{{ i + 1 }}/{{ urlList.length }}</span>
98
+ </div>
99
+ </section>
100
+ </template>
101
+ </div>
102
+ </div>
103
+ </transition>
104
+ </template>
105
+
106
+ <script>
107
+ import { on, off } from 'iov-design/src/utils/dom'
108
+ import { rafThrottle, isFirefox } from 'iov-design/src/utils/util'
109
+
110
+ const Mode = {
111
+ CONTAIN: {
112
+ name: 'contain',
113
+ icon: 'el-icon-full-screen'
114
+ },
115
+ ORIGINAL: {
116
+ name: 'original',
117
+ icon: 'el-icon-c-scale-to-original'
118
+ }
119
+ }
120
+
121
+ const mousewheelEventName = isFirefox() ? 'DOMMouseScroll' : 'mousewheel'
122
+
123
+ export default {
124
+ name: 'ElImageViewer',
125
+
126
+ props: {
127
+ urlList: {
128
+ type: Array,
129
+ default: () => []
130
+ },
131
+ zIndex: {
132
+ type: Number,
133
+ default: 2000
134
+ },
135
+ onSwitch: {
136
+ type: Function,
137
+ default: () => {}
138
+ },
139
+ onClose: {
140
+ type: Function,
141
+ default: () => {}
142
+ },
143
+ initialIndex: {
144
+ type: Number,
145
+ default: 0
146
+ }
147
+ },
148
+
149
+ data() {
150
+ return {
151
+ index: this.initialIndex,
152
+ isShow: false,
153
+ infinite: true,
154
+ loading: false,
155
+ mode: Mode.CONTAIN,
156
+ transform: {
157
+ scale: 1,
158
+ deg: 0,
159
+ offsetX: 0,
160
+ offsetY: 0,
161
+ enableTransition: false
162
+ }
163
+ }
164
+ },
165
+ computed: {
166
+ isSingle() {
167
+ return this.urlList.length <= 1
168
+ },
169
+ isFirst() {
170
+ return this.index === 0
171
+ },
172
+ isLast() {
173
+ return this.index === this.urlList.length - 1
174
+ },
175
+ currentImg() {
176
+ return this.urlList[this.index]
177
+ },
178
+ imgStyle() {
179
+ const { scale, deg, offsetX, offsetY, enableTransition } = this.transform
180
+ const style = {
181
+ transform: `scale(${scale}) rotate(${deg}deg)`,
182
+ transition: enableTransition ? 'transform .3s' : '',
183
+ 'margin-left': `${offsetX}px`,
184
+ 'margin-top': `${offsetY}px`
185
+ }
186
+ if (this.mode === Mode.CONTAIN) {
187
+ style.maxWidth = style.maxHeight = '100%'
188
+ }
189
+ return style
190
+ }
191
+ },
192
+ watch: {
193
+ index: {
194
+ handler: function(val) {
195
+ this.reset()
196
+ this.onSwitch(val)
197
+ }
198
+ },
199
+ currentImg() {
200
+ this.$nextTick(() => {
201
+ const $img = this.$refs.img[0]
202
+ if (!$img.complete) {
203
+ this.loading = true
204
+ }
205
+ })
206
+ }
207
+ },
208
+ mounted() {
209
+ this.deviceSupportInstall()
210
+ // add tabindex then wrapper can be focusable via Javascript
211
+ // focus wrapper so arrow key can't cause inner scroll behavior underneath
212
+ this.$refs['el-image-viewer__wrapper'].focus()
213
+ document.body.appendChild(this.$el)
214
+ document.body.addEventListener('click', this.clickOther, false)
215
+ },
216
+ destroyed() {
217
+ document.body.removeChild(this.$el)
218
+ document.body.removeEventListener('click', this.clickOther, false)
219
+ },
220
+ methods: {
221
+ hide() {
222
+ this.deviceSupportUninstall()
223
+ this.onClose()
224
+ },
225
+ deviceSupportInstall() {
226
+ this._keyDownHandler = rafThrottle(e => {
227
+ const keyCode = e.keyCode
228
+ switch (keyCode) {
229
+ // ESC
230
+ case 27:
231
+ this.hide()
232
+ break
233
+ // SPACE
234
+ case 32:
235
+ this.toggleMode()
236
+ break
237
+ // LEFT_ARROW
238
+ case 37:
239
+ this.prev()
240
+ break
241
+ // UP_ARROW
242
+ case 38:
243
+ this.handleActions('zoomIn')
244
+ break
245
+ // RIGHT_ARROW
246
+ case 39:
247
+ this.next()
248
+ break
249
+ // DOWN_ARROW
250
+ case 40:
251
+ this.handleActions('zoomOut')
252
+ break
253
+ }
254
+ })
255
+ this._mouseWheelHandler = rafThrottle(e => {
256
+ const delta = e.wheelDelta ? e.wheelDelta : -e.detail
257
+ if (delta > 0) {
258
+ this.handleActions('zoomIn', {
259
+ zoomRate: 0.015,
260
+ enableTransition: false
261
+ })
262
+ } else {
263
+ this.handleActions('zoomOut', {
264
+ zoomRate: 0.015,
265
+ enableTransition: false
266
+ })
267
+ }
268
+ })
269
+ on(document, 'keydown', this._keyDownHandler)
270
+ on(document, mousewheelEventName, this._mouseWheelHandler)
271
+ },
272
+ deviceSupportUninstall() {
273
+ off(document, 'keydown', this._keyDownHandler)
274
+ off(document, mousewheelEventName, this._mouseWheelHandler)
275
+ this._keyDownHandler = null
276
+ this._mouseWheelHandler = null
277
+ },
278
+ handleImgLoad() {
279
+ this.loading = false
280
+ },
281
+ handleImgError(e) {
282
+ this.loading = false
283
+ e.target.alt = '加载失败'
284
+ },
285
+ handleMouseDown(e) {
286
+ if (this.loading || e.button !== 0) return
287
+
288
+ const { offsetX, offsetY } = this.transform
289
+ const startX = e.pageX
290
+ const startY = e.pageY
291
+ this._dragHandler = rafThrottle(ev => {
292
+ this.transform.offsetX = offsetX + ev.pageX - startX
293
+ this.transform.offsetY = offsetY + ev.pageY - startY
294
+ })
295
+ on(document, 'mousemove', this._dragHandler)
296
+ on(document, 'mouseup', () => {
297
+ off(document, 'mousemove', this._dragHandler)
298
+ })
299
+
300
+ e.preventDefault()
301
+ },
302
+ reset() {
303
+ this.transform = {
304
+ scale: 1,
305
+ deg: 0,
306
+ offsetX: 0,
307
+ offsetY: 0,
308
+ enableTransition: false
309
+ }
310
+ },
311
+ toggleMode() {
312
+ if (this.loading) return
313
+
314
+ const modeNames = Object.keys(Mode)
315
+ const modeValues = Object.values(Mode)
316
+ const index = modeValues.indexOf(this.mode)
317
+ const nextIndex = (index + 1) % modeNames.length
318
+ this.mode = Mode[modeNames[nextIndex]]
319
+ this.reset()
320
+ },
321
+ prev() {
322
+ if (this.isFirst) return
323
+ const len = this.urlList.length
324
+ this.index = (this.index - 1 + len) % len
325
+ },
326
+ next() {
327
+ if (this.isLast) return
328
+ const len = this.urlList.length
329
+ this.index = (this.index + 1) % len
330
+ },
331
+ handleActions(action, options = {}) {
332
+ if (this.loading) return
333
+ const { zoomRate, rotateDeg, enableTransition } = {
334
+ zoomRate: 0.2,
335
+ rotateDeg: 90,
336
+ enableTransition: true,
337
+ ...options
338
+ }
339
+ const { transform } = this
340
+ switch (action) {
341
+ case 'zoomOut':
342
+ if (transform.scale > 0.2) {
343
+ transform.scale = parseFloat((transform.scale - zoomRate).toFixed(3))
344
+ }
345
+ break
346
+ case 'zoomIn':
347
+ transform.scale = parseFloat((transform.scale + zoomRate).toFixed(3))
348
+ break
349
+ case 'clocelise':
350
+ transform.deg += rotateDeg
351
+ break
352
+ case 'anticlocelise':
353
+ transform.deg -= rotateDeg
354
+ break
355
+ }
356
+ transform.enableTransition = enableTransition
357
+ },
358
+ // 全局预览增加点击遮罩关闭预览效果
359
+ clickOther(e) {
360
+ if (e.target.getAttribute('class') === 'el-image-viewer__mask') {
361
+ document.querySelector('.el-image-viewer__close').click()
362
+ }
363
+ }
364
+ }
365
+ }
366
+ </script>
@@ -0,0 +1,97 @@
1
+ <template>
2
+ <div
3
+ v-loading.fullscreen.lock="loading"
4
+ element-loading-spinner="page-loading"
5
+ class="iov-pro-preview"
6
+ >
7
+ <slot />
8
+ </div>
9
+ </template>
10
+
11
+ <script>
12
+ import { getComponentConfig } from '@/utils/config-center'
13
+ import showImageViewer from './eval-image-viewer'
14
+
15
+ export default {
16
+ name: 'IovProPreview',
17
+ provide() {
18
+ const pageThis = this
19
+ return {
20
+ preview: pageThis.onPreview
21
+ }
22
+ },
23
+ data() {
24
+ return {
25
+ cachedData: {},
26
+ params: {},
27
+ loading: false
28
+ }
29
+ },
30
+ methods: {
31
+ /**
32
+ * 预览文件
33
+ * @param {Object} file 文件
34
+ * @time 2025-05-09 09:27:11
35
+ */
36
+ async onPreview(file) {
37
+ // 获取request对象
38
+ const {
39
+ request,
40
+ imageViewer,
41
+ cacheTime
42
+ } = getComponentConfig('preview')
43
+ // 取出文件名称,uuid以及是否私有
44
+ const { name, uuid, isPrivate } = file
45
+ // 取出文件链接
46
+ let { url } = file
47
+ // 如果是私有桶
48
+ if (isPrivate) {
49
+ try {
50
+ // 如果之前请求过接口,且未过期
51
+ if (this.cachedData[uuid] && this.cachedData[uuid].expiresTime > Date.now()) {
52
+ url = this.cachedData[uuid]
53
+ } else {
54
+ // 展示loading框
55
+ this.loading = true
56
+ // 获取最新链接
57
+ url = await request({ uuid })
58
+ // 记录当前url,如果设置了过期时效
59
+ if (cacheTime) {
60
+ // 记录当前url以及过期时间
61
+ this.cachedData[uuid] = {
62
+ url,
63
+ expiresTime: Date.now() + cacheTime
64
+ }
65
+ }
66
+ // 关闭loading框
67
+ this.loading = false
68
+ }
69
+ } catch (error) {
70
+ // 关闭loading框
71
+ this.loading = false
72
+ console.error(error)
73
+ this.$message.error('获取文件链接失败,请重试')
74
+ return
75
+ }
76
+ }
77
+ // 取出扩展名
78
+ const ext = name.substring(name.lastIndexOf('.') + 1).toLowerCase()
79
+ // 如果当前是图片
80
+ if (['png', 'jpg', 'jpeg', 'webp', 'gif'].includes(ext)) {
81
+ // 展示文件预览器
82
+ showImageViewer({
83
+ style: {
84
+ zIndex: 3000,
85
+ ...(imageViewer?.style || {})
86
+ },
87
+ urlList: [url],
88
+ initialIndex: 0
89
+ })
90
+ } else {
91
+ // 新开窗口下载
92
+ window.open(url)
93
+ }
94
+ }
95
+ }
96
+ }
97
+ </script>
@@ -0,0 +1,7 @@
1
+ import Request from './src/main.vue'
2
+
3
+ Request.install = function(Vue) {
4
+ Vue.component(Request.name, Request)
5
+ }
6
+
7
+ export default Request
@@ -0,0 +1,125 @@
1
+ <script>
2
+ import isEqual from 'lodash/isEqual'
3
+ import cloneDeep from 'lodash/cloneDeep'
4
+ import debounce from 'lodash/debounce'
5
+
6
+ // 是否是空
7
+ const isNil = val => [null, undefined, ''].includes(val)
8
+
9
+ export default {
10
+ name: 'IovProRequest',
11
+ props: {
12
+ // 在api文档中定义的接口
13
+ api: {
14
+ type: Function,
15
+ default: null
16
+ },
17
+ // 接口请求入参
18
+ params: {
19
+ type: Object,
20
+ default: () => ({})
21
+ },
22
+ // 当params发生变化,是否重新请求接口
23
+ reloadOnParamsChange: {
24
+ type: Boolean,
25
+ default: true
26
+ },
27
+ // 接口请求必须的字段
28
+ requiredFields: {
29
+ type: [Array, String],
30
+ default: null
31
+ },
32
+ // 接口请求的阈值间隔
33
+ threshold: {
34
+ type: Number,
35
+ default: 50
36
+ },
37
+ // 接口没有加载成功前的默认值
38
+ default: {
39
+ type: [Array, Object],
40
+ default: null
41
+ }
42
+ },
43
+ data() {
44
+ return {
45
+ // 上一次的请求
46
+ oldParams: {},
47
+ // 接口是否在loading
48
+ loading: false,
49
+ // 接口响应字段
50
+ respData: this.default
51
+ }
52
+ },
53
+ watch: {
54
+ /**
55
+ * 如果当前值发生改变时,重新请求接口
56
+ * @time 2024-10-29 16:16:32
57
+ */
58
+ params() {
59
+ // 如果入参发生变化后无需重新请求
60
+ if (!this.reloadOnParamsChange) {
61
+ return
62
+ }
63
+ // 如果对象的值相等,则无需重新请求
64
+ if (isEqual(this.oldParams, this.params)) {
65
+ return
66
+ }
67
+ // 重新发起请求
68
+ this.onReload()
69
+ }
70
+ },
71
+ created() {
72
+ this.onReload = debounce(this.load.bind(this), this.threshold)
73
+ },
74
+ mounted() {
75
+ // 发起请求
76
+ this.onReload()
77
+ },
78
+ methods: {
79
+ /**
80
+ * 重新加载接口
81
+ * @time 2024-10-29 15:59:51
82
+ */
83
+ async load() {
84
+ // 如果当前传入api
85
+ if (!this.api) {
86
+ console.warn('【iov-pro-request】请传入api字段')
87
+ return
88
+ }
89
+ // 如果必填参数不全,则不可请求接口
90
+ if (this.requiredFields && this.requiredFields.some(fieldKey => isNil(this.params[fieldKey]))) {
91
+ console.warn('【iov-pro-request】请填写必填参数')
92
+ return
93
+ }
94
+ // 标记当前正在加载新接口
95
+ this.loading = true
96
+ // 前拷贝当前入参数据
97
+ this.oldParams = cloneDeep(this.params)
98
+ try {
99
+ // 开始查询数据
100
+ this.respData = await this.api(this.params)
101
+ // 当接口请求完成后,触发loaded方法
102
+ this.$emit('loaded', this.respData)
103
+ } catch (error) {
104
+ console.error(error)
105
+ }
106
+ // 标记当前正在加载新接口
107
+ this.loading = false
108
+ }
109
+ },
110
+ render() {
111
+ // 如果有默认插槽
112
+ if (this.$slots.default) {
113
+ return this.$slots.default
114
+ }
115
+ // 如果有作用域插槽
116
+ if (this.$scopedSlots.default) {
117
+ return this.$scopedSlots.default({
118
+ data: this.respData,
119
+ loading: this.loading
120
+ })
121
+ }
122
+ return null
123
+ }
124
+ }
125
+ </script>
@@ -0,0 +1,7 @@
1
+ import SearchTable from './src/main.vue'
2
+
3
+ SearchTable.install = function(Vue) {
4
+ Vue.component(SearchTable.name, SearchTable)
5
+ }
6
+
7
+ export default SearchTable