api.vue 7.0 KB

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