EditCellTable.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <template>
  2. <div class="p-4">
  3. <BasicTable
  4. @register="registerTable"
  5. @edit-end="handleEditEnd"
  6. @edit-cancel="handleEditCancel"
  7. :beforeEditSubmit="beforeEditSubmit"
  8. />
  9. </div>
  10. </template>
  11. <script lang="ts">
  12. import { defineComponent } from 'vue';
  13. import { BasicTable, useTable, BasicColumn } from '/@/components/Table';
  14. import { optionsListApi } from '/@/api/demo/select';
  15. import { demoListApi } from '/@/api/demo/table';
  16. import { treeOptionsListApi } from '/@/api/demo/tree';
  17. import { useMessage } from '/@/hooks/web/useMessage';
  18. const columns: BasicColumn[] = [
  19. {
  20. title: '输入框',
  21. dataIndex: 'name',
  22. edit: true,
  23. editComponentProps: {
  24. prefix: '$',
  25. },
  26. width: 200,
  27. },
  28. {
  29. title: '默认输入状态',
  30. dataIndex: 'name7',
  31. edit: true,
  32. editable: true,
  33. width: 200,
  34. },
  35. {
  36. title: '输入框校验',
  37. dataIndex: 'name1',
  38. edit: true,
  39. // 默认必填校验
  40. editRule: true,
  41. width: 200,
  42. },
  43. {
  44. title: '输入框函数校验',
  45. dataIndex: 'name2',
  46. edit: true,
  47. editRule: async (text) => {
  48. if (text === '2') {
  49. return '不能输入该值';
  50. }
  51. return '';
  52. },
  53. width: 200,
  54. },
  55. {
  56. title: '数字输入框',
  57. dataIndex: 'id',
  58. edit: true,
  59. editRule: true,
  60. editComponent: 'InputNumber',
  61. width: 200,
  62. },
  63. {
  64. title: '下拉框',
  65. dataIndex: 'name3',
  66. edit: true,
  67. editComponent: 'Select',
  68. editComponentProps: {
  69. options: [
  70. {
  71. label: 'Option1',
  72. value: '1',
  73. },
  74. {
  75. label: 'Option2',
  76. value: '2',
  77. },
  78. ],
  79. },
  80. width: 200,
  81. },
  82. {
  83. title: '远程下拉',
  84. dataIndex: 'name4',
  85. edit: true,
  86. editComponent: 'ApiSelect',
  87. editComponentProps: {
  88. api: optionsListApi,
  89. resultField: 'list',
  90. labelField: 'name',
  91. valueField: 'id',
  92. },
  93. width: 200,
  94. },
  95. {
  96. title: '远程下拉树',
  97. dataIndex: 'name71',
  98. edit: true,
  99. editComponent: 'ApiTreeSelect',
  100. editRule: false,
  101. editComponentProps: {
  102. api: treeOptionsListApi,
  103. resultField: 'list',
  104. },
  105. width: 200,
  106. },
  107. {
  108. title: '日期选择',
  109. dataIndex: 'date',
  110. edit: true,
  111. editComponent: 'DatePicker',
  112. editComponentProps: {
  113. valueFormat: 'YYYY-MM-DD',
  114. format: 'YYYY-MM-DD',
  115. },
  116. width: 200,
  117. },
  118. {
  119. title: '时间选择',
  120. dataIndex: 'time',
  121. edit: true,
  122. editComponent: 'TimePicker',
  123. editComponentProps: {
  124. valueFormat: 'HH:mm',
  125. format: 'HH:mm',
  126. },
  127. width: 200,
  128. },
  129. {
  130. title: '勾选框',
  131. dataIndex: 'name5',
  132. edit: true,
  133. editComponent: 'Checkbox',
  134. editValueMap: (value) => {
  135. return value ? '是' : '否';
  136. },
  137. width: 200,
  138. },
  139. {
  140. title: '开关',
  141. dataIndex: 'name6',
  142. edit: true,
  143. editComponent: 'Switch',
  144. editValueMap: (value) => {
  145. return value ? '开' : '关';
  146. },
  147. width: 200,
  148. },
  149. ];
  150. export default defineComponent({
  151. components: { BasicTable },
  152. setup() {
  153. const [registerTable] = useTable({
  154. title: '可编辑单元格示例',
  155. api: demoListApi,
  156. columns: columns,
  157. showIndexColumn: false,
  158. bordered: true,
  159. });
  160. const { createMessage } = useMessage();
  161. function handleEditEnd({ record, index, key, value }: Recordable) {
  162. console.log(record, index, key, value);
  163. return false;
  164. }
  165. // 模拟将指定数据保存
  166. function feakSave({ value, key, id }) {
  167. createMessage.loading({
  168. content: `正在模拟保存${key}`,
  169. key: '_save_fake_data',
  170. duration: 0,
  171. });
  172. return new Promise((resolve) => {
  173. setTimeout(() => {
  174. if (value === '') {
  175. createMessage.error({
  176. content: '保存失败:不能为空',
  177. key: '_save_fake_data',
  178. duration: 2,
  179. });
  180. resolve(false);
  181. } else {
  182. createMessage.success({
  183. content: `记录${id}${key}已保存`,
  184. key: '_save_fake_data',
  185. duration: 2,
  186. });
  187. resolve(true);
  188. }
  189. }, 2000);
  190. });
  191. }
  192. async function beforeEditSubmit({ record, index, key, value }) {
  193. console.log('单元格数据正在准备提交', { record, index, key, value });
  194. return await feakSave({ id: record.id, key, value });
  195. }
  196. function handleEditCancel() {
  197. console.log('cancel');
  198. }
  199. return {
  200. registerTable,
  201. handleEditEnd,
  202. handleEditCancel,
  203. beforeEditSubmit,
  204. };
  205. },
  206. });
  207. </script>