api.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. <script lang="ts" setup>
  2. import type { RefSelectProps } from 'ant-design-vue/es/select';
  3. import { ref } from 'vue';
  4. import { Page } from '@vben/common-ui';
  5. import { Button, Card, message, Space } from 'ant-design-vue';
  6. import { useVbenForm } from '#/adapter/form';
  7. const isReverseActionButtons = ref(false);
  8. const [BaseForm, formApi] = useVbenForm({
  9. // 翻转操作按钮的位置
  10. actionButtonsReverse: isReverseActionButtons.value,
  11. // 所有表单项共用,可单独在表单内覆盖
  12. commonConfig: {
  13. // 所有表单项
  14. componentProps: {
  15. class: 'w-full',
  16. },
  17. },
  18. // 使用 tailwindcss grid布局
  19. // 提交函数
  20. handleSubmit: onSubmit,
  21. // 垂直布局,label和input在不同行,值为vertical
  22. layout: 'horizontal',
  23. // 水平布局,label和input在同一行
  24. schema: [
  25. {
  26. // 组件需要在 #/adapter.ts内注册,并加上类型
  27. component: 'Input',
  28. // 对应组件的参数
  29. componentProps: {
  30. placeholder: '请输入用户名',
  31. },
  32. // 字段名
  33. fieldName: 'field1',
  34. // 界面显示的label
  35. label: 'field1',
  36. },
  37. {
  38. component: 'Input',
  39. componentProps: {
  40. placeholder: '请输入',
  41. },
  42. fieldName: 'field2',
  43. label: 'field2',
  44. },
  45. {
  46. component: 'Select',
  47. componentProps: {
  48. allowClear: true,
  49. filterOption: true,
  50. options: [
  51. {
  52. label: '选项1',
  53. value: '1',
  54. },
  55. {
  56. label: '选项2',
  57. value: '2',
  58. },
  59. ],
  60. placeholder: '请选择',
  61. showSearch: true,
  62. },
  63. fieldName: 'fieldOptions',
  64. label: '下拉选',
  65. },
  66. ],
  67. // 大屏一行显示3个,中屏一行显示2个,小屏一行显示1个
  68. wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',
  69. });
  70. function onSubmit(values: Record<string, any>) {
  71. message.success({
  72. content: `form values: ${JSON.stringify(values)}`,
  73. });
  74. }
  75. function handleClick(
  76. action:
  77. | 'batchAddSchema'
  78. | 'batchDeleteSchema'
  79. | 'componentRef'
  80. | 'disabled'
  81. | 'hiddenAction'
  82. | 'hiddenResetButton'
  83. | 'hiddenSubmitButton'
  84. | 'labelWidth'
  85. | 'resetDisabled'
  86. | 'resetLabelWidth'
  87. | 'reverseActionButtons'
  88. | 'showAction'
  89. | 'showResetButton'
  90. | 'showSubmitButton'
  91. | 'updateActionAlign'
  92. | 'updateResetButton'
  93. | 'updateSchema'
  94. | 'updateSubmitButton',
  95. ) {
  96. switch (action) {
  97. case 'batchAddSchema': {
  98. formApi.setState((prev) => {
  99. const currentSchema = prev?.schema ?? [];
  100. const newSchema = [];
  101. for (let i = 0; i < 3; i++) {
  102. newSchema.push({
  103. component: 'Input',
  104. componentProps: {
  105. placeholder: '请输入',
  106. },
  107. fieldName: `field${i}${Date.now()}`,
  108. label: `field+`,
  109. });
  110. }
  111. return {
  112. schema: [...currentSchema, ...newSchema],
  113. };
  114. });
  115. break;
  116. }
  117. case 'batchDeleteSchema': {
  118. formApi.setState((prev) => {
  119. const currentSchema = prev?.schema ?? [];
  120. return {
  121. schema: currentSchema.slice(0, -3),
  122. };
  123. });
  124. break;
  125. }
  126. case 'componentRef': {
  127. // 获取下拉组件的实例,并调用它的focus方法
  128. formApi.getFieldComponentRef<RefSelectProps>('fieldOptions')?.focus?.();
  129. break;
  130. }
  131. case 'disabled': {
  132. formApi.setState({ commonConfig: { disabled: true } });
  133. break;
  134. }
  135. case 'hiddenAction': {
  136. formApi.setState({ showDefaultActions: false });
  137. break;
  138. }
  139. case 'hiddenResetButton': {
  140. formApi.setState({ resetButtonOptions: { show: false } });
  141. break;
  142. }
  143. case 'hiddenSubmitButton': {
  144. formApi.setState({ submitButtonOptions: { show: false } });
  145. break;
  146. }
  147. case 'labelWidth': {
  148. formApi.setState({
  149. commonConfig: {
  150. labelWidth: 150,
  151. },
  152. });
  153. break;
  154. }
  155. case 'resetDisabled': {
  156. formApi.setState({ commonConfig: { disabled: false } });
  157. break;
  158. }
  159. case 'resetLabelWidth': {
  160. formApi.setState({
  161. commonConfig: {
  162. labelWidth: 100,
  163. },
  164. });
  165. break;
  166. }
  167. case 'reverseActionButtons': {
  168. isReverseActionButtons.value = !isReverseActionButtons.value;
  169. formApi.setState({ actionButtonsReverse: isReverseActionButtons.value });
  170. break;
  171. }
  172. case 'showAction': {
  173. formApi.setState({ showDefaultActions: true });
  174. break;
  175. }
  176. case 'showResetButton': {
  177. formApi.setState({ resetButtonOptions: { show: true } });
  178. break;
  179. }
  180. case 'showSubmitButton': {
  181. formApi.setState({ submitButtonOptions: { show: true } });
  182. break;
  183. }
  184. case 'updateActionAlign': {
  185. formApi.setState({
  186. // 可以自行调整class
  187. actionWrapperClass: 'text-center',
  188. });
  189. break;
  190. }
  191. case 'updateResetButton': {
  192. formApi.setState({
  193. resetButtonOptions: { disabled: true },
  194. });
  195. break;
  196. }
  197. case 'updateSchema': {
  198. formApi.updateSchema([
  199. {
  200. componentProps: {
  201. options: [
  202. {
  203. label: '选项1',
  204. value: '1',
  205. },
  206. {
  207. label: '选项2',
  208. value: '2',
  209. },
  210. {
  211. label: '选项3',
  212. value: '3',
  213. },
  214. ],
  215. },
  216. fieldName: 'fieldOptions',
  217. },
  218. ]);
  219. message.success('字段 `fieldOptions` 下拉选项更新成功。');
  220. break;
  221. }
  222. case 'updateSubmitButton': {
  223. formApi.setState({
  224. submitButtonOptions: { loading: true },
  225. });
  226. break;
  227. }
  228. }
  229. }
  230. </script>
  231. <template>
  232. <Page description="表单组件api操作示例。" title="表单组件">
  233. <Space class="mb-5 flex-wrap">
  234. <Button @click="handleClick('updateSchema')">updateSchema</Button>
  235. <Button @click="handleClick('labelWidth')">更改labelWidth</Button>
  236. <Button @click="handleClick('resetLabelWidth')">还原labelWidth</Button>
  237. <Button @click="handleClick('disabled')">禁用表单</Button>
  238. <Button @click="handleClick('resetDisabled')">解除禁用</Button>
  239. <Button @click="handleClick('reverseActionButtons')">
  240. 翻转操作按钮位置
  241. </Button>
  242. <Button @click="handleClick('hiddenAction')">隐藏操作按钮</Button>
  243. <Button @click="handleClick('showAction')">显示操作按钮</Button>
  244. <Button @click="handleClick('hiddenResetButton')">隐藏重置按钮</Button>
  245. <Button @click="handleClick('showResetButton')">显示重置按钮</Button>
  246. <Button @click="handleClick('hiddenSubmitButton')">隐藏提交按钮</Button>
  247. <Button @click="handleClick('showSubmitButton')">显示提交按钮</Button>
  248. <Button @click="handleClick('updateResetButton')">修改重置按钮</Button>
  249. <Button @click="handleClick('updateSubmitButton')">修改提交按钮</Button>
  250. <Button @click="handleClick('updateActionAlign')">
  251. 调整操作按钮位置
  252. </Button>
  253. <Button @click="handleClick('batchAddSchema')"> 批量添加表单项 </Button>
  254. <Button @click="handleClick('batchDeleteSchema')">
  255. 批量删除表单项
  256. </Button>
  257. <Button @click="handleClick('componentRef')">下拉组件获取焦点</Button>
  258. </Space>
  259. <Card title="操作示例">
  260. <BaseForm />
  261. </Card>
  262. </Page>
  263. </template>