AppendForm.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. <template>
  2. <PageWrapper title="表单增删示例">
  3. <CollapseContainer title="表单项增删">
  4. <BasicForm @register="register" @submit="handleSubmit">
  5. <template #add="{ field }">
  6. <a-button v-if="Number(field) === 0" @click="add">+</a-button>
  7. <a-button class="ml-2" v-if="Number(field) === 0" @click="batchAdd">
  8. 批量添加表单配置
  9. </a-button>
  10. <a-button v-if="Number(field) > 0" @click="() => del(field)">-</a-button>
  11. </template>
  12. </BasicForm>
  13. </CollapseContainer>
  14. <CollapseContainer title="表单组增删" class="my-3">
  15. <a-button @click="setGroup">设置初始值</a-button>
  16. <a-button class="m-2" @click="addGroup"> 批量添加表单 </a-button>
  17. <a-button @click="delGroup">批量减少表单</a-button>
  18. <BasicForm @register="registerGroup" @submit="handleSubmitGroup" />
  19. </CollapseContainer>
  20. </PageWrapper>
  21. </template>
  22. <script lang="ts" setup>
  23. import { ref } from 'vue';
  24. import { BasicForm, useForm } from '@/components/Form';
  25. import { CollapseContainer } from '@/components/Container';
  26. import { PageWrapper } from '@/components/Page';
  27. import { useMessage } from '@/hooks/web/useMessage';
  28. const { createMessage } = useMessage();
  29. const count = ref(0);
  30. const [register, { appendSchemaByField, removeSchemaByField, validate }] = useForm({
  31. schemas: [
  32. {
  33. field: 'field0a',
  34. component: 'Input',
  35. label: '字段0',
  36. required: true,
  37. },
  38. {
  39. field: 'field0b',
  40. component: 'Input',
  41. label: '字段0',
  42. required: true,
  43. },
  44. {
  45. field: '0',
  46. // component: 'Input',
  47. label: ' ',
  48. slot: 'add',
  49. },
  50. ],
  51. labelWidth: 100,
  52. actionColOptions: { span: 24 },
  53. baseColProps: { span: 8 },
  54. });
  55. async function handleSubmit() {
  56. try {
  57. const data = await validate();
  58. createMessage.success('请前往控制台查看输出');
  59. console.log(data);
  60. } catch (e) {
  61. console.log(e);
  62. }
  63. }
  64. const n = ref(1);
  65. function add() {
  66. appendSchemaByField(
  67. {
  68. field: `field${n.value}a`,
  69. component: 'Input',
  70. label: '字段' + n.value,
  71. required: true,
  72. },
  73. '',
  74. );
  75. appendSchemaByField(
  76. {
  77. field: `field${n.value}b`,
  78. component: 'Input',
  79. label: '字段' + n.value,
  80. required: true,
  81. },
  82. '',
  83. );
  84. appendSchemaByField(
  85. {
  86. field: `${n.value}`,
  87. component: 'Input',
  88. label: ' ',
  89. slot: 'add',
  90. },
  91. '',
  92. );
  93. n.value++;
  94. }
  95. /**
  96. * @description: 批量添加
  97. */
  98. function batchAdd() {
  99. appendSchemaByField(
  100. [
  101. {
  102. field: `field${n.value}a`,
  103. component: 'Input',
  104. label: '字段' + n.value,
  105. required: true,
  106. },
  107. {
  108. field: `field${n.value}b`,
  109. component: 'Input',
  110. label: '字段' + n.value,
  111. required: true,
  112. },
  113. {
  114. field: `${n.value}`,
  115. component: 'Input',
  116. label: ' ',
  117. slot: 'add',
  118. },
  119. ],
  120. '',
  121. );
  122. n.value++;
  123. }
  124. function del(field: string) {
  125. removeSchemaByField([`field${field}a`, `field${field}b`, `${field}`]);
  126. n.value--;
  127. }
  128. const [
  129. registerGroup,
  130. {
  131. appendSchemaByField: appendSchemaByFieldGroup,
  132. removeSchemaByField: removeSchemaByFieldGroup,
  133. getFieldsValue: getFieldsValueGroup,
  134. setFieldsValue,
  135. },
  136. ] = useForm({
  137. schemas: [
  138. {
  139. field: `field[${count.value}].a`,
  140. component: 'Input',
  141. label: '字段a',
  142. colProps: { span: 9 },
  143. },
  144. {
  145. field: `field[${count.value}].b`,
  146. colProps: { span: 9 },
  147. component: 'Input',
  148. label: '字段b',
  149. },
  150. ],
  151. labelWidth: 100,
  152. actionColOptions: { span: 24 },
  153. baseColProps: { span: 8 },
  154. });
  155. function addGroup() {
  156. count.value++;
  157. appendSchemaByFieldGroup(
  158. [
  159. {
  160. field: `field[${count.value}].a`,
  161. component: 'Input',
  162. colProps: { span: 9 },
  163. label: '字段a',
  164. },
  165. {
  166. field: `field[${count.value}].b`,
  167. component: 'Input',
  168. colProps: { span: 9 },
  169. label: '字段b',
  170. },
  171. ],
  172. '',
  173. );
  174. }
  175. function delGroup() {
  176. removeSchemaByFieldGroup([`field[${count.value}].a`, `field[${count.value}].b`]);
  177. count.value--;
  178. }
  179. function setGroup() {
  180. setFieldsValue({
  181. field: [
  182. {
  183. a: '默认a',
  184. b: '默认b',
  185. },
  186. ],
  187. });
  188. }
  189. function handleSubmitGroup() {
  190. createMessage.success('请前往控制台查看输出');
  191. console.log(getFieldsValueGroup());
  192. }
  193. </script>