RuleForm.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  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';
  19. import { useMessage } from '/@/hooks/web/useMessage';
  20. import { PageWrapper } from '/@/components/Page';
  21. import { isAccountExist } from '/@/api/demo/system';
  22. const schemas: FormSchema[] = [
  23. {
  24. field: 'field1',
  25. component: 'Input',
  26. label: '字段1',
  27. colProps: {
  28. span: 8,
  29. },
  30. required: true,
  31. },
  32. {
  33. field: 'field2',
  34. component: 'Input',
  35. label: '字段2',
  36. colProps: {
  37. span: 8,
  38. },
  39. required: true,
  40. },
  41. {
  42. field: 'id',
  43. label: 'id',
  44. required: true,
  45. defaultValue: 0,
  46. component: 'InputNumber',
  47. show: false,
  48. },
  49. {
  50. field: 'field3',
  51. component: 'DatePicker',
  52. label: '字段3',
  53. colProps: {
  54. span: 8,
  55. },
  56. required: true,
  57. },
  58. {
  59. field: 'field33',
  60. component: 'DatePicker',
  61. label: '字段33',
  62. colProps: {
  63. span: 8,
  64. },
  65. componentProps: {
  66. valueFormat: 'YYYY-MM-DD',
  67. },
  68. rules: [{ required: true, type: 'string' }],
  69. },
  70. {
  71. field: 'field44',
  72. component: 'InputCountDown',
  73. label: '验证码',
  74. colProps: {
  75. span: 8,
  76. },
  77. required: true,
  78. },
  79. {
  80. field: 'field4',
  81. component: 'Select',
  82. label: '字段4',
  83. colProps: {
  84. span: 8,
  85. },
  86. componentProps: {
  87. mode: 'multiple',
  88. options: [
  89. {
  90. label: '选项1',
  91. value: '1',
  92. key: '1',
  93. },
  94. {
  95. label: '选项2',
  96. value: '2',
  97. key: '2',
  98. },
  99. ],
  100. onChange: (value) => {
  101. console.log(value, '123');
  102. },
  103. },
  104. rules: [
  105. {
  106. required: true,
  107. message: '请输入aa',
  108. type: 'array',
  109. },
  110. ],
  111. },
  112. {
  113. field: 'field441',
  114. component: 'Input',
  115. label: '自定义校验',
  116. colProps: {
  117. span: 8,
  118. },
  119. rules: [
  120. {
  121. required: true,
  122. // @ts-ignore
  123. validator: async (rule, value) => {
  124. if (!value) {
  125. /* eslint-disable-next-line */
  126. return Promise.reject('值不能为空');
  127. }
  128. if (value === '1') {
  129. /* eslint-disable-next-line */
  130. return Promise.reject('值不能为1');
  131. }
  132. return Promise.resolve();
  133. },
  134. trigger: 'change',
  135. },
  136. ],
  137. },
  138. {
  139. field: 'field5',
  140. component: 'CheckboxGroup',
  141. label: '字段5',
  142. colProps: {
  143. span: 8,
  144. },
  145. componentProps: {
  146. options: [
  147. {
  148. label: '选项1',
  149. value: '1',
  150. },
  151. {
  152. label: '选项2',
  153. value: '2',
  154. },
  155. ],
  156. },
  157. rules: [{ required: true }],
  158. },
  159. {
  160. field: 'field7',
  161. component: 'RadioGroup',
  162. label: '字段7',
  163. colProps: {
  164. span: 8,
  165. },
  166. componentProps: {
  167. options: [
  168. {
  169. label: '选项1',
  170. value: '1',
  171. },
  172. {
  173. label: '选项2',
  174. value: '2',
  175. },
  176. ],
  177. },
  178. rules: [{ required: true, message: '覆盖默认生成的校验信息' }],
  179. },
  180. {
  181. field: 'field8',
  182. component: 'Input',
  183. label: '后端异步验证',
  184. colProps: {
  185. span: 8,
  186. },
  187. helpMessage: ['本字段演示异步验证', '本地规则:必须填写', '后端规则:不能包含admin'],
  188. rules: [
  189. {
  190. required: true,
  191. message: '请输入数据',
  192. },
  193. {
  194. validator(_, value) {
  195. return new Promise((resolve, reject) => {
  196. isAccountExist(value)
  197. .then(() => resolve())
  198. .catch((err) => {
  199. reject(err.message || '验证失败');
  200. });
  201. });
  202. },
  203. },
  204. ],
  205. },
  206. ];
  207. export default defineComponent({
  208. components: { BasicForm, CollapseContainer, PageWrapper },
  209. setup() {
  210. const { createMessage } = useMessage();
  211. const [
  212. register,
  213. { validateFields, clearValidate, getFieldsValue, resetFields, setFieldsValue },
  214. ] = useForm({
  215. labelWidth: 120,
  216. schemas,
  217. actionColOptions: {
  218. span: 24,
  219. },
  220. });
  221. async function validateForm() {
  222. try {
  223. const res = await validateFields();
  224. console.log('passing', res);
  225. } catch (error) {
  226. console.log('not passing', error);
  227. }
  228. }
  229. async function resetValidate() {
  230. clearValidate();
  231. }
  232. function getFormValues() {
  233. const values = getFieldsValue();
  234. createMessage.success('values:' + JSON.stringify(values));
  235. }
  236. function setFormValues() {
  237. setFieldsValue({
  238. field1: 1111,
  239. field4: ['1'],
  240. field5: ['1'],
  241. field7: '1',
  242. field33: '2020-12-12',
  243. field3: '2020-12-12',
  244. });
  245. }
  246. return {
  247. register,
  248. schemas,
  249. handleSubmit: (values: any) => {
  250. createMessage.success('click search,values:' + JSON.stringify(values));
  251. },
  252. getFormValues,
  253. setFormValues,
  254. validateForm,
  255. resetValidate,
  256. resetFields,
  257. };
  258. },
  259. });
  260. </script>