CustomerForm.vue 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. <template>
  2. <PageWrapper title="自定义组件示例">
  3. <CollapseContainer title="自定义表单">
  4. <BasicForm @register="register" @submit="handleSubmit">
  5. <template #f3="{ model, field }">
  6. <a-input v-model:value="model[field]" placeholder="自定义slot" />
  7. </template>
  8. </BasicForm>
  9. </CollapseContainer>
  10. </PageWrapper>
  11. </template>
  12. <script lang="ts">
  13. import { defineComponent, h } from 'vue';
  14. import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
  15. import { CollapseContainer } from '/@/components/Container/index';
  16. import { useMessage } from '/@/hooks/web/useMessage';
  17. import { Input } from 'ant-design-vue';
  18. import { PageWrapper } from '/@/components/Page';
  19. const schemas: FormSchema[] = [
  20. {
  21. field: 'field1',
  22. component: 'Input',
  23. label: 'render方式',
  24. colProps: {
  25. span: 8,
  26. },
  27. rules: [{ required: true }],
  28. render: ({ model, field }) => {
  29. return h(Input, {
  30. placeholder: '请输入',
  31. value: model[field],
  32. onChange: (e: ChangeEvent) => {
  33. model[field] = e.target.value;
  34. },
  35. });
  36. },
  37. },
  38. {
  39. field: 'field2',
  40. component: 'Input',
  41. label: 'render组件slot',
  42. colProps: {
  43. span: 8,
  44. },
  45. rules: [{ required: true }],
  46. renderComponentContent: () => {
  47. return {
  48. suffix: () => 'suffix',
  49. };
  50. },
  51. },
  52. {
  53. field: 'field3',
  54. component: 'Input',
  55. label: '自定义Slot',
  56. slot: 'f3',
  57. colProps: {
  58. span: 8,
  59. },
  60. rules: [{ required: true }],
  61. },
  62. ];
  63. export default defineComponent({
  64. components: { BasicForm, CollapseContainer, PageWrapper },
  65. setup() {
  66. const { createMessage } = useMessage();
  67. const [register, { setProps }] = useForm({
  68. labelWidth: 120,
  69. schemas,
  70. actionColOptions: {
  71. span: 24,
  72. },
  73. });
  74. return {
  75. register,
  76. schemas,
  77. handleSubmit: (values: any) => {
  78. createMessage.success('click search,values:' + JSON.stringify(values));
  79. },
  80. setProps,
  81. };
  82. },
  83. });
  84. </script>