RuleForm.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. <template>
  2. <PageWrapper title="表单校验示例">
  3. <div class="mb-4">
  4. <a-button @click="validateForm" class="mr-2"> 手动校验表单 </a-button>
  5. <a-button @click="resetValidate" class="mr-2"> 清空校验信息 </a-button>
  6. <a-button @click="getFormValues" class="mr-2"> 获取表单值 </a-button>
  7. <a-button @click="setFormValues" class="mr-2"> 设置表单值 </a-button>
  8. <a-button @click="resetFields" class="mr-2"> 重置 </a-button>
  9. </div>
  10. <CollapseContainer title="表单校验">
  11. <BasicForm @register="register" @submit="handleSubmit" />
  12. </CollapseContainer>
  13. </PageWrapper>
  14. </template>
  15. <script lang="ts">
  16. import { defineComponent } from 'vue';
  17. import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
  18. import { CollapseContainer } from '/@/components/Container/index';
  19. import { useMessage } from '/@/hooks/web/useMessage';
  20. import { PageWrapper } from '/@/components/Page';
  21. const schemas: FormSchema[] = [
  22. {
  23. field: 'field1',
  24. component: 'Input',
  25. label: '字段1',
  26. colProps: {
  27. span: 8,
  28. },
  29. required: true,
  30. },
  31. {
  32. field: 'field2',
  33. component: 'Input',
  34. label: '字段2',
  35. colProps: {
  36. span: 8,
  37. },
  38. required: true,
  39. },
  40. {
  41. field: 'id',
  42. label: 'id',
  43. required: true,
  44. defaultValue: 0,
  45. component: 'InputNumber',
  46. show: false,
  47. },
  48. {
  49. field: 'field3',
  50. component: 'DatePicker',
  51. label: '字段3',
  52. colProps: {
  53. span: 8,
  54. },
  55. required: true,
  56. },
  57. {
  58. field: 'field44',
  59. component: 'InputCountDown',
  60. label: '验证码',
  61. colProps: {
  62. span: 8,
  63. },
  64. required: true,
  65. },
  66. {
  67. field: 'field4',
  68. component: 'Select',
  69. label: '字段4',
  70. colProps: {
  71. span: 8,
  72. },
  73. componentProps: {
  74. mode: 'multiple',
  75. options: [
  76. {
  77. label: '选项1',
  78. value: '1',
  79. key: '1',
  80. },
  81. {
  82. label: '选项2',
  83. value: '2',
  84. key: '2',
  85. },
  86. ],
  87. },
  88. rules: [
  89. {
  90. required: true,
  91. message: '请输入aa',
  92. type: 'array',
  93. },
  94. ],
  95. },
  96. {
  97. field: 'field44',
  98. component: 'Input',
  99. label: '自定义校验',
  100. colProps: {
  101. span: 8,
  102. },
  103. rules: [
  104. {
  105. required: true,
  106. // @ts-ignore
  107. validator: async (rule, value) => {
  108. if (!value) {
  109. /* eslint-disable-next-line */
  110. return Promise.reject('值不能为空');
  111. }
  112. if (value === '1') {
  113. /* eslint-disable-next-line */
  114. return Promise.reject('值不能为1');
  115. }
  116. return Promise.resolve();
  117. },
  118. trigger: 'change',
  119. },
  120. ],
  121. },
  122. {
  123. field: 'field5',
  124. component: 'CheckboxGroup',
  125. label: '字段5',
  126. colProps: {
  127. span: 8,
  128. },
  129. componentProps: {
  130. options: [
  131. {
  132. label: '选项1',
  133. value: '1',
  134. },
  135. {
  136. label: '选项2',
  137. value: '2',
  138. },
  139. ],
  140. },
  141. rules: [{ required: true }],
  142. },
  143. {
  144. field: 'field7',
  145. component: 'RadioGroup',
  146. label: '字段7',
  147. colProps: {
  148. span: 8,
  149. },
  150. componentProps: {
  151. options: [
  152. {
  153. label: '选项1',
  154. value: '1',
  155. },
  156. {
  157. label: '选项2',
  158. value: '2',
  159. },
  160. ],
  161. },
  162. rules: [{ required: true, message: '覆盖默认生成的校验信息' }],
  163. },
  164. ];
  165. export default defineComponent({
  166. components: { BasicForm, CollapseContainer, PageWrapper },
  167. setup() {
  168. const { createMessage } = useMessage();
  169. const [
  170. register,
  171. { validateFields, clearValidate, getFieldsValue, resetFields, setFieldsValue },
  172. ] = useForm({
  173. labelWidth: 120,
  174. schemas,
  175. actionColOptions: {
  176. span: 24,
  177. },
  178. });
  179. async function validateForm() {
  180. try {
  181. const res = await validateFields();
  182. console.log('passing', res);
  183. } catch (error) {
  184. console.log('not passing', error);
  185. }
  186. }
  187. async function resetValidate() {
  188. clearValidate();
  189. }
  190. function getFormValues() {
  191. const values = getFieldsValue();
  192. createMessage.success('values:' + JSON.stringify(values));
  193. }
  194. function setFormValues() {
  195. setFieldsValue({
  196. field1: 1111,
  197. field5: ['1'],
  198. field7: '1',
  199. });
  200. }
  201. return {
  202. register,
  203. schemas,
  204. handleSubmit: (values: any) => {
  205. createMessage.success('click search,values:' + JSON.stringify(values));
  206. },
  207. getFormValues,
  208. setFormValues,
  209. validateForm,
  210. resetValidate,
  211. resetFields,
  212. };
  213. },
  214. });
  215. </script>