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,963 @@
1
+ ---
2
+ pageClass: grey-background-demo-content
3
+ ---
4
+
5
+ # 搜索表单 SearchTable
6
+ 搜索表单组件由表单组件(ProForm)+表格组件(ProTable)构成,并集成了类如表格刷新,双向绑定,表头设置等快捷功能。且提供了3种模板样式可供选择。
7
+
8
+ ## 基础使用
9
+
10
+ ::: demo
11
+ ```html
12
+ <template>
13
+ <iov-pro-search-table
14
+ title="用户列表"
15
+ :request="{ api: apiMock, params }"
16
+ :form-items="ITEMS"
17
+ :table-columns="COLUMNS"
18
+ >
19
+ <template #operate="{ row }">
20
+ <iov-pro-link-group>
21
+ <el-link type="primary">编辑</el-link>
22
+ <el-link type="primary" @click="onDelete(row)">删除</el-link>
23
+ </iov-pro-link-group>
24
+ </template>
25
+ </iov-pro-search-table>
26
+ </template>
27
+
28
+ <script>
29
+ const apiMock = (params) => {
30
+ return new Promise((resolve, reject) => {
31
+ const { name, sex, currPage, pageSize } = params
32
+ // 总数据
33
+ const list = [
34
+ { name: '郭靖', age: '38', sex: 1, location: '山东' },
35
+ { name: '黄蓉', age: '32', sex: 0,location: '桃花岛' },
36
+ { name: '杨过', age: '20', sex: 1,location: '终南山下古墓' },
37
+ { name: '小龙女', age: '22', sex: 0,location: '终南山下古墓' },
38
+ { name: '金轮法王', age: '39', sex: 1,location: '蒙古草原' },
39
+ { name: '段智兴', age: '61', sex: 1,location: '云南大理' },
40
+ { name: '洪七公', age: '59', sex: 1,location: '四海' },
41
+ { name: '黄药师', age: '61', sex: 1,location: '桃花岛' },
42
+ { name: '欧阳锋', age: '58', sex: 1,location: '西域' },
43
+ { name: '周伯通', age: '58', sex: 1,location: '终南山' },
44
+ { name: '王重阳', age: '63', lsex: 1,ocation: '终南山' }
45
+ ]
46
+ // 过滤后的数据
47
+ const filterList = list
48
+ .filter(item => !name || item.name.indexOf(name) >= 0)
49
+ .filter(item => [0, 1].includes(sex) ? item.sex === sex : true)
50
+ setTimeout(() => {
51
+ resolve({
52
+ list: filterList.slice((currPage - 1) * pageSize, currPage * pageSize),
53
+ totalCount: filterList.length
54
+ })
55
+ }, 300)
56
+ })
57
+ }
58
+
59
+ const DICT = {
60
+ SEX: [
61
+ { label: '男', value: 1 },
62
+ { label: '女', value: 0 }
63
+ ]
64
+ }
65
+
66
+ export default {
67
+ data() {
68
+ return {
69
+ params: {
70
+ id: 'A1918892818'
71
+ },
72
+ ITEMS: [
73
+ {
74
+ label: '姓名',
75
+ name: 'name',
76
+ type: 'input'
77
+ },
78
+ {
79
+ label: '性别',
80
+ name: 'sex',
81
+ type: 'select',
82
+ options: DICT.SEX
83
+ }
84
+ ],
85
+ COLUMNS: [
86
+ { type: 'index', label: '序号', width: '80px' },
87
+ { label: '姓名', prop: 'name', minWidth: '160px' },
88
+ { label: '年龄', prop: 'age', width: '100px' },
89
+ { label: '性别', prop: 'sex', type: 'enum', enums: DICT.SEX, width: '100px' },
90
+ { label: '籍贯', prop: 'location', minWidth: '280px' },
91
+ { label: '操作', prop: 'operate', type: 'slot', fixed: 'right', align: 'right', width: '100px' }
92
+ ]
93
+ }
94
+ },
95
+
96
+ methods: {
97
+ apiMock,
98
+
99
+ /**
100
+ * 删除指定行
101
+ * @param {Object} row 当前行数据
102
+ */
103
+ onDelete(row) {
104
+ this.dataSource = this.dataSource.filter(item => item !== row)
105
+ }
106
+ }
107
+ }
108
+ </script>
109
+ ```
110
+ :::
111
+
112
+ ## 接口请求前修改参数
113
+
114
+ ::: demo
115
+ ```html
116
+ <template>
117
+ <iov-pro-search-table
118
+ title="用户列表"
119
+ :request="{ api: apiMock, params }"
120
+ :form-items="ITEMS"
121
+ :table-columns="COLUMNS"
122
+ @before-request="onBeforeRequest"
123
+ >
124
+ <template #operate="{ row }">
125
+ <iov-pro-link-group>
126
+ <el-link type="primary">编辑</el-link>
127
+ <el-link type="primary" @click="onDelete(row)">删除</el-link>
128
+ </iov-pro-link-group>
129
+ </template>
130
+ </iov-pro-search-table>
131
+ </template>
132
+
133
+ <script>
134
+ const apiMock = (params) => {
135
+ return new Promise((resolve, reject) => {
136
+ const { name, sex, currPage, pageSize } = params
137
+ // 总数据
138
+ const list = [
139
+ { name: '郭靖', age: '38', sex: 1, location: '山东' },
140
+ { name: '黄蓉', age: '32', sex: 0,location: '桃花岛' },
141
+ { name: '杨过', age: '20', sex: 1,location: '终南山下古墓' },
142
+ { name: '小龙女', age: '22', sex: 0,location: '终南山下古墓' },
143
+ { name: '金轮法王', age: '39', sex: 1,location: '蒙古草原' },
144
+ { name: '段智兴', age: '61', sex: 1,location: '云南大理' },
145
+ { name: '洪七公', age: '59', sex: 1,location: '四海' },
146
+ { name: '黄药师', age: '61', sex: 1,location: '桃花岛' },
147
+ { name: '欧阳锋', age: '58', sex: 1,location: '西域' },
148
+ { name: '周伯通', age: '58', sex: 1,location: '终南山' },
149
+ { name: '王重阳', age: '63', lsex: 1,ocation: '终南山' }
150
+ ]
151
+ // 过滤后的数据
152
+ const filterList = list
153
+ .filter(item => !name || item.name.indexOf(name) >= 0)
154
+ .filter(item => [0, 1].includes(sex) ? item.sex === sex : true)
155
+ setTimeout(() => {
156
+ resolve({
157
+ list: filterList.slice((currPage - 1) * pageSize, currPage * pageSize),
158
+ totalCount: filterList.length
159
+ })
160
+ }, 300)
161
+ })
162
+ }
163
+
164
+ const DICT = {
165
+ SEX: [
166
+ { label: '男', value: 1 },
167
+ { label: '女', value: 0 }
168
+ ]
169
+ }
170
+
171
+ export default {
172
+ data() {
173
+ return {
174
+ params: {
175
+ id: 'A1918892818'
176
+ },
177
+ ITEMS: [
178
+ {
179
+ label: '姓名',
180
+ name: 'name',
181
+ type: 'input'
182
+ },
183
+ {
184
+ label: '性别',
185
+ name: 'sex',
186
+ type: 'select',
187
+ options: DICT.SEX
188
+ }
189
+ ],
190
+ COLUMNS: [
191
+ { type: 'index', label: '序号', width: '80px' },
192
+ { label: '姓名', prop: 'name', minWidth: '160px' },
193
+ { label: '年龄', prop: 'age', width: '100px' },
194
+ { label: '性别', prop: 'sex', type: 'enum', enums: DICT.SEX, width: '100px' },
195
+ { label: '籍贯', prop: 'location', minWidth: '280px' },
196
+ { label: '操作', prop: 'operate', type: 'slot', fixed: 'right', align: 'right', width: '100px' }
197
+ ]
198
+ }
199
+ },
200
+
201
+ methods: {
202
+ apiMock,
203
+
204
+ /**
205
+ * 接口请求前修改参数
206
+ * @param {Object} params 接口请求入参
207
+ */
208
+ onBeforeRequest(params) {
209
+ params.key1 = 'value1'
210
+ console.log('onBeforeRequest: ', params)
211
+ },
212
+
213
+ /**
214
+ * 删除指定行
215
+ * @param {Object} row 当前行数据
216
+ */
217
+ onDelete(row) {
218
+ this.dataSource = this.dataSource.filter(item => item !== row)
219
+ }
220
+ }
221
+ }
222
+ </script>
223
+ ```
224
+ :::
225
+
226
+
227
+ ## 操作栏
228
+
229
+ ::: demo
230
+ ```html
231
+ <template>
232
+ <iov-pro-search-table
233
+ title="用户列表"
234
+ :request="{ api: apiMock, params }"
235
+ :form-items="ITEMS"
236
+ :table-columns="COLUMNS"
237
+ >
238
+ <template #action-bar>
239
+ <el-button type="primary" round icon="iov-icon-plus">新增用户</el-button>
240
+ </template>
241
+ <template #operate="{ row }">
242
+ <iov-pro-link-group>
243
+ <el-link type="primary">编辑</el-link>
244
+ <el-link type="primary" @click="onDelete(row)">删除</el-link>
245
+ </iov-pro-link-group>
246
+ </template>
247
+ </iov-pro-search-table>
248
+ </template>
249
+
250
+ <script>
251
+ const apiMock = (params) => {
252
+ return new Promise((resolve, reject) => {
253
+ const { name, sex, currPage, pageSize } = params
254
+ // 总数据
255
+ const list = [
256
+ { name: '郭靖', age: '38', sex: 1, location: '山东' },
257
+ { name: '黄蓉', age: '32', sex: 0,location: '桃花岛' },
258
+ { name: '杨过', age: '20', sex: 1,location: '终南山下古墓' },
259
+ { name: '小龙女', age: '22', sex: 0,location: '终南山下古墓' },
260
+ { name: '金轮法王', age: '39', sex: 1,location: '蒙古草原' },
261
+ { name: '段智兴', age: '61', sex: 1,location: '云南大理' },
262
+ { name: '洪七公', age: '59', sex: 1,location: '四海' },
263
+ { name: '黄药师', age: '61', sex: 1,location: '桃花岛' },
264
+ { name: '欧阳锋', age: '58', sex: 1,location: '西域' },
265
+ { name: '周伯通', age: '58', sex: 1,location: '终南山' },
266
+ { name: '王重阳', age: '63', lsex: 1,ocation: '终南山' }
267
+ ]
268
+ // 过滤后的数据
269
+ const filterList = list
270
+ .filter(item => !name || item.name.indexOf(name) >= 0)
271
+ .filter(item => [0, 1].includes(sex) ? item.sex === sex : true)
272
+ setTimeout(() => {
273
+ resolve({
274
+ list: filterList.slice((currPage - 1) * pageSize, currPage * pageSize),
275
+ totalCount: filterList.length
276
+ })
277
+ }, 300)
278
+ })
279
+ }
280
+
281
+ const DICT = {
282
+ SEX: [
283
+ { label: '男', value: 1 },
284
+ { label: '女', value: 0 }
285
+ ]
286
+ }
287
+
288
+ export default {
289
+ data() {
290
+ return {
291
+ params: {
292
+ id: 'A1918892818'
293
+ },
294
+ ITEMS: [
295
+ {
296
+ label: '姓名',
297
+ name: 'name',
298
+ type: 'input'
299
+ },
300
+ {
301
+ label: '性别',
302
+ name: 'sex',
303
+ type: 'select',
304
+ options: DICT.SEX
305
+ }
306
+ ],
307
+ COLUMNS: [
308
+ { type: 'index', label: '序号', width: '80px' },
309
+ { label: '姓名', prop: 'name', minWidth: '160px' },
310
+ { label: '年龄', prop: 'age', width: '100px' },
311
+ { label: '性别', prop: 'sex', type: 'enum', enums: DICT.SEX, width: '100px' },
312
+ { label: '籍贯', prop: 'location', minWidth: '280px' },
313
+ { label: '操作', prop: 'operate', type: 'slot', fixed: 'right', align: 'right', width: '100px' }
314
+ ]
315
+ }
316
+ },
317
+
318
+ methods: {
319
+ apiMock,
320
+
321
+ /**
322
+ * 删除指定行
323
+ * @param {Object} row 当前行数据
324
+ */
325
+ onDelete(row) {
326
+ this.dataSource = this.dataSource.filter(item => item !== row)
327
+ }
328
+ }
329
+ }
330
+ </script>
331
+ ```
332
+ :::
333
+
334
+ ## 部分字段禁用表头排序
335
+
336
+ ::: demo
337
+ ```html
338
+ <template>
339
+ <iov-pro-search-table
340
+ title="用户列表"
341
+ :request="{ api: apiMock, params }"
342
+ :form-items="ITEMS"
343
+ :table-columns="COLUMNS"
344
+ >
345
+ <template #action-bar>
346
+ <el-button type="primary" round icon="iov-icon-plus">新增用户</el-button>
347
+ </template>
348
+ <template #operate="{ row }">
349
+ <iov-pro-link-group>
350
+ <el-link type="primary">编辑</el-link>
351
+ <el-link type="primary">删除</el-link>
352
+ </iov-pro-link-group>
353
+ </template>
354
+ </iov-pro-search-table>
355
+ </template>
356
+
357
+ <script>
358
+ const apiMock = (params) => {
359
+ return new Promise((resolve, reject) => {
360
+ const { name, sex, currPage, pageSize } = params
361
+ // 总数据
362
+ const list = [
363
+ { name: '郭靖', age: '38', sex: 1, location: '山东' },
364
+ { name: '黄蓉', age: '32', sex: 0,location: '桃花岛' },
365
+ { name: '杨过', age: '20', sex: 1,location: '终南山下古墓' },
366
+ { name: '小龙女', age: '22', sex: 0,location: '终南山下古墓' },
367
+ { name: '金轮法王', age: '39', sex: 1,location: '蒙古草原' },
368
+ { name: '段智兴', age: '61', sex: 1,location: '云南大理' },
369
+ { name: '洪七公', age: '59', sex: 1,location: '四海' },
370
+ { name: '黄药师', age: '61', sex: 1,location: '桃花岛' },
371
+ { name: '欧阳锋', age: '58', sex: 1,location: '西域' },
372
+ { name: '周伯通', age: '58', sex: 1,location: '终南山' },
373
+ { name: '王重阳', age: '63', lsex: 1,ocation: '终南山' }
374
+ ]
375
+ // 过滤后的数据
376
+ const filterList = list
377
+ .filter(item => !name || item.name.indexOf(name) >= 0)
378
+ .filter(item => [0, 1].includes(sex) ? item.sex === sex : true)
379
+ setTimeout(() => {
380
+ resolve({
381
+ list: filterList.slice((currPage - 1) * pageSize, currPage * pageSize),
382
+ totalCount: filterList.length
383
+ })
384
+ }, 300)
385
+ })
386
+ }
387
+
388
+ const DICT = {
389
+ SEX: [
390
+ { label: '男', value: 1 },
391
+ { label: '女', value: 0 }
392
+ ]
393
+ }
394
+
395
+ export default {
396
+ data() {
397
+ return {
398
+ params: {
399
+ id: 'A1918892818'
400
+ },
401
+ ITEMS: [
402
+ {
403
+ label: '姓名',
404
+ name: 'name',
405
+ type: 'input'
406
+ },
407
+ {
408
+ label: '性别',
409
+ name: 'sex',
410
+ type: 'select',
411
+ options: DICT.SEX
412
+ }
413
+ ],
414
+ COLUMNS: [
415
+ { type: 'index', label: '序号', width: '80px' },
416
+ { label: '姓名', prop: 'name', minWidth: '160px' },
417
+ { label: '年龄', prop: 'age', width: '100px' },
418
+ { label: '性别', prop: 'sex', type: 'enum', enums: DICT.SEX, width: '100px' },
419
+ { label: '籍贯', prop: 'location', minWidth: '280px' },
420
+ { label: '操作', prop: 'operate', keepInPlace: true, type: 'slot', fixed: 'right', align: 'right', width: '100px' }
421
+ ]
422
+ }
423
+ },
424
+
425
+ methods: {
426
+ apiMock
427
+ }
428
+ }
429
+ </script>
430
+ ```
431
+ :::
432
+
433
+
434
+ ## 搜索栏最大折叠行数
435
+ 默认超过2行开始折叠
436
+
437
+ ::: demo
438
+ ```html
439
+ <template>
440
+ <iov-pro-search-table
441
+ title="用户列表"
442
+ :request="{ api: apiMock, params }"
443
+ :form-items="ITEMS"
444
+ :table-columns="COLUMNS"
445
+ >
446
+ <template #action-bar>
447
+ <el-button type="primary" round icon="iov-icon-plus">新增用户</el-button>
448
+ </template>
449
+ <template #operate="{ row }">
450
+ <iov-pro-link-group>
451
+ <el-link type="primary">编辑</el-link>
452
+ <el-link type="primary">删除</el-link>
453
+ </iov-pro-link-group>
454
+ </template>
455
+ </iov-pro-search-table>
456
+ </template>
457
+
458
+ <script>
459
+ const apiMock = (params) => {
460
+ return new Promise((resolve, reject) => {
461
+ const { name, sex, currPage, pageSize } = params
462
+ // 总数据
463
+ const list = [
464
+ { name: '郭靖', age: '38', sex: 1, location: '山东' },
465
+ { name: '黄蓉', age: '32', sex: 0,location: '桃花岛' },
466
+ { name: '杨过', age: '20', sex: 1,location: '终南山下古墓' },
467
+ { name: '小龙女', age: '22', sex: 0,location: '终南山下古墓' },
468
+ { name: '金轮法王', age: '39', sex: 1,location: '蒙古草原' },
469
+ { name: '段智兴', age: '61', sex: 1,location: '云南大理' },
470
+ { name: '洪七公', age: '59', sex: 1,location: '四海' },
471
+ { name: '黄药师', age: '61', sex: 1,location: '桃花岛' },
472
+ { name: '欧阳锋', age: '58', sex: 1,location: '西域' },
473
+ { name: '周伯通', age: '58', sex: 1,location: '终南山' },
474
+ { name: '王重阳', age: '63', lsex: 1,ocation: '终南山' }
475
+ ]
476
+ // 过滤后的数据
477
+ const filterList = list
478
+ .filter(item => !name || item.name.indexOf(name) >= 0)
479
+ .filter(item => [0, 1].includes(sex) ? item.sex === sex : true)
480
+ setTimeout(() => {
481
+ resolve({
482
+ list: filterList.slice((currPage - 1) * pageSize, currPage * pageSize),
483
+ totalCount: filterList.length
484
+ })
485
+ }, 300)
486
+ })
487
+ }
488
+
489
+ const DICT = {
490
+ SEX: [
491
+ { label: '男', value: 1 },
492
+ { label: '女', value: 0 }
493
+ ],
494
+ STATUS: [
495
+ { label: '启用', value: 1 },
496
+ { label: '停用', value: 0 }
497
+ ]
498
+ }
499
+
500
+ export default {
501
+ data() {
502
+ return {
503
+ params: {
504
+ id: 'A1918892818'
505
+ },
506
+ ITEMS: [
507
+ {
508
+ label: '姓名',
509
+ name: 'name',
510
+ type: 'input',
511
+ span: 8
512
+ },
513
+ {
514
+ label: '性别',
515
+ name: 'sex',
516
+ type: 'select',
517
+ options: DICT.SEX,
518
+ span: 8
519
+ },
520
+ {
521
+ label: '年龄',
522
+ name: 'age',
523
+ type: 'input',
524
+ span: 8
525
+ },
526
+ {
527
+ label: '籍贯',
528
+ name: 'location',
529
+ type: 'input',
530
+ span: 16
531
+ },
532
+ {
533
+ label: '状态',
534
+ name: 'status',
535
+ type: 'select',
536
+ span: 8,
537
+ options: DICT.STATUS
538
+ }
539
+ ],
540
+ COLUMNS: [
541
+ { type: 'index', label: '序号', width: '80px' },
542
+ { label: '姓名', prop: 'name', minWidth: '160px' },
543
+ { label: '年龄', prop: 'age', width: '100px' },
544
+ { label: '性别', prop: 'sex', type: 'enum', enums: DICT.SEX, width: '100px' },
545
+ { label: '籍贯', prop: 'location', minWidth: '280px' },
546
+ { label: '操作', prop: 'operate', keepInPlace: true, type: 'slot', fixed: 'right', align: 'right', width: '100px' }
547
+ ]
548
+ }
549
+ },
550
+
551
+ methods: {
552
+ apiMock
553
+ }
554
+ }
555
+ </script>
556
+ ```
557
+ :::
558
+
559
+ ## 设置一行折叠
560
+
561
+ ::: demo
562
+ ```html
563
+ <template>
564
+ <iov-pro-search-table
565
+ title="用户列表"
566
+ :request="{ api: apiMock, params }"
567
+ :form-items="ITEMS"
568
+ :table-columns="COLUMNS"
569
+ :config="{ form: { maxLine: 1 } }"
570
+ >
571
+ <template #action-bar>
572
+ <el-button type="primary" round icon="iov-icon-plus">新增用户</el-button>
573
+ </template>
574
+ <template #operate="{ row }">
575
+ <iov-pro-link-group>
576
+ <el-link type="primary">编辑</el-link>
577
+ <el-link type="primary">删除</el-link>
578
+ </iov-pro-link-group>
579
+ </template>
580
+ </iov-pro-search-table>
581
+ </template>
582
+
583
+ <script>
584
+ const apiMock = (params) => {
585
+ return new Promise((resolve, reject) => {
586
+ const { name, sex, currPage, pageSize } = params
587
+ // 总数据
588
+ const list = [
589
+ { name: '郭靖', age: '38', sex: 1, location: '山东' },
590
+ { name: '黄蓉', age: '32', sex: 0,location: '桃花岛' },
591
+ { name: '杨过', age: '20', sex: 1,location: '终南山下古墓' },
592
+ { name: '小龙女', age: '22', sex: 0,location: '终南山下古墓' },
593
+ { name: '金轮法王', age: '39', sex: 1,location: '蒙古草原' },
594
+ { name: '段智兴', age: '61', sex: 1,location: '云南大理' },
595
+ { name: '洪七公', age: '59', sex: 1,location: '四海' },
596
+ { name: '黄药师', age: '61', sex: 1,location: '桃花岛' },
597
+ { name: '欧阳锋', age: '58', sex: 1,location: '西域' },
598
+ { name: '周伯通', age: '58', sex: 1,location: '终南山' },
599
+ { name: '王重阳', age: '63', lsex: 1,ocation: '终南山' }
600
+ ]
601
+ // 过滤后的数据
602
+ const filterList = list
603
+ .filter(item => !name || item.name.indexOf(name) >= 0)
604
+ .filter(item => [0, 1].includes(sex) ? item.sex === sex : true)
605
+ setTimeout(() => {
606
+ resolve({
607
+ list: filterList.slice((currPage - 1) * pageSize, currPage * pageSize),
608
+ totalCount: filterList.length
609
+ })
610
+ }, 300)
611
+ })
612
+ }
613
+
614
+ const DICT = {
615
+ SEX: [
616
+ { label: '男', value: 1 },
617
+ { label: '女', value: 0 }
618
+ ],
619
+ STATUS: [
620
+ { label: '启用', value: 1 },
621
+ { label: '停用', value: 0 }
622
+ ]
623
+ }
624
+
625
+ export default {
626
+ data() {
627
+ return {
628
+ params: {
629
+ id: 'A1918892818'
630
+ },
631
+ ITEMS: [
632
+ {
633
+ label: '姓名',
634
+ name: 'name',
635
+ type: 'input',
636
+ span: 8
637
+ },
638
+ {
639
+ label: '性别',
640
+ name: 'sex',
641
+ type: 'select',
642
+ options: DICT.SEX,
643
+ span: 8
644
+ },
645
+ {
646
+ label: '年龄',
647
+ name: 'age',
648
+ type: 'input',
649
+ span: 8
650
+ },
651
+ {
652
+ label: '籍贯',
653
+ name: 'location',
654
+ type: 'input',
655
+ span: 16
656
+ },
657
+ {
658
+ label: '状态',
659
+ name: 'status',
660
+ type: 'select',
661
+ span: 8,
662
+ options: DICT.STATUS
663
+ }
664
+ ],
665
+ COLUMNS: [
666
+ { type: 'index', label: '序号', width: '80px' },
667
+ { label: '姓名', prop: 'name', minWidth: '160px' },
668
+ { label: '年龄', prop: 'age', width: '100px' },
669
+ { label: '性别', prop: 'sex', type: 'enum', enums: DICT.SEX, width: '100px' },
670
+ { label: '籍贯', prop: 'location', minWidth: '280px' },
671
+ { label: '操作', prop: 'operate', keepInPlace: true, type: 'slot', fixed: 'right', align: 'right', width: '100px' }
672
+ ]
673
+ }
674
+ },
675
+
676
+ methods: {
677
+ apiMock
678
+ }
679
+ }
680
+ </script>
681
+ ```
682
+ :::
683
+
684
+ ## 无需折叠
685
+
686
+ ::: demo
687
+ ```html
688
+ <template>
689
+ <iov-pro-search-table
690
+ title="用户列表"
691
+ :request="{ api: apiMock, params }"
692
+ :form-items="ITEMS"
693
+ :table-columns="COLUMNS"
694
+ :config="{ form: { collapse: false } }"
695
+ >
696
+ <template #action-bar>
697
+ <el-button type="primary" round icon="iov-icon-plus">新增用户</el-button>
698
+ </template>
699
+ <template #operate="{ row }">
700
+ <iov-pro-link-group>
701
+ <el-link type="primary">编辑</el-link>
702
+ <el-link type="primary">删除</el-link>
703
+ </iov-pro-link-group>
704
+ </template>
705
+ </iov-pro-search-table>
706
+ </template>
707
+
708
+ <script>
709
+ const apiMock = (params) => {
710
+ return new Promise((resolve, reject) => {
711
+ const { name, sex, currPage, pageSize } = params
712
+ // 总数据
713
+ const list = [
714
+ { name: '郭靖', age: '38', sex: 1, location: '山东' },
715
+ { name: '黄蓉', age: '32', sex: 0,location: '桃花岛' },
716
+ { name: '杨过', age: '20', sex: 1,location: '终南山下古墓' },
717
+ { name: '小龙女', age: '22', sex: 0,location: '终南山下古墓' },
718
+ { name: '金轮法王', age: '39', sex: 1,location: '蒙古草原' },
719
+ { name: '段智兴', age: '61', sex: 1,location: '云南大理' },
720
+ { name: '洪七公', age: '59', sex: 1,location: '四海' },
721
+ { name: '黄药师', age: '61', sex: 1,location: '桃花岛' },
722
+ { name: '欧阳锋', age: '58', sex: 1,location: '西域' },
723
+ { name: '周伯通', age: '58', sex: 1,location: '终南山' },
724
+ { name: '王重阳', age: '63', lsex: 1,ocation: '终南山' }
725
+ ]
726
+ // 过滤后的数据
727
+ const filterList = list
728
+ .filter(item => !name || item.name.indexOf(name) >= 0)
729
+ .filter(item => [0, 1].includes(sex) ? item.sex === sex : true)
730
+ setTimeout(() => {
731
+ resolve({
732
+ list: filterList.slice((currPage - 1) * pageSize, currPage * pageSize),
733
+ totalCount: filterList.length
734
+ })
735
+ }, 300)
736
+ })
737
+ }
738
+
739
+ const DICT = {
740
+ SEX: [
741
+ { label: '男', value: 1 },
742
+ { label: '女', value: 0 }
743
+ ],
744
+ STATUS: [
745
+ { label: '启用', value: 1 },
746
+ { label: '停用', value: 0 }
747
+ ]
748
+ }
749
+
750
+ export default {
751
+ data() {
752
+ return {
753
+ params: {
754
+ id: 'A1918892818'
755
+ },
756
+ ITEMS: [
757
+ {
758
+ label: '姓名',
759
+ name: 'name',
760
+ type: 'input',
761
+ span: 8
762
+ },
763
+ {
764
+ label: '性别',
765
+ name: 'sex',
766
+ type: 'select',
767
+ options: DICT.SEX,
768
+ span: 8
769
+ },
770
+ {
771
+ label: '年龄',
772
+ name: 'age',
773
+ type: 'input',
774
+ span: 8
775
+ },
776
+ {
777
+ label: '籍贯',
778
+ name: 'location',
779
+ type: 'input',
780
+ span: 16
781
+ },
782
+ {
783
+ label: '状态',
784
+ name: 'status',
785
+ type: 'select',
786
+ span: 8,
787
+ options: DICT.STATUS
788
+ }
789
+ ],
790
+ COLUMNS: [
791
+ { type: 'index', label: '序号', width: '80px' },
792
+ { label: '姓名', prop: 'name', minWidth: '160px' },
793
+ { label: '年龄', prop: 'age', width: '100px' },
794
+ { label: '性别', prop: 'sex', type: 'enum', enums: DICT.SEX, width: '100px' },
795
+ { label: '籍贯', prop: 'location', minWidth: '280px' },
796
+ { label: '操作', prop: 'operate', keepInPlace: true, type: 'slot', fixed: 'right', align: 'right', width: '100px' }
797
+ ]
798
+ }
799
+ },
800
+
801
+ methods: {
802
+ apiMock
803
+ }
804
+ }
805
+ </script>
806
+ ```
807
+ :::
808
+
809
+
810
+ ## 简易模式
811
+
812
+ ::: demo
813
+ ```html
814
+ <template>
815
+ <iov-pro-search-table
816
+ title="用户列表"
817
+ :request="{ api: apiMock, params }"
818
+ :form-items="ITEMS"
819
+ :table-columns="COLUMNS"
820
+ :config="{ simple: true }"
821
+ >
822
+ <template #action-bar>
823
+ <el-button type="primary" round icon="iov-icon-plus">新增用户</el-button>
824
+ </template>
825
+ <template #operate="{ row }">
826
+ <iov-pro-link-group>
827
+ <el-link type="primary">编辑</el-link>
828
+ <el-link type="primary">删除</el-link>
829
+ </iov-pro-link-group>
830
+ </template>
831
+ </iov-pro-search-table>
832
+ </template>
833
+
834
+ <script>
835
+ const apiMock = (params) => {
836
+ return new Promise((resolve, reject) => {
837
+ const { name, sex, currPage, pageSize } = params
838
+ // 总数据
839
+ const list = [
840
+ { name: '郭靖', age: '38', sex: 1, location: '山东' },
841
+ { name: '黄蓉', age: '32', sex: 0,location: '桃花岛' },
842
+ { name: '杨过', age: '20', sex: 1,location: '终南山下古墓' },
843
+ { name: '小龙女', age: '22', sex: 0,location: '终南山下古墓' },
844
+ { name: '金轮法王', age: '39', sex: 1,location: '蒙古草原' },
845
+ { name: '段智兴', age: '61', sex: 1,location: '云南大理' },
846
+ { name: '洪七公', age: '59', sex: 1,location: '四海' },
847
+ { name: '黄药师', age: '61', sex: 1,location: '桃花岛' },
848
+ { name: '欧阳锋', age: '58', sex: 1,location: '西域' },
849
+ { name: '周伯通', age: '58', sex: 1,location: '终南山' },
850
+ { name: '王重阳', age: '63', lsex: 1,ocation: '终南山' }
851
+ ]
852
+ // 过滤后的数据
853
+ const filterList = list
854
+ .filter(item => !name || item.name.indexOf(name) >= 0)
855
+ .filter(item => [0, 1].includes(sex) ? item.sex === sex : true)
856
+ setTimeout(() => {
857
+ resolve({
858
+ list: filterList.slice((currPage - 1) * pageSize, currPage * pageSize),
859
+ totalCount: filterList.length
860
+ })
861
+ }, 300)
862
+ })
863
+ }
864
+
865
+ const DICT = {
866
+ SEX: [
867
+ { label: '男', value: 1 },
868
+ { label: '女', value: 0 }
869
+ ]
870
+ }
871
+
872
+ export default {
873
+ data() {
874
+ return {
875
+ params: {
876
+ id: 'A1918892818'
877
+ },
878
+ ITEMS: [
879
+ {
880
+ label: '姓名',
881
+ name: 'name',
882
+ type: 'input'
883
+ },
884
+ {
885
+ label: '性别',
886
+ name: 'sex',
887
+ type: 'select',
888
+ options: DICT.SEX
889
+ }
890
+ ],
891
+ COLUMNS: [
892
+ { type: 'index', label: '序号', width: '80px' },
893
+ { label: '姓名', prop: 'name', minWidth: '160px' },
894
+ { label: '年龄', prop: 'age', width: '100px' },
895
+ { label: '性别', prop: 'sex', type: 'enum', enums: DICT.SEX, width: '100px' },
896
+ { label: '籍贯', prop: 'location', minWidth: '280px' },
897
+ { label: '操作', prop: 'operate', keepInPlace: true, type: 'slot', fixed: 'right', align: 'right', width: '100px' }
898
+ ]
899
+ }
900
+ },
901
+
902
+ methods: {
903
+ apiMock
904
+ }
905
+ }
906
+ </script>
907
+ ```
908
+ :::
909
+
910
+
911
+ ## Attributes
912
+
913
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
914
+ | ------- | ------- | ------- | ------- | ------- |
915
+ | title | 搜索表格的标题 | String | - | - |
916
+ | sub-title | 搜索表格的副标题 | String | - | - |
917
+ | request | 请求函数,详见下方 `Request` 配置 | Object | - | - |
918
+ | form-items | 表单项描述项配置,详见[配置](/components/pro-form.html#items-attributes) | Array | - | - |
919
+ | table-columns | 表格列描述项配置,详见[配置](/components/pro-table.html#column-attributes) | Array | - | - |
920
+ | dataSource | 外部数据源,用于用于渲染表格的数据 | Array | - | - |
921
+ | config | 搜索表格配置,用于配置表单/表格/分页器的展示,详见下方 Config 配置 | Object | - | - |
922
+
923
+ ## Request Attributes
924
+
925
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
926
+ | ------- | ------- | ------- | ------- | ------- |
927
+ | api | 接口请求方法 | Function(params) | - | - |
928
+ | params | 接口请求入参 | Object | - | - |
929
+ | reloadOnParamsChange | 当params发生变化,是否重新请求接口 | Boolean | - | true |
930
+ | requiredFields | 接口请求必须的字段 | String/Array | - | - |
931
+ | default | 接口没有加载成功前的默认值 | Array/Object | - | - |
932
+ | threshold | 接口请求的阈值间隔 | Number | - | 50 |
933
+
934
+ ## Config Attributes
935
+
936
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
937
+ | ------- | ------- | ------- | ------- | ------- |
938
+ | form | 表单配置,详见 [ProForm配置](/components/pro-form.html#config-attributes),特殊配置详见下方 `FormConfig` 配置 | Object | - | - |
939
+ | table | 表格配置,详见 [ProTable 配置](/components/pro-table.html#config-attributes) | Object | - | - |
940
+ | simple | 简易模式 | Boolean | - | - |
941
+
942
+ ## FormConfig Attributes
943
+
944
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
945
+ | ------- | ------- | ------- | ------- | ------- |
946
+ | collapse | 是否折叠表单 | Boolean | - | true |
947
+ | maxLine | 最大折叠行数 | Number | - | 2 |
948
+
949
+ ## SearchTable Events
950
+ 事件包含 [Element原生Table事件](https://element.eleme.cn/#/zh-CN/component/table#table-events) + [Element原生Pagination事件](https://element.eleme.cn/#/zh-CN/component/pagination#events),特有的方法如下:
951
+ | 事件名 | 说明 | 参数 |
952
+ | ------- | ------- | ------- |
953
+ | beforeRequest | 接口请求前参数拦截 | params |
954
+ | afterRequest | 接口请求后获取返回值 | respData |
955
+
956
+ ## SearchTable Methods
957
+ 方法由[Element原生Table方法](https://element.eleme.cn/#/zh-CN/component/table#table-methods) + [Element原生Pagination方法](https://element.eleme.cn/#/zh-CN/component/pagination#events)组成。特有的方法如下:
958
+
959
+ | 方法名 | 说明 | 参数 |
960
+ | ------- | ------- | ------- |
961
+ | onSearch | 刷新列表数据 | - |
962
+ | refresh | 刷新当前页数据 | - |
963
+ | onReset | 重置表单并刷新列表数据 | - |