api.vue 6.5 KB

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