Skip to content

表单 Form

基础示例

vue
<template>
  <dc-form
    v-model="state.form"
    :schema="schema"
    v-bind="componentProps"
    @submit="onSubmit"
  />
</template>
<script lang="ts" setup>
import { reactive } from "vue";
const state = reactive({
  form: {} as any,
});
// custom form schema
const schema = [
  {
    label: "输入框",
    prop: "user",
  },
  {
    label: "密码",
    prop: "password",
    componentProps: {
      type: "password",
    },
  },
  {
    label: "数字",
    prop: "number",
    componentProps: {
      type: "number",
    },
  },
  {
    label: "图片上传",
    prop: "upload",
    type: "upload",
    componentProps: {
      action: "locahost:8000/upload",
    },
  },
  {
    label: "下拉列表",
    prop: "sex",
    type: "select",
    componentProps: {
      options: [
        {
          label: "男",
          value: "man",
        },
        {
          label: "女",
          value: "woman",
        },
      ],
    },
  },
  {
    label: "文本框",
    prop: "description",
    componentProps: {
      type: "textarea",
    },
  },
];

// ElForm props
const componentProps = {
  labelWidth: 100,
  statusIcon: true,
  inline: false,
};
function onSubmit(form: any) {
  console.log(form);
  // your submit options here
}
</script>

useForm Hook

vue
<template>
  <dc-form @register="registerForm" @submit="onSubmit" />
</template>
<script lang="ts" setup>
import { useForm } from "dcv-next";
// custom form schema
const schema = [
  {
    label: "输入框",
    prop: "user",
    rules: [
      {
        required: true,
        message: "请输入标题",
        trigger: "blur",
      },
    ],
  },
  {
    label: "密码",
    prop: "password",
    componentProps: {
      type: "password",
    },
    rules: [
      {
        required: true,
        message: "请输入密码",
        trigger: "blur",
      },
    ],
  },
  {
    label: "数字",
    prop: "number",
    componentProps: {
      type: "number",
    },
    rules: [
      {
        required: true,
        message: "请输入密码",
        trigger: "blur",
      },
    ],
  },
  {
    label: "下拉列表",
    prop: "sex",
    type: "select",
    componentProps: {
      options: [
        {
          label: "男",
          value: "man",
        },
        {
          label: "女",
          value: "woman",
        },
      ],
    },
    rules: [
      {
        required: true,
        message: "请输入密码",
        trigger: "blur",
      },
    ],
  },
  {
    label: "文本框",
    prop: "description",
    componentProps: {
      type: "textarea",
    },
    rules: [
      {
        required: true,
        message: "请输入密码",
        trigger: "blur",
      },
    ],
  },
];

const [registerForm] = useForm({
  schema: schema,
  componentProps: {
    labelWidth: 100,
    statusIcon: true,
    inline: false,
  },
});

function onSubmit(form: any) {
  console.log(form);
  // your submit options here
}
</script>

自定义

自定义表单字段可使用 model 获取当前表单数据, item 可返回当前表单项配置

vue
<template #slot="{ model, item }">
  <ElInput v-model="model.slot"></ElInput>
</template>
vue
<template>
  <dc-form @register="registerForm" @submit="onSubmit">
    <template #slot="{ model }">
      <p>this is slot</p>
      <ElInput v-model="model.slot" />
    </template>
  </dc-form>
</template>
<script lang="ts" setup>
import { useForm } from "dcv-next";
// custom form schema
const schema = [
  {
    label: "自定义",
    prop: "slot",
  },
];

const [registerForm] = useForm({
  schema: schema,
  componentProps: {
    labelWidth: 100,
    statusIcon: true,
    inline: false,
  },
});

function onSubmit(form: any) {
  console.log(form);
  // your submit options here
}
</script>

表单校验

vue
<template>
  <dc-form @register="registerForm" @submit="onSubmit" />
</template>
<script lang="ts" setup>
import { useForm } from "dcv-next";
// custom form schema
const schema = [
  {
    label: "输入框",
    prop: "user",
    rules: [
      {
        required: true,
        message: "请输入标题",
        trigger: "blur",
      },
    ],
  },
  {
    label: "密码",
    prop: "password",
    componentProps: {
      type: "password",
    },
    rules: [
      {
        required: true,
        message: "请输入密码",
        trigger: "blur",
      },
    ],
  },
  {
    label: "数字",
    prop: "number",
    componentProps: {
      type: "number",
    },
    rules: [
      {
        required: true,
        message: "请输入密码",
        trigger: "blur",
      },
    ],
  },
  {
    label: "下拉列表",
    prop: "sex",
    type: "select",
    componentProps: {
      options: [
        {
          label: "男",
          value: "man",
        },
        {
          label: "女",
          value: "woman",
        },
      ],
    },
    rules: [
      {
        required: true,
        message: "请输入密码",
        trigger: "blur",
      },
    ],
  },
  {
    label: "文本框",
    prop: "description",
    componentProps: {
      type: "textarea",
    },
    rules: [
      {
        required: true,
        message: "请输入密码",
        trigger: "blur",
      },
    ],
  },
];

const [registerForm] = useForm({
  schema: schema,
  componentProps: {
    labelWidth: 100,
    statusIcon: true,
    inline: false,
  },
});

function onSubmit(form: any) {
  console.log(form);
  // your submit options here
}
</script>

图片上传

vue
<template>
  <dc-form @register="registerForm" @submit="onSubmit" />
</template>
<script lang="ts" setup>
import { useForm } from "dcv-next";
// custom form schema
const schema = [
  {
    label: "图片上传",
    prop: "upload",
    type: "upload",
    componentProps: {
      action: "#",
    },
  },
];

const [registerForm] = useForm({
  schema: schema,
  componentProps: {
    labelWidth: 100,
    statusIcon: true,
    inline: false,
  },
});

function onSubmit(form: any) {
  console.log(form);
  // your submit options here
}
</script>

API

表单属性 Form Props

属性名称类型描述
modelValueObject表单数据
schemaArray表单项配置
componentPropsObject表单组件属性

表单项属性 FormItem Props

属性名称类型描述
labelString标签
propString属性值
rulesArray表单校验规则
componentPropsObject表单项组件属性

上传组件属性 Upload Props

属性名称类型描述
actionString上传请求地址

自定义属性 Slot Props

属性名称类型描述
modelobject当前表单数据
itemobject当前表单配置