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,683 @@
1
+ # 表格 ProTable
2
+
3
+ ## 基础使用
4
+
5
+ ::: demo
6
+ ```html
7
+ <template>
8
+ <iov-pro-table
9
+ :data-source="dataSource"
10
+ :columns="COLUMNS"
11
+ >
12
+ <template #operate="{ row }">
13
+ <iov-pro-link-group>
14
+ <el-link type="primary">编辑</el-link>
15
+ <el-link type="primary" @click="onDelete(row)">删除</el-link>
16
+ </iov-pro-link-group>
17
+ </template>
18
+ </iov-pro-table>
19
+ </template>
20
+
21
+ <script>
22
+ export default {
23
+ data() {
24
+ return {
25
+ dataSource: [
26
+ { name: '郭靖', age: '38', location: '山东' },
27
+ { name: '黄蓉', age: '32', location: '桃花岛' },
28
+ { name: '杨过', age: '20', location: '终南山下古墓' },
29
+ { name: '小龙女', age: '22', location: '终南山下古墓' },
30
+ { name: '金轮法王', age: '39', location: '蒙古草原' },
31
+ { name: '段智兴', age: '61', location: '云南大理' },
32
+ { name: '洪七公', age: '59', location: '四海' },
33
+ { name: '黄药师', age: '61', location: '桃花岛' },
34
+ { name: '欧阳锋', age: '58', location: '西域' },
35
+ { name: '周伯通', age: '58', location: '终南山' },
36
+ { name: '王重阳', age: '63', location: '终南山' },
37
+ ],
38
+ COLUMNS: [
39
+ { type: 'index', label: '序号', width: '80px' },
40
+ { label: '姓名', prop: 'name', minWidth: '160px' },
41
+ { label: '年龄', prop: 'age', width: '100px' },
42
+ { label: '籍贯', prop: 'location', minWidth: '280px' },
43
+ { label: '操作', prop: 'operate', type: 'slot', fixed: 'right', align: 'right', width: '100px' }
44
+ ]
45
+ }
46
+ },
47
+
48
+ methods: {
49
+ /**
50
+ * 删除指定行
51
+ * @param {Object} row 当前行数据
52
+ */
53
+ onDelete(row) {
54
+ this.dataSource = this.dataSource.filter(item => item !== row)
55
+ }
56
+ }
57
+ }
58
+ </script>
59
+ ```
60
+ :::
61
+
62
+
63
+ ## 枚举
64
+
65
+ ::: demo
66
+ ```html
67
+ <template>
68
+ <iov-pro-table
69
+ :data-source="dataSource"
70
+ :columns="COLUMNS"
71
+ >
72
+ <template #operate="{ row }">
73
+ <iov-pro-link-group>
74
+ <el-link type="primary">编辑</el-link>
75
+ <el-link type="primary" @click="onDelete(row)">删除</el-link>
76
+ </iov-pro-link-group>
77
+ </template>
78
+ </iov-pro-table>
79
+ </template>
80
+
81
+ <script>
82
+ export default {
83
+ data() {
84
+ const DICT = {
85
+ SEX: [
86
+ { label: '男', value: 1 },
87
+ { label: '女', value: 0 }
88
+ ]
89
+ }
90
+ return {
91
+ dataSource: [
92
+ { name: '郭靖', age: '38', sex: 1, location: '山东' },
93
+ { name: '黄蓉', age: '32', sex: 0, location: '桃花岛' },
94
+ { name: '杨过', age: '20', sex: 1, location: '终南山下古墓' },
95
+ { name: '小龙女', age: '22', sex: 0, location: '终南山下古墓' },
96
+ { name: '金轮法王', age: '39', sex: 1, location: '蒙古草原' },
97
+ { name: '段智兴', age: '61', sex: 1, location: '云南大理' },
98
+ { name: '洪七公', age: '59', sex: 1, location: '四海' },
99
+ { name: '黄药师', age: '61', sex: 1, location: '桃花岛' },
100
+ { name: '欧阳锋', age: '58', sex: 1, location: '西域' },
101
+ { name: '周伯通', age: '58', sex: 1, location: '终南山' },
102
+ { name: '王重阳', age: '63', sex: 1, location: '终南山' },
103
+ ],
104
+ COLUMNS: [
105
+ { type: 'index', label: '序号', width: '80px' },
106
+ { label: '姓名', prop: 'name', minWidth: '160px' },
107
+ { label: '性别', prop: 'sex', type: 'enum', enums: DICT.SEX, width: '100px' },
108
+ { label: '年龄', prop: 'age', width: '100px' },
109
+ { label: '籍贯', prop: 'location', minWidth: '280px' },
110
+ { label: '操作', prop: 'operate', type: 'slot', fixed: 'right', align: 'right', width: '100px' }
111
+ ]
112
+ }
113
+ },
114
+
115
+ methods: {
116
+ /**
117
+ * 删除指定行
118
+ * @param {Object} row 当前行数据
119
+ */
120
+ onDelete(row) {
121
+ this.dataSource = this.dataSource.filter(item => item !== row)
122
+ }
123
+ }
124
+ }
125
+ </script>
126
+ ```
127
+ :::
128
+
129
+ ## 标签
130
+
131
+ ::: demo
132
+ ```html
133
+ <template>
134
+ <iov-pro-table
135
+ :data-source="dataSource"
136
+ :columns="COLUMNS"
137
+ >
138
+ <template #operate="{ row }">
139
+ <iov-pro-link-group>
140
+ <el-link type="primary">编辑</el-link>
141
+ <el-link type="primary" @click="onDelete(row)">删除</el-link>
142
+ </iov-pro-link-group>
143
+ </template>
144
+ </iov-pro-table>
145
+ </template>
146
+
147
+ <script>
148
+ export default {
149
+ data() {
150
+ const DICT = {
151
+ STATUS: [
152
+ { label: '启用', value: 1, type: 'success' },
153
+ { label: '停用', value: 0, type: 'info' }
154
+ ]
155
+ }
156
+ return {
157
+ dataSource: [
158
+ { name: '郭靖', age: '38', status: 1, location: '山东' },
159
+ { name: '黄蓉', age: '32', status: 0, location: '桃花岛' },
160
+ { name: '杨过', age: '20', status: 1, location: '终南山下古墓' },
161
+ { name: '小龙女', age: '22', status: 0, location: '终南山下古墓' },
162
+ { name: '金轮法王', age: '39', status: 1, location: '蒙古草原' },
163
+ { name: '段智兴', age: '61', status: 1, location: '云南大理' },
164
+ { name: '洪七公', age: '59', status: 1, location: '四海' },
165
+ { name: '黄药师', age: '61', status: 1, location: '桃花岛' },
166
+ { name: '欧阳锋', age: '58', status: 1, location: '西域' },
167
+ { name: '周伯通', age: '58', status: 1, location: '终南山' },
168
+ { name: '王重阳', age: '63', status: 1, location: '终南山' },
169
+ ],
170
+ COLUMNS: [
171
+ { type: 'index', label: '序号', width: '80px' },
172
+ { label: '姓名', prop: 'name', minWidth: '160px' },
173
+ { label: '状态', prop: 'status', type: 'tag', enums: DICT.STATUS, width: '100px' },
174
+ { label: '年龄', prop: 'age', width: '100px' },
175
+ { label: '籍贯', prop: 'location', minWidth: '280px' },
176
+ { label: '操作', prop: 'operate', type: 'slot', fixed: 'right', align: 'right', width: '100px' }
177
+ ]
178
+ }
179
+ },
180
+
181
+ methods: {
182
+ /**
183
+ * 删除指定行
184
+ * @param {Object} row 当前行数据
185
+ */
186
+ onDelete(row) {
187
+ this.dataSource = this.dataSource.filter(item => item !== row)
188
+ }
189
+ }
190
+ }
191
+ </script>
192
+ ```
193
+ :::
194
+
195
+
196
+ ## 插槽
197
+
198
+ 当定义 `type` 为 `Slot` 时,将会自动使用 `prop` 的值作为 插槽名。也可以使用 `slotName` 自定义插槽名。
199
+
200
+ ::: demo
201
+ ```html
202
+ <template>
203
+ <iov-pro-table
204
+ :data-source="dataSource"
205
+ :columns="COLUMNS"
206
+ >
207
+ <template #name="{ row }">{{ row.name }}</template>
208
+ <template #operate="{ row }">
209
+ <iov-pro-link-group>
210
+ <el-link type="primary">编辑</el-link>
211
+ <el-link type="primary" @click="onDelete(row)">删除</el-link>
212
+ </iov-pro-link-group>
213
+ </template>
214
+ </iov-pro-table>
215
+ </template>
216
+
217
+ <script>
218
+ export default {
219
+ data() {
220
+ const DICT = {
221
+ STATUS: [
222
+ { label: '启用', value: 1, type: 'success' },
223
+ { label: '停用', value: 0, type: 'info' }
224
+ ]
225
+ }
226
+ return {
227
+ dataSource: [
228
+ { name: '郭靖', age: '38', status: 1, location: '山东' },
229
+ { name: '黄蓉', age: '32', status: 0, location: '桃花岛' },
230
+ { name: '杨过', age: '20', status: 1, location: '终南山下古墓' },
231
+ { name: '小龙女', age: '22', status: 0, location: '终南山下古墓' },
232
+ { name: '金轮法王', age: '39', status: 1, location: '蒙古草原' },
233
+ { name: '段智兴', age: '61', status: 1, location: '云南大理' },
234
+ { name: '洪七公', age: '59', status: 1, location: '四海' },
235
+ { name: '黄药师', age: '61', status: 1, location: '桃花岛' },
236
+ { name: '欧阳锋', age: '58', status: 1, location: '西域' },
237
+ { name: '周伯通', age: '58', status: 1, location: '终南山' },
238
+ { name: '王重阳', age: '63', status: 1, location: '终南山' },
239
+ ],
240
+ COLUMNS: [
241
+ { type: 'index', label: '序号', width: '80px' },
242
+ { label: '姓名', prop: 'name', type: 'slot', minWidth: '160px' },
243
+ { label: '状态', prop: 'status', type: 'tag', enums: DICT.STATUS, width: '100px' },
244
+ { label: '年龄', prop: 'age', width: '100px' },
245
+ { label: '籍贯', prop: 'location', minWidth: '280px' },
246
+ { label: '操作', prop: 'operate', type: 'slot', fixed: 'right', align: 'right', width: '100px' }
247
+ ]
248
+ }
249
+ },
250
+
251
+ methods: {
252
+ /**
253
+ * 删除指定行
254
+ * @param {Object} row 当前行数据
255
+ */
256
+ onDelete(row) {
257
+ this.dataSource = this.dataSource.filter(item => item !== row)
258
+ }
259
+ }
260
+ }
261
+ </script>
262
+ ```
263
+ :::
264
+
265
+
266
+ ## 表头筛选
267
+
268
+ ::: demo
269
+ ```html
270
+ <template>
271
+ <iov-pro-table
272
+ :data-source="dataSource"
273
+ :columns="COLUMNS"
274
+ >
275
+ <template #operate="{ row }">
276
+ <iov-pro-link-group>
277
+ <el-link type="primary">编辑</el-link>
278
+ <el-link type="primary" @click="onDelete(row)">删除</el-link>
279
+ </iov-pro-link-group>
280
+ </template>
281
+ </iov-pro-table>
282
+ </template>
283
+
284
+ <script>
285
+ export default {
286
+ data() {
287
+ const DICT = {
288
+ STATUS: [
289
+ { label: '启用', value: 1, type: 'success' },
290
+ { label: '停用', value: 0, type: 'info' }
291
+ ]
292
+ }
293
+ return {
294
+ dataSource: [
295
+ { name: '郭靖', age: '38', status: 1, location: '山东' },
296
+ { name: '黄蓉', age: '32', status: 0, location: '桃花岛' },
297
+ { name: '杨过', age: '20', status: 1, location: '终南山下古墓' },
298
+ { name: '小龙女', age: '22', status: 0, location: '终南山下古墓' },
299
+ { name: '金轮法王', age: '39', status: 1, location: '蒙古草原' },
300
+ { name: '段智兴', age: '61', status: 1, location: '云南大理' },
301
+ { name: '洪七公', age: '59', status: 1, location: '四海' },
302
+ { name: '黄药师', age: '61', status: 1, location: '桃花岛' },
303
+ { name: '欧阳锋', age: '58', status: 1, location: '西域' },
304
+ { name: '周伯通', age: '58', status: 1, location: '终南山' },
305
+ { name: '王重阳', age: '63', status: 1, location: '终南山' },
306
+ ],
307
+ COLUMNS: [
308
+ { type: 'index', label: '序号', width: '80px' },
309
+ { label: '姓名', prop: 'name', searchable: true, minWidth: '160px' },
310
+ { label: '状态', prop: 'status', filters: DICT.STATUS, type: 'tag', enums: DICT.STATUS, width: '100px' },
311
+ { label: '年龄', prop: 'age', sortable: true, 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
+ /**
320
+ * 删除指定行
321
+ * @param {Object} row 当前行数据
322
+ */
323
+ onDelete(row) {
324
+ this.dataSource = this.dataSource.filter(item => item !== row)
325
+ }
326
+ }
327
+ }
328
+ </script>
329
+ ```
330
+ :::
331
+
332
+ ## 接口加载
333
+
334
+ ::: demo
335
+ ```html
336
+ <template>
337
+ <iov-pro-table
338
+ :request="{ api: apiMock, params }"
339
+ :columns="COLUMNS"
340
+ >
341
+ <template #operate="{ row }">
342
+ <iov-pro-link-group>
343
+ <el-link type="primary">编辑</el-link>
344
+ <el-link type="primary" @click="onDelete(row)">删除</el-link>
345
+ </iov-pro-link-group>
346
+ </template>
347
+ </iov-pro-table>
348
+ </template>
349
+
350
+ <script>
351
+ const apiMock = (params) => {
352
+ return new Promise((resolve, reject) => {
353
+ const { name, currPage, pageSize } = params
354
+ // 总数据
355
+ const list = [
356
+ { name: '郭靖', age: '38', location: '山东' },
357
+ { name: '黄蓉', age: '32', location: '桃花岛' },
358
+ { name: '杨过', age: '20', location: '终南山下古墓' },
359
+ { name: '小龙女', age: '22', location: '终南山下古墓' },
360
+ { name: '金轮法王', age: '39', location: '蒙古草原' },
361
+ { name: '段智兴', age: '61', location: '云南大理' },
362
+ { name: '洪七公', age: '59', location: '四海' },
363
+ { name: '黄药师', age: '61', location: '桃花岛' },
364
+ { name: '欧阳锋', age: '58', location: '西域' },
365
+ { name: '周伯通', age: '58', location: '终南山' },
366
+ { name: '王重阳', age: '63', location: '终南山' }
367
+ ]
368
+ setTimeout(() => {
369
+ resolve({
370
+ list: list.filter(item => !name || item.name.indexOf(name) >= 0).slice((currPage - 1) * pageSize, currPage * pageSize),
371
+ totalCount: 11
372
+ })
373
+ }, 300)
374
+ })
375
+ }
376
+
377
+ export default {
378
+ data() {
379
+ return {
380
+ params: {
381
+ id: 'A1918892818'
382
+ },
383
+ COLUMNS: [
384
+ { type: 'index', label: '序号', width: '80px' },
385
+ { label: '姓名', searchable: true, prop: 'name', minWidth: '160px' },
386
+ { label: '年龄', prop: 'age', width: '100px' },
387
+ { label: '籍贯', prop: 'location', minWidth: '280px' },
388
+ { label: '操作', prop: 'operate', type: 'slot', fixed: 'right', align: 'right', width: '100px' }
389
+ ]
390
+ }
391
+ },
392
+
393
+ methods: {
394
+ apiMock,
395
+
396
+ /**
397
+ * 删除指定行
398
+ * @param {Object} row 当前行数据
399
+ */
400
+ onDelete(row) {
401
+ this.dataSource = this.dataSource.filter(item => item !== row)
402
+ }
403
+ }
404
+ }
405
+ </script>
406
+ ```
407
+ :::
408
+
409
+ ## 设置分页属性
410
+
411
+ ::: demo
412
+ ```html
413
+ <template>
414
+ <iov-pro-table
415
+ :request="{ api: apiMock, params }"
416
+ :columns="COLUMNS"
417
+ :config="{ table: { border: false }, pagination: { pageSizes: [5, 10, 20, 50], pageSize: 5 } }"
418
+ >
419
+ <template #operate="{ row }">
420
+ <iov-pro-link-group>
421
+ <el-link type="primary">编辑</el-link>
422
+ <el-link type="primary" @click="onDelete(row)">删除</el-link>
423
+ </iov-pro-link-group>
424
+ </template>
425
+ </iov-pro-table>
426
+ </template>
427
+
428
+ <script>
429
+ const apiMock = (params) => {
430
+ return new Promise((resolve, reject) => {
431
+ const { name, currPage, pageSize } = params
432
+ // 总数据
433
+ const list = [
434
+ { name: '郭靖', age: '38', location: '山东' },
435
+ { name: '黄蓉', age: '32', location: '桃花岛' },
436
+ { name: '杨过', age: '20', location: '终南山下古墓' },
437
+ { name: '小龙女', age: '22', location: '终南山下古墓' },
438
+ { name: '金轮法王', age: '39', location: '蒙古草原' },
439
+ { name: '段智兴', age: '61', location: '云南大理' },
440
+ { name: '洪七公', age: '59', location: '四海' },
441
+ { name: '黄药师', age: '61', location: '桃花岛' },
442
+ { name: '欧阳锋', age: '58', location: '西域' },
443
+ { name: '周伯通', age: '58', location: '终南山' },
444
+ { name: '王重阳', age: '63', location: '终南山' }
445
+ ]
446
+ setTimeout(() => {
447
+ resolve({
448
+ list: list.filter(item => !name || item.name.indexOf(name) >= 0).slice((currPage - 1) * pageSize, currPage * pageSize),
449
+ totalCount: 11
450
+ })
451
+ }, 300)
452
+ })
453
+ }
454
+
455
+ export default {
456
+ data() {
457
+ return {
458
+ params: {
459
+ id: 'A1918892818'
460
+ },
461
+ COLUMNS: [
462
+ { type: 'index', label: '序号', width: '80px' },
463
+ { label: '姓名', searchable: true, prop: 'name', minWidth: '160px' },
464
+ { label: '年龄', prop: 'age', width: '100px' },
465
+ { label: '籍贯', prop: 'location', minWidth: '280px' },
466
+ { label: '操作', prop: 'operate', type: 'slot', fixed: 'right', align: 'right', width: '100px' }
467
+ ]
468
+ }
469
+ },
470
+
471
+ methods: {
472
+ apiMock,
473
+
474
+ /**
475
+ * 删除指定行
476
+ * @param {Object} row 当前行数据
477
+ */
478
+ onDelete(row) {
479
+ this.dataSource = this.dataSource.filter(item => item !== row)
480
+ }
481
+ }
482
+ }
483
+ </script>
484
+ ```
485
+ :::
486
+
487
+ ## 无分页
488
+
489
+ ::: demo
490
+ ```html
491
+ <template>
492
+ <iov-pro-table
493
+ :request="{ api: apiMock, params }"
494
+ :columns="COLUMNS"
495
+ :config="{ table: { border: false }, pagination: false }"
496
+ >
497
+ <template #operate="{ row }">
498
+ <iov-pro-link-group>
499
+ <el-link type="primary">编辑</el-link>
500
+ <el-link type="primary" @click="onDelete(row)">删除</el-link>
501
+ </iov-pro-link-group>
502
+ </template>
503
+ </iov-pro-table>
504
+ </template>
505
+
506
+ <script>
507
+ const apiMock = (params) => {
508
+ return new Promise((resolve, reject) => {
509
+ const { name, currPage, pageSize } = params
510
+ // 总数据
511
+ const list = [
512
+ { name: '郭靖', age: '38', location: '山东' },
513
+ { name: '黄蓉', age: '32', location: '桃花岛' },
514
+ { name: '杨过', age: '20', location: '终南山下古墓' },
515
+ { name: '小龙女', age: '22', location: '终南山下古墓' },
516
+ { name: '金轮法王', age: '39', location: '蒙古草原' },
517
+ { name: '段智兴', age: '61', location: '云南大理' },
518
+ { name: '洪七公', age: '59', location: '四海' },
519
+ { name: '黄药师', age: '61', location: '桃花岛' },
520
+ { name: '欧阳锋', age: '58', location: '西域' },
521
+ { name: '周伯通', age: '58', location: '终南山' },
522
+ { name: '王重阳', age: '63', location: '终南山' }
523
+ ]
524
+ setTimeout(() => {
525
+ resolve({ list })
526
+ }, 300)
527
+ })
528
+ }
529
+
530
+ export default {
531
+ data() {
532
+ return {
533
+ params: {
534
+ id: 'A1918892818'
535
+ },
536
+ COLUMNS: [
537
+ { type: 'index', label: '序号', width: '80px' },
538
+ { label: '姓名', searchable: true, prop: 'name', minWidth: '160px' },
539
+ { label: '年龄', prop: 'age', width: '100px' },
540
+ { label: '籍贯', prop: 'location', minWidth: '280px' },
541
+ { label: '操作', prop: 'operate', type: 'slot', fixed: 'right', align: 'right', width: '100px' }
542
+ ]
543
+ }
544
+ },
545
+
546
+ methods: {
547
+ apiMock,
548
+
549
+ /**
550
+ * 删除指定行
551
+ * @param {Object} row 当前行数据
552
+ */
553
+ onDelete(row) {
554
+ this.dataSource = this.dataSource.filter(item => item !== row)
555
+ }
556
+ }
557
+ }
558
+ </script>
559
+ ```
560
+ :::
561
+
562
+
563
+ ## 多选
564
+
565
+ ::: demo
566
+ ```html
567
+ <template>
568
+ <iov-pro-table
569
+ :data-source="dataSource"
570
+ :columns="COLUMNS"
571
+ @selection-change="onSelectionChange"
572
+ >
573
+ <template #operate="{ row }">
574
+ <iov-pro-link-group>
575
+ <el-link type="primary">编辑</el-link>
576
+ <el-link type="primary" @click="onDelete(row)">删除</el-link>
577
+ </iov-pro-link-group>
578
+ </template>
579
+ </iov-pro-table>
580
+ </template>
581
+
582
+ <script>
583
+ export default {
584
+ data() {
585
+ const DICT = {
586
+ STATUS: [
587
+ { label: '启用', value: 1, type: 'success' },
588
+ { label: '停用', value: 0, type: 'info' }
589
+ ]
590
+ }
591
+ return {
592
+ dataSource: [
593
+ { name: '郭靖', age: '38', status: 1, location: '山东' },
594
+ { name: '黄蓉', age: '32', status: 0, location: '桃花岛' },
595
+ { name: '杨过', age: '20', status: 1, location: '终南山下古墓' },
596
+ { name: '小龙女', age: '22', status: 0, location: '终南山下古墓' },
597
+ { name: '金轮法王', age: '39', status: 1, location: '蒙古草原' },
598
+ { name: '段智兴', age: '61', status: 1, location: '云南大理' },
599
+ { name: '洪七公', age: '59', status: 1, location: '四海' },
600
+ { name: '黄药师', age: '61', status: 1, location: '桃花岛' },
601
+ { name: '欧阳锋', age: '58', status: 1, location: '西域' },
602
+ { name: '周伯通', age: '58', status: 1, location: '终南山' },
603
+ { name: '王重阳', age: '63', status: 1, location: '终南山' },
604
+ ],
605
+ COLUMNS: [
606
+ { type: 'selection', width: '80px' },
607
+ { label: '姓名', prop: 'name', searchable: true, minWidth: '160px' },
608
+ { label: '状态', prop: 'status', filters: DICT.STATUS, type: 'tag', enums: DICT.STATUS, width: '100px' },
609
+ { label: '年龄', prop: 'age', sortable: true, width: '100px' },
610
+ { label: '籍贯', prop: 'location', minWidth: '280px' },
611
+ { label: '操作', prop: 'operate', type: 'slot', fixed: 'right', align: 'right', width: '100px' }
612
+ ]
613
+ }
614
+ },
615
+
616
+ methods: {
617
+ /**
618
+ * 删除指定行
619
+ * @param {Object} row 当前行数据
620
+ */
621
+ onDelete(row) {
622
+ this.dataSource = this.dataSource.filter(item => item !== row)
623
+ },
624
+
625
+ /**
626
+ * 当前选中的数据
627
+ * @param {Array} list 当前选中的数据
628
+ */
629
+ onSelectionChange(list) {
630
+ // 记录当前选中的数据
631
+ this.selectionList = list
632
+ this.$message.success(`当前选中了${list.length}条数据`)
633
+ }
634
+ }
635
+ }
636
+ </script>
637
+ ```
638
+ :::
639
+
640
+ ## Attributes
641
+
642
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
643
+ | ------- | ------- | ------- | ------- | ------- |
644
+ | request | 请求函数,详见下方 `Request` 配置 | Object | - | - |
645
+ | columns | 描述项配置,详见下方 `Column` 配置 | Array | - | - |
646
+ | dataSource | 外部数据源,用于用于渲染表格的数据 | Array | - | - |
647
+ | config | 表格配置,用于配置表格/分页器的展示,详见下方 Config 配置 | Object | - | - |
648
+
649
+
650
+ ## Column Attributes
651
+ 下方仅列举常用属性,[全部属性,请点击](https://element.eleme.cn/#/zh-CN/component/table#table-column-attributes)。
652
+
653
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
654
+ | ------- | ------- | ------- | ------- | ------- |
655
+ | type | 当前使用表格项类型 | String | index/selection/tag/enum/slot/img | - |
656
+ | label | 表格项标题 | String | - | - |
657
+ | prop | 对应列内容的字段名 | String | - | - |
658
+ | width | 对应列的宽度 | String | - | - |
659
+ | minWidth | 对应列的最小宽度 | String | - | - |
660
+ | fixed | 列是否固定在左侧或者右侧,true 表示固定在左侧 | String/Boolean | true, left, right | - |
661
+ | align | 对齐方式 | left/center/right | - | - |
662
+ | selectable | 仅对 type=selection 的列有效,类型为 Function,Function 的返回值用来决定这一行的 CheckBox 是否可以勾选 | Function(row, index) | - | - |
663
+
664
+ ## Config Attributes
665
+
666
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
667
+ | ------- | ------- | ------- | ------- | ------- |
668
+ | table | [表格配置](https://element.eleme.cn/#/zh-CN/component/table#table-attributes) | Object | - | - |
669
+ | pagination | [分页器属性](https://element.eleme.cn/#/zh-CN/component/pagination#attributes) | Object/false | - | - |
670
+
671
+ ## Request Attributes
672
+
673
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
674
+ | ------- | ------- | ------- | ------- | ------- |
675
+ | api | 接口请求方法 | Function(params) | - | - |
676
+ | params | 接口请求入参 | Object | - | - |
677
+ | reloadOnParamsChange | 当params发生变化,是否重新请求接口 | Boolean | - | true |
678
+ | requiredFields | 接口请求必须的字段 | String/Array | - | - |
679
+ | default | 接口没有加载成功前的默认值 | Array/Object | - | - |
680
+ | threshold | 接口请求的阈值间隔 | Number | - | 50 |
681
+
682
+ ## Table Methods
683
+ 方法由[Element原生Table方法](https://element.eleme.cn/#/zh-CN/component/table#table-methods) + [Element原生Pagination方法](https://element.eleme.cn/#/zh-CN/component/pagination#events)组成