UseForm.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. <template>
  2. <PageWrapper title="UseForm操作示例">
  3. <Space class="mb-4">
  4. <a-button type="primary" @click="showDrawer"> 更改设置 </a-button>
  5. <a-button @click="setProps({ resetButtonOptions: { disabled: true, text: '重置New' } })">
  6. 修改重置按钮
  7. </a-button>
  8. <a-button @click="setProps({ submitButtonOptions: { disabled: true, loading: true } })">
  9. 修改查询按钮
  10. </a-button>
  11. <a-button @click="handleLoad" class="mr-2"> 联动回显 </a-button>
  12. </Space>
  13. <Drawer v-model:visible="visible" title="更改设置" placement="right">
  14. <BasicForm ref="settingFormRef" @register="registerSetting" @submit="handleSubmitSetting" />
  15. <template #extra>
  16. <Space>
  17. <a-button @click="resetSettings">重置设置</a-button>
  18. <a-button type="primary" @click="onSettings">应用</a-button>
  19. </Space>
  20. </template>
  21. </Drawer>
  22. <CollapseContainer title="useForm示例">
  23. <BasicForm @register="register" @submit="handleSubmit" />
  24. </CollapseContainer>
  25. </PageWrapper>
  26. </template>
  27. <script lang="ts">
  28. import { defineComponent, ref } from 'vue';
  29. import { Drawer, Space } from 'ant-design-vue';
  30. import { BasicForm, FormSchema, useForm } from '/@/components/Form';
  31. import { CollapseContainer } from '/@/components/Container';
  32. import { PageWrapper } from '/@/components/Page';
  33. import { areaRecord } from '/@/api/demo/cascader';
  34. const sizeList = [
  35. { value: 'large', label: 'large' },
  36. { value: 'middle', label: 'middle' },
  37. { value: 'small', label: 'small' },
  38. { value: 'default', label: 'defualt' },
  39. ];
  40. const schemas: FormSchema[] = [
  41. {
  42. field: 'field1',
  43. component: 'Input',
  44. label: '字段1',
  45. colProps: { span: 8 },
  46. componentProps: {
  47. placeholder: '自定义placeholder',
  48. onChange: (e: any) => {
  49. console.log(e);
  50. },
  51. },
  52. },
  53. {
  54. field: 'field2',
  55. component: 'Input',
  56. label: '字段2',
  57. colProps: { span: 8 },
  58. },
  59. {
  60. field: 'field3',
  61. component: 'DatePicker',
  62. label: '字段3',
  63. colProps: { span: 8 },
  64. },
  65. {
  66. field: 'fieldTime',
  67. component: 'RangePicker',
  68. label: '时间字段',
  69. colProps: { span: 8 },
  70. },
  71. {
  72. field: 'field4',
  73. component: 'Select',
  74. label: '字段4',
  75. colProps: { span: 8 },
  76. componentProps: {
  77. options: [
  78. { label: '选项1', value: '1', key: '1' },
  79. { label: '选项2', value: '2', key: '2' },
  80. ],
  81. },
  82. },
  83. {
  84. field: 'field5',
  85. component: 'CheckboxGroup',
  86. label: '字段5',
  87. colProps: {
  88. span: 8,
  89. },
  90. componentProps: {
  91. options: [
  92. { label: '选项1', value: '1' },
  93. { label: '选项2', value: '2' },
  94. ],
  95. },
  96. },
  97. {
  98. field: 'field7',
  99. component: 'RadioGroup',
  100. label: '字段7',
  101. colProps: { span: 8 },
  102. componentProps: {
  103. options: [
  104. { label: '选项1', value: '1' },
  105. { label: '选项2', value: '2' },
  106. ],
  107. },
  108. },
  109. {
  110. field: 'field8',
  111. component: 'ApiCascader',
  112. label: '联动',
  113. colProps: { span: 8 },
  114. componentProps: {
  115. api: areaRecord,
  116. apiParamKey: 'parentCode',
  117. dataField: 'data',
  118. labelField: 'name',
  119. valueField: 'code',
  120. initFetchParams: {
  121. parentCode: '',
  122. },
  123. isLeaf: (record) => {
  124. return !(record.levelType < 3);
  125. },
  126. },
  127. },
  128. {
  129. field: 'field9',
  130. component: 'ApiCascader',
  131. label: '联动回显',
  132. colProps: { span: 8 },
  133. componentProps: {
  134. api: areaRecord,
  135. apiParamKey: 'parentCode',
  136. dataField: 'data',
  137. labelField: 'name',
  138. valueField: 'code',
  139. initFetchParams: {
  140. parentCode: '',
  141. },
  142. isLeaf: (record) => {
  143. return !(record.levelType < 3);
  144. },
  145. },
  146. },
  147. ];
  148. const formSchemas: FormSchema[] = [
  149. {
  150. field: '',
  151. component: 'Divider',
  152. label: '基础属性',
  153. colProps: { span: 24 },
  154. componentProps: {
  155. orientation: 'center',
  156. },
  157. },
  158. {
  159. field: 'labelWidth',
  160. defaultValue: 120,
  161. component: 'InputNumber',
  162. label: 'labelWidth',
  163. colProps: { span: 24 },
  164. componentProps: {
  165. size: 'small',
  166. },
  167. },
  168. {
  169. field: 'size',
  170. defaultValue: 'default',
  171. component: 'Select',
  172. label: 'size',
  173. colProps: { span: 24 },
  174. componentProps: {
  175. options: sizeList,
  176. size: 'small',
  177. },
  178. },
  179. {
  180. field: 'disabled',
  181. defaultValue: false,
  182. component: 'Switch',
  183. label: 'disabled',
  184. colProps: { span: 24 },
  185. componentProps: {
  186. size: 'small',
  187. },
  188. },
  189. {
  190. field: 'compact',
  191. defaultValue: false,
  192. component: 'Switch',
  193. label: 'compact',
  194. colProps: { span: 24 },
  195. componentProps: {
  196. size: 'small',
  197. },
  198. },
  199. {
  200. field: '',
  201. component: 'Divider',
  202. label: '网格布局',
  203. colProps: { span: 24 },
  204. componentProps: {
  205. orientation: 'center',
  206. },
  207. },
  208. {
  209. field: 'actionColOptions.span',
  210. component: 'Slider',
  211. defaultValue: 24,
  212. label: 'span',
  213. colProps: { span: 24 },
  214. componentProps: {
  215. min: 1,
  216. max: 24,
  217. },
  218. },
  219. {
  220. field: '',
  221. component: 'Divider',
  222. label: '操作按钮',
  223. colProps: { span: 24 },
  224. componentProps: {
  225. orientation: 'center',
  226. },
  227. },
  228. {
  229. field: 'showActionButtonGroup',
  230. defaultValue: true,
  231. component: 'Switch',
  232. label: '操作按钮',
  233. colProps: { span: 24 },
  234. componentProps: ({ formActionType }) => {
  235. return {
  236. size: 'small',
  237. onChange: async (val: boolean) => {
  238. formActionType.updateSchema([
  239. { field: 'showResetButton', componentProps: { disabled: !val } },
  240. {
  241. field: 'showSubmitButton',
  242. componentProps: { disabled: !val },
  243. },
  244. ]);
  245. },
  246. };
  247. },
  248. },
  249. {
  250. field: 'showResetButton',
  251. defaultValue: true,
  252. component: 'Switch',
  253. label: '重置按钮',
  254. colProps: { span: 24 },
  255. componentProps: {
  256. size: 'small',
  257. },
  258. },
  259. {
  260. field: 'showSubmitButton',
  261. defaultValue: true,
  262. component: 'Switch',
  263. label: '提交按钮',
  264. colProps: { span: 24 },
  265. componentProps: {
  266. size: 'small',
  267. },
  268. },
  269. ];
  270. export default defineComponent({
  271. components: {
  272. BasicForm,
  273. CollapseContainer,
  274. PageWrapper,
  275. Drawer,
  276. Space,
  277. },
  278. setup() {
  279. const visible = ref<boolean>(false);
  280. const settingFormRef = ref();
  281. const [registerSetting] = useForm({
  282. labelWidth: 80,
  283. schemas: formSchemas,
  284. compact: true,
  285. actionColOptions: { span: 24 },
  286. showActionButtonGroup: false,
  287. });
  288. const resetSettings = async () => {
  289. await settingFormRef.value?.resetFields();
  290. };
  291. const handleSubmitSetting = async (values: Recordable) => {
  292. await setProps(values);
  293. visible.value = false;
  294. };
  295. const [register, { setProps, setFieldsValue, updateSchema }] = useForm({
  296. labelWidth: 120,
  297. schemas,
  298. actionColOptions: { span: 24 },
  299. fieldMapToTime: [['fieldTime', ['startTime', 'endTime'], 'YYYY-MM']],
  300. });
  301. async function handleLoad() {
  302. const promiseFn = function () {
  303. return new Promise((resolve) => {
  304. setTimeout(() => {
  305. resolve({
  306. field9: ['430000', '430100', '430102'],
  307. province: '湖南省',
  308. city: '长沙市',
  309. district: '岳麓区',
  310. });
  311. }, 1000);
  312. });
  313. };
  314. const item = await promiseFn();
  315. const { field9, province, city, district } = item as any;
  316. await updateSchema({
  317. field: 'field9',
  318. componentProps: {
  319. displayRenderArray: [province, city, district],
  320. },
  321. });
  322. await setFieldsValue({ field9 });
  323. }
  324. const showDrawer = () => {
  325. visible.value = true;
  326. };
  327. const onSettings = () => {
  328. settingFormRef.value?.submit();
  329. };
  330. return {
  331. register,
  332. schemas,
  333. handleSubmit: (values: Recordable) => {
  334. console.log(values);
  335. },
  336. setProps,
  337. handleLoad,
  338. visible,
  339. showDrawer,
  340. settingFormRef,
  341. onSettings,
  342. resetSettings,
  343. registerSetting,
  344. handleSubmitSetting,
  345. };
  346. },
  347. });
  348. </script>