6e8172ee2d3a697e8d5612c0c6a96be128120e7b.svn-base 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. # JEditableTable 帮助文档
  2. ## 参数配置
  3. | 参数 | 类型 | 必填 | 说明 |
  4. |--------------|---------|------|---------------------------------------------------------------------------------|
  5. | columns | array | ✔️ | 表格列的配置描述,具体项见下表 |
  6. | dataSource | array | ✔️ | 表格数据 |
  7. | loading | boolean | | 是否正在加载,加载中不会显示任何行,默认false |
  8. | actionButton | boolean | | 是否显示操作按钮,包括"新增"、"删除",默认false |
  9. | rowNumber | boolean | | 是否显示行号,默认false |
  10. | rowSelection | boolean | | 是否可选择行,默认false |
  11. | dragSort | boolean | | 是否可拖动排序,默认false |
  12. | dragSortKey | string | | 拖动排序存储的Key,无需定义在columns内也能在getValues()时获取到值,默认orderNum |
  13. | maxHeight | number | | 设定最大高度(px),默认400 |
  14. | disabledRows | object | | 设定禁用的行,被禁用的行无法被选择和编辑,配置方法可以查看示例 |
  15. | disabled | boolean | | 是否禁用所有行,默认false |
  16. ### columns 参数详解
  17. | 参数 | 类型 | 必填 | 说明 |
  18. |---------------|---------|------|--------------------------------------------------------------------------------------------------------------------------------------------------------|
  19. | title | string | ✔️ | 表格列头显示的问题 |
  20. | key | string | ✔️ | 列数据在数据项中对应的 key,必须是唯一的 |
  21. | type | string | ✔️ | 表单的类型,可以通过`JEditableTableUtil.FormTypes`赋值 |
  22. | width | string | | 列的宽度,可以是百分比,也可以是`px`或其他单位,建议设置为百分比,且每一列的宽度加起来不应超过100%,否则可能会不能达到预期的效果。留空会自动计算百分比 |
  23. | placeholder | string | | 表单预期值的提示信息,可以使用`${...}`变量替换文本(详见`${...} 变量使用方式`) |
  24. | defaultValue | string | | 默认值,在新增一行时生效 |
  25. | validateRules | array | | 表单验证规则,配置方式见[validateRules 配置规则](#validaterules-配置规则) |
  26. | props | object | | 设置添加给表单元素的自定义属性,例如:`props:{title: 'show title'}` |
  27. | disabled | boolean | | 是否禁用当前列,默认false |
  28. #### 当 type=checkbox 时所需的参数
  29. | 参数 | 类型 | 必填 | 说明 |
  30. |----------------|---------|------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
  31. | defaultChecked | boolean | | 默认值是否选中 |
  32. | customValue | array | | 自定义值,checkbox需要的是boolean值,如果数据是其他值(例如`'Y' or 'N'`)时,就会导致错误,所以提供了该属性进行转换,例:`customValue: ['Y','N']`,会将`true`转换为`'Y'`,`false`转换为`'N'`,反之亦然 |
  33. #### 当 type=select 时所需的参数
  34. | 参数 | 类型 | 必填 | 说明 |
  35. |------------|---------|------|----------------------------------------------------|
  36. | options | array | ✔️ | 下拉选项列表,详见下表 |
  37. | allowInput | boolean | | 是否允许用户输入内容,并创建新的内容 |
  38. | dictCode | String | | 数据字典Code,若options也有值,则拼接在options后面 |
  39. ##### options 所需参数
  40. | 参数 | 类型 | 必填 | 说明 |
  41. |-----------|------------|------|----------------------------------------------------------------------|
  42. | text | string | ✔️ | 显示标题 |
  43. | value | string | ✔️ | 真实值 |
  44. | ~~title~~ | ~~string~~ | | ~~显示标题(已废弃,若同时填写了 title 和 text 那么优先使用 text)~~ |
  45. #### 当 type=upload 时所需的参数
  46. | 参数 | 类型 | 必填 | 说明 |
  47. |--------------|---------|------|--------------------------------------------------------------------------------------|
  48. | action | string | ✔️ | 上传文件路径 |
  49. | token | boolean | | 上传的时候是否传递token |
  50. | responseName | string | ✔️ | 若要从上传成功后从response中取出返回的文件名,那么这里填后台返回的包含文件名的字段名 |
  51. #### 当 type=slot 时所需的参数
  52. | 参数 | 类型 | 必填 | 说明 |
  53. |----------|--------|------|------------|
  54. | slotName | string | ✔️ | slot的名称 |
  55. ### validateRules 配置规则
  56. `validateRules` 需要的是一个数组,数组里每项都是一个规则,规则是object类型,规则的各个参数如下
  57. - `required` 是否必填,可选值为`true`or`false`
  58. - `pattern` 正则表达式验证,只有成功匹配该正则的值才能成功通过验证
  59. - `handler` 自定义函数校验,使用方法请见[示例五](#示例五)
  60. - `message` 当验证未通过时显示的提示文本,可以使用`${...}`变量替换文本(详见`${...} 变量使用方式`)
  61. - 配置示例请看[示例二](#示例二)
  62. ## 事件
  63. | 事件名 | 触发时机 | 参数 |
  64. |-----------------|----------------------------------------------------|--------------------------------------------------|
  65. | added | 当添加行操作完成后触发 | |
  66. | deleted | 当删除行操作完成后触发(批量删除操作只会触发一次) | `deleteIds` 被逻辑删除的id |
  67. | selectRowChange | 当行被选中或取消选中时触发 | `selectedRowIds` 被选中行的id |
  68. | valueChange | 当数据发生改变的时候触发的事件 | `{ type, row, column, value, target }` Event对象 |
  69. ## 方法
  70. 关于方法的如何调用的问题,请在**FAQ**中查看[方法如何调用](#方法如何调用)
  71. ### initialize
  72. 用于初始化表格(清空表格)
  73. - `参数:` 无
  74. - `返回值:` 无
  75. ### resetScrollTop
  76. 重置滚动条Top位置
  77. - `参数:`
  78. | 参数名 | 类型 | 必填 | 说明 |
  79. |--------|--------|------|--------------------------------------------------------------------------------------------------------|
  80. | top | number | | 新top位置,留空则滚动到上次记录的位置,用于解决切换tab选项卡时导致白屏以及自动将滚动条滚动到顶部的问题 |
  81. - `返回值:` 无
  82. ### add
  83. 主动添加行,默认情况下,当用户的滚动条已经在底部的时候,会将滚动条固定在底部,即添加后无需用户手动滚动,而会自动滚动到底部
  84. - `参数:`
  85. | 参数名 | 类型 | 必填 | 说明 |
  86. |---------------------|---------|------|---------------------------------------------------------------------|
  87. | num | number | | 添加几行,默认为1 |
  88. | forceScrollToBottom | boolean | | 是否在添加后无论用户的滚动条在什么位置都强制滚动到底部,默认为false |
  89. - `返回值:` 无
  90. ### removeRows
  91. 主动删除一行或多行
  92. - `参数:`
  93. | 参数名 | 类型 | 必填 | 说明 |
  94. |--------|-----------------|------|--------------------------------------------------------------------------------------------|
  95. | id | string 或 array | ✔️ | 被删除行的id。如果要删除一个,可以直接传id,如果要删除多个,需要将多个id封装成一个数组传入 |
  96. - `返回值:` 无
  97. ### removeSelectedRows
  98. 主动删除被选中的行
  99. - `参数:` 无
  100. - `返回值:` 无
  101. ### getValues
  102. 用于获取表格里所有表单的值,可进行表单验证
  103. - `参数:`
  104. | 参数名 | 类型 | 必填 | 说明 |
  105. |----------|----------|------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
  106. | callback | function | ✔️ | 获取值的回调方法,会传入`error`和`values`两个参数。`error`:未通过验证的数量,当等于`0`时代表验证通过;`values`:获取的值(即使未通过验证该字段也有数据) |
  107. | validate | boolean | | 是否进行表单验证,默认为`true`,设为`false`则代表忽略表单验证 |
  108. | rowIds | array | | 默认返回所有行的数据,如果传入了`rowIds`,那么就会只返回与该`rowIds`相匹配的数据,如果没有匹配的数据,就会返回空数组 |
  109. - `返回值:` 无
  110. ### getValuesSync
  111. `getValues`的同步版,会直接将获取到的数据返回
  112. - `参数:`
  113. | 参数名 | 类型 | 必填 | 说明 |
  114. |---------|--------|------|------------------------|
  115. | options | object | | 选项,详见下方所需参数 |
  116. - - `options` 所需参数
  117. | 参数名 | 类型 | 必填 | 说明 |
  118. |----------|---------|------|----------------------------------------------------------------------------------------------------------------------|
  119. | validate | boolean | | 是否进行表单验证,默认为`true`,设为`false`则代表忽略表单验证 |
  120. | rowIds | array | | 默认返回所有行的数据,如果传入了`rowIds`,那么就会只返回与该`rowIds`相匹配的数据,如果没有匹配的数据,就会返回空数组 |
  121. - `返回值:` object
  122. - `error` 未通过验证的数量,当等于`0`时代表验证通过
  123. - `values` 获取的值(即使未通过验证该字段也有数据)
  124. - `使用示例`
  125. ```js
  126. let { error, values } = this.$refs.editableTable.getValuesSync({ validate: true, rowIds: ['rowId1', 'rowId2'] })
  127. if (error === 0) {
  128. console.log('表单验证通过,数据:', values);
  129. } else {
  130. console.log('未通过表单验证,数据:', values);
  131. }
  132. ```
  133. ### getValuesPromise
  134. `getValues`的promise版,会在`resolve`中传入获取到的值,会在`reject`中传入失败原因,例如`VALIDATE_NO_PASSED`
  135. - `参数:`
  136. | 参数名 | 类型 | 必填 | 说明 |
  137. |----------|---------|------|----------------------------------------------------------------------------------------------------------------------|
  138. | validate | boolean | | 同`getValues`的`validate`参数 |
  139. | rowIds | array | | 默认返回所有行的数据,如果传入了`rowIds`,那么就会只返回与该`rowIds`相匹配的数据,如果没有匹配的数据,就会返回空数组 |
  140. - `返回值:` Promise
  141. ### getDeleteIds
  142. 用于获取被逻辑删除的行的id,返回一个数组,用户可将该数组传入后台,并进行批量删除
  143. - `参数:` 无
  144. - `返回值:` array
  145. ### getAll
  146. 获取所有的数据,包括values、deleteIds
  147. 会在`resolve`中传入获取到的值:`{values, deleteIds}`
  148. 会在`reject`中传入失败原因,例如`VALIDATE_NO_PASSED`
  149. - `参数:`
  150. | 参数名 | 类型 | 必填 | 说明 |
  151. |----------|---------|------|-------------------------------|
  152. | validate | boolean | | 同`getValues`的`validate`参数 |
  153. - `返回值:` Promise
  154. ### setValues
  155. 主动设置表格中某行某列的值
  156. - `参数:`
  157. | 参数名 | 类型 | 必填 | 说明 |
  158. |--------|-------|------|------------------------------------------------------------|
  159. | values | array | | 传入一个数组,数组中的每项都是一行的新值,具体见下面的示例 |
  160. - `返回值:` 无
  161. - `示例:`
  162. ```js
  163. setValues([
  164. {
  165. rowKey: id1, // 行的id
  166. values: { // 在这里 values 中的 name 是你 columns 中配置的 key
  167. 'name': 'zhangsan',
  168. 'age': '20'
  169. }
  170. },
  171. {
  172. rowKey: id2,
  173. values: {
  174. 'name': 'lisi',
  175. 'age': '23'
  176. }
  177. }
  178. ])
  179. ```
  180. ### clearSelection
  181. 主动清空选择的行
  182. - `参数:` 无
  183. - `返回值:` 无
  184. ## 内置插槽
  185. | 插槽名 | 说明 |
  186. |--------------|------------------------------------------------------|
  187. | buttonBefore | 在操作按钮的**前面**插入插槽,不受`actionButton`属性的影响 |
  188. | buttonAfter | 在操作按钮的**后面**插入插槽,不受`actionButton`属性的影响 |
  189. ## ${...} 变量使用方式
  190. 在`placeholder`和`message`这两个属性中可以使用`${...}`变量来替换文本
  191. 在[示例二](#示例二)中,配置了`title`为`名称`的一列,而`placeholder`配置成了`请输入${title}`,那么最终显示效果为`请输入名称`
  192. 这就是`${...}`变量的使用方式,在`${}`中可以使用的变量有`title`、`key`、`defaultValue`这三个属性的值
  193. ## JEditableTableUtil 使用说明
  194. 在之前配置`columns`时提到过`JEditableTableUtil`这个工具类,那么如果想要知道详细的使用说明就请看这里
  195. ### export 的常量
  196. #### FormTypes
  197. 这是配置`columns.type`时用到的常量值,其中包括
  198. - `normal` 默认,直接显示值,不渲染表单
  199. - `input` 显示输入框
  200. - `inputNumber` 显示数字输入框
  201. - `checkbox` 显示多选框
  202. - `select` 显示选择器(下拉框)
  203. - `date` 日期选择器
  204. - `datetime` 日期时间选择器
  205. - `upload` 上传组件(文件域)
  206. - `slot` 自定义插槽
  207. ### VALIDATE_NO_PASSED
  208. 在判断表单验证是否通过时使用,如果 reject 的值 === VALIDATE_NO_PASSED 则代表表单验证未通过,你可以做相应的其他处理,反之则可能是发生了报错,可以使用 `console.error` 输出
  209. ### 封装的方法
  210. #### validateTables
  211. 当你的页面中存在多个JEditableTable实例的时候,如果要获取每个实例的值、判断表单验证是否通过,就会让代码变得极其冗余、繁琐,于是我们就将该操作封装成了一个函数供你调用,它可以同时获取并验证多个JEditableTable实例的值,只有当所有实例的表单验证都通过后才会返回值,否则将会告诉你具体哪个实例没有通过验证。具体使用方法请看下面的示例
  212. - `参数:`
  213. | 参数名 | 类型 | 必填 | 说明 |
  214. |--------|-------|------|--------------------------------------------------------|
  215. | cases | array | | 传入一个数组,数组中的每项都是一个JEditableTable的实例 |
  216. - `返回值:` Promise
  217. - `示例:`
  218. ```js
  219. import { validateTables, VALIDATE_NO_PASSED } from '@/utils/JEditableTableUtil'
  220. // 封装cases
  221. let cases = []
  222. cases.push(this.$refs.editableTable1)
  223. cases.push(this.$refs.editableTable2)
  224. cases.push(this.$refs.editableTable3)
  225. cases.push(this.$refs.editableTable4)
  226. cases.push(this.$refs.editableTable5)
  227. // 同时验证并获取多个实例的值
  228. validateTables(cases).then((all) => {
  229. // all 是一个数组,每项都对应传入cases的下标,包含values和deleteIds
  230. console.log('所有实例的值:', all)
  231. }).catch((e = {}) => {
  232. // 判断表单验证是否未通过
  233. if (e.error === VALIDATE_NO_PASSED) {
  234. console.log('未通过验证的实例下标:', e.index)
  235. } else {
  236. console.error('发生异常:', e)
  237. }
  238. })
  239. ```
  240. ## FAQ
  241. ### 方法如何调用?
  242. 在[示例一](#示例一)中,设定了一个 `ref="editableTable"` 的属性,那么在vue中就可以使用`this.$refs.editableTable`获取到该表格的实例,并调取其中的方法。
  243. 假如我要调取`initialize`方法,就可以这么写:`this.$refs.editableTable.initialize()`
  244. ### 如何获取表单的值?
  245. 使用`getValue`方法进行获取,详见[示例三](#示例三)
  246. ### 如何进行表单验证?
  247. 在获取值的时候默认会进行表单验证操作,用户在输入的时候也会对正在输入的表单进行验证,只要配置好规则就可以了
  248. ### 如何添加或删除一行?
  249. 该功能已封装到组件中,你只需要将 `actionButton` 设置为 `true` 即可,当然你也可以在代码中主动调用新增方法或修改,具体见上方的方法介绍。
  250. ### 为什么使用了ATab组件后,切换选项卡会导致白屏或滚动条位置会归零?
  251. 在ATab组件中确实会导致滚动条位置归零,且不会触发`onscroll`方法,所以无法动态加载行,导致白屏的问题出现。
  252. 解决方法是在ATab组件的`onChange`事件触发时执行实例提供的`resetScrollTop()`方法即可,但是需要注意的是:代码主动改变ATab的`activeKey`不会触发`onChange`事件,还需要你手动调用下。
  253. - `示例`
  254. ```html
  255. <template>
  256. <a-tabs @change="handleChangeTab">
  257. <a-tab-pane tab="表格1" :forceRender="true" key="1">
  258. <j-editable-table
  259. ref="editableTable1"
  260. :loading="tab1.loading"
  261. :columns="tab1.columns"
  262. :dataSource="tab1.dataSource"/>
  263. </a-tab-pane>
  264. <a-tab-pane tab="表格2" :forceRender="true" key="2">
  265. <j-editable-table
  266. ref="editableTable2"
  267. :loading="tab2.loading"
  268. :columns="tab2.columns"
  269. :dataSource="tab2.dataSource"/>
  270. </a-tab-pane>
  271. </a-tabs>
  272. </template>
  273. ```
  274. ```js
  275. /*--- 忽略部分代码片段 ---*/
  276. methods: {
  277. /** 切换tab选项卡的时候重置editableTable的滚动条状态 */
  278. handleChangeTab(key) {
  279. this.$refs[`editableTable${key}`].resetScrollTop()
  280. }
  281. }
  282. /*--- 忽略部分代码片段 ---*/
  283. ```
  284. ### slot(自定义插槽)如何使用?
  285. 代码示例请看:[示例四(slot)](#示例四(slot))
  286. ----------------------------------------------------------------------------------------
  287. ## 示例一
  288. ```html
  289. <j-editable-table
  290. ref="editableTable"
  291. :loading="loading"
  292. :columns="columns"
  293. :dataSource="dataSource"
  294. :rowNumber="true"
  295. :rowSelection="true"
  296. :actionButton="true"
  297. style="margin-top: 8px;"
  298. @selectRowChange="handleSelectRowChange"/>
  299. ```
  300. ## 示例二
  301. ```js
  302. import { FormTypes } from '@/utils/JEditableTableUtil'
  303. /*--- 忽略部分代码片断 ---*/
  304. columns: [
  305. {
  306. title: '名称',
  307. key: 'name',
  308. type: FormTypes.input,
  309. placeholder: '请输入${title}',
  310. defaultValue: '称名',
  311. // 表单验证规则
  312. validateRules: [
  313. {
  314. required: true, // 必填
  315. message: '${title}不能为空' // 提示的文本
  316. },
  317. {
  318. pattern: /^[a-z|A-Z][a-z|A-Z\d_-]{0,}$/, // 正则
  319. message: '${title}必须以字母开头,可包含数字、下划线、横杠'
  320. }
  321. ]
  322. },
  323. {
  324. title: '年龄',
  325. key: 'age',
  326. type: FormTypes.inputNumber,
  327. placeholder: '请输入${title}',
  328. defaultValue: 18,
  329. validateRules: [{required: true, message: '${title}不能为空'}]
  330. }
  331. ]
  332. /*--- 忽略部分代码片断 ---*/
  333. ```
  334. ## 示例三
  335. ```js
  336. // 获取被逻辑删除的字段id
  337. let deleteIds = this.$refs.editableTable.getDeleteIds();
  338. // 获取所有表单的值,并进行验证
  339. this.$refs.editableTable.getValues((error, values) => {
  340. // 错误数 = 0 则代表验证通过
  341. if (error === 0) {
  342. this.$message.success('验证通过')
  343. // 将通过后的数组提交到后台或自行进行其他处理
  344. console.log(deleteIds, values)
  345. } else {
  346. this.$message.error('验证未通过')
  347. }
  348. })
  349. ```
  350. ## 示例四(slot)
  351. ```html
  352. <template>
  353. <j-editable-table :columns="columns" :dataSource="dataSource">
  354. <!-- 定义插槽 -->
  355. <!-- 这种定义插槽的写法是vue推荐的新版写法(https://cn.vuejs.org/v2/guide/components-slots.html#具名插槽),旧版已被废弃的写法不再支持 -->
  356. <!-- 若webstorm这样写报错,请看这篇文章:https://blog.csdn.net/lxq_9532/article/details/81870651 -->
  357. <template v-slot:action="props">
  358. <a @click="handleDelete(props)">删除</a>
  359. </template>
  360. </j-editable-table>
  361. </template>
  362. <script>
  363. import { FormTypes } from '@/utils/JEditableTableUtil'
  364. import JEditableTable from '@/components/jeecg/JEditableTable'
  365. export default {
  366. components: { JEditableTable },
  367. data() {
  368. return {
  369. columns: [
  370. // ...
  371. {
  372. title: '操作',
  373. key: 'action',
  374. width: '8%',
  375. type: FormTypes.slot, // 定义该列为 自定义插值列
  376. slotName: 'action' // slot 的名称,对应 v-slot 冒号后面和等号前面的内容
  377. }
  378. ]
  379. }
  380. },
  381. methods: {
  382. /* a 标签的点击事件,删除当前选中的行 */
  383. handleDelete(props) {
  384. // 参数解释
  385. // props.index :当前行的下标
  386. // props.text :当前值,可能是defaultValue定义的值,也可能是从dataSource中取出的值
  387. // props.rowId :当前选中行的id,如果是新增行则是临时id
  388. // props.column :当前操作的列
  389. // props.getValue :这是一个function,执行后可以获取当前行的所有值(禁止在template中使用)
  390. // 例:const value = props.getValue()
  391. // props.target :触发当前事件的实例,可直接调用该实例内的方法(禁止在template中使用)
  392. // 例:target.add()
  393. // 使用实例:删除当前操作的行
  394. let { rowId, target } = props
  395. target.removeRows(rowId)
  396. }
  397. }
  398. }
  399. </script>
  400. ```
  401. ## 示例五
  402. ```js
  403. // 该示例是自定义函数校验
  404. columns: [
  405. {
  406. title: '字段名称',
  407. key: 'dbFieldName',
  408. type: FormTypes.input,
  409. defaultValue: '',
  410. validateRules: [
  411. {
  412. // 自定义函数校验 handler
  413. handler(type, value, row, column, callback, target) {
  414. // type 触发校验的类型(input、change、blur)
  415. // value 当前校验的值
  416. // callback(flag, message) 方法必须执行且只能执行一次
  417. // flag = 是否通过了校验,不填写或者填写 null 代表不进行任何操作
  418. // message = 提示的类型,默认使用配置的 message
  419. // target 行编辑的实例对象
  420. if (type === 'blur') {
  421. if (value === 'abc') {
  422. callback(false, '${title}不能是abc') // false = 未通过,可以跟自定义提示
  423. return
  424. }
  425. let { values } = target.getValuesSync({ validate: false })
  426. let count = 0
  427. for (let val of values) {
  428. if (val['dbFieldName'] === value) {
  429. if (++count >= 2) {
  430. callback(false, '${title}不能重复')
  431. return
  432. }
  433. }
  434. }
  435. callback(true) // true = 通过验证
  436. } else {
  437. callback() // 不填写或者填写 null 代表不进行任何操作
  438. }
  439. },
  440. message: '${title}默认提示'
  441. }
  442. ]
  443. },
  444. ]
  445. ```