DynamicForm.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. <template>
  2. <PageWrapper title="动态表单示例">
  3. <div class="mb-4">
  4. <a-button @click="changeLabel3" class="mr-2"> 更改字段3label </a-button>
  5. <a-button @click="changeLabel34" class="mr-2"> 同时更改字段3,4label </a-button>
  6. <a-button @click="appendField" class="mr-2"> 往字段3后面插入字段10 </a-button>
  7. <a-button @click="deleteField" class="mr-2"> 删除字段11 </a-button>
  8. </div>
  9. <CollapseContainer title="动态表单示例,动态根据表单内其他值改变">
  10. <BasicForm @register="register" />
  11. </CollapseContainer>
  12. <CollapseContainer class="mt-5" title="componentProps动态改变">
  13. <BasicForm @register="register1" />
  14. </CollapseContainer>
  15. </PageWrapper>
  16. </template>
  17. <script lang="ts">
  18. import { defineComponent } from 'vue';
  19. import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
  20. import { CollapseContainer } from '/@/components/Container/index';
  21. import { PageWrapper } from '/@/components/Page';
  22. import { usePermission } from '/@/hooks/web/usePermission';
  23. const { hasPermission } = usePermission();
  24. const schemas: FormSchema[] = [
  25. {
  26. field: 'field5',
  27. component: 'Switch',
  28. label: '是否显示字段1(css控制)',
  29. defaultValue: true,
  30. colProps: {
  31. span: 12,
  32. },
  33. labelWidth: 200,
  34. },
  35. {
  36. field: 'field1',
  37. component: 'Input',
  38. label: '字段1',
  39. colProps: {
  40. span: 12,
  41. },
  42. show: ({ values }) => {
  43. return hasPermission('test001');
  44. },
  45. },
  46. {
  47. field: 'field6',
  48. component: 'Switch',
  49. label: '是否显示字段2(dom控制)',
  50. defaultValue: true,
  51. colProps: {
  52. span: 12,
  53. },
  54. labelWidth: 200,
  55. },
  56. {
  57. field: 'field2',
  58. component: 'Input',
  59. label: '字段2',
  60. colProps: {
  61. span: 12,
  62. },
  63. ifShow: ({ values }) => {
  64. return !!values.field6;
  65. },
  66. },
  67. {
  68. field: 'field7',
  69. component: 'Switch',
  70. label: '是否禁用字段3',
  71. colProps: {
  72. span: 12,
  73. },
  74. labelWidth: 200,
  75. },
  76. {
  77. field: 'field3',
  78. component: 'DatePicker',
  79. label: '字段3',
  80. colProps: {
  81. span: 12,
  82. },
  83. dynamicDisabled: ({ values }) => {
  84. return !!values.field7;
  85. },
  86. },
  87. {
  88. field: 'field8',
  89. component: 'Switch',
  90. label: '字段4是否必填',
  91. colProps: {
  92. span: 12,
  93. },
  94. labelWidth: 200,
  95. },
  96. {
  97. field: 'field4',
  98. component: 'Select',
  99. label: '字段4',
  100. colProps: {
  101. span: 12,
  102. },
  103. dynamicRules: ({ values }) => {
  104. return values.field8 ? [{ required: true, message: '字段必填' }] : [];
  105. },
  106. componentProps: {
  107. options: [
  108. {
  109. label: '选项1',
  110. value: '1',
  111. key: '1',
  112. },
  113. {
  114. label: '选项2',
  115. value: '2',
  116. key: '2',
  117. },
  118. ],
  119. },
  120. },
  121. {
  122. field: 'field11',
  123. component: 'DatePicker',
  124. label: '字段11',
  125. colProps: {
  126. span: 8,
  127. },
  128. },
  129. ];
  130. const schemas1: FormSchema[] = [
  131. {
  132. field: 'f1',
  133. component: 'Input',
  134. label: 'F1',
  135. colProps: {
  136. span: 12,
  137. },
  138. labelWidth: 200,
  139. componentProps: ({ formModel }) => {
  140. return {
  141. placeholder: '同步f2的值为f1',
  142. onChange: (e: ChangeEvent) => {
  143. formModel.f2 = e.target.value;
  144. },
  145. };
  146. },
  147. },
  148. {
  149. field: 'f2',
  150. component: 'Input',
  151. label: 'F2',
  152. colProps: {
  153. span: 12,
  154. },
  155. labelWidth: 200,
  156. componentProps: { disabled: true },
  157. },
  158. {
  159. field: 'f3',
  160. component: 'Input',
  161. label: 'F3',
  162. colProps: {
  163. span: 12,
  164. },
  165. labelWidth: 200,
  166. // @ts-ignore
  167. componentProps: ({ formActionType }) => {
  168. return {
  169. placeholder: '值改变时执行查询,查看控制台',
  170. onChange: async () => {
  171. const { validate } = formActionType;
  172. // tableAction只适用于在表格内开启表单的例子
  173. // const { reload } = tableAction;
  174. const res = await validate();
  175. console.log(res);
  176. },
  177. };
  178. },
  179. },
  180. ];
  181. export default defineComponent({
  182. components: { BasicForm, CollapseContainer, PageWrapper },
  183. setup() {
  184. const [register, { setProps, updateSchema, appendSchemaByField, removeSchemaByFiled }] = useForm({
  185. labelWidth: 120,
  186. schemas,
  187. //禁用表单所有组件
  188. disabled: true,
  189. labelCol: {
  190. xs: { span: 24 },
  191. sm: { span: 6 },
  192. },
  193. wrapperCol: {
  194. xs: { span: 24 },
  195. sm: { span: 18 },
  196. },
  197. actionColOptions: {
  198. span: 24,
  199. },
  200. });
  201. const [register1] = useForm({
  202. labelWidth: 120,
  203. schemas: schemas1,
  204. actionColOptions: {
  205. span: 24,
  206. },
  207. });
  208. function changeLabel3() {
  209. updateSchema({
  210. field: 'field3',
  211. label: '字段3 New',
  212. });
  213. }
  214. function changeLabel34() {
  215. updateSchema([
  216. {
  217. field: 'field3',
  218. label: '字段3 New++',
  219. },
  220. {
  221. field: 'field4',
  222. label: '字段4 New++',
  223. },
  224. ]);
  225. }
  226. function appendField() {
  227. appendSchemaByField(
  228. {
  229. field: 'field10',
  230. label: '字段10',
  231. component: 'Input',
  232. colProps: {
  233. span: 8,
  234. },
  235. },
  236. 'field3'
  237. );
  238. }
  239. function deleteField() {
  240. removeSchemaByFiled('field11');
  241. }
  242. return {
  243. register,
  244. register1,
  245. schemas,
  246. setProps,
  247. changeLabel3,
  248. changeLabel34,
  249. appendField,
  250. deleteField,
  251. };
  252. },
  253. });
  254. </script>