Skip to content
On this page

BasicForm 表单

form 组件进行封装

如果文档内没有,可以尝试在在线示例内寻找

基础使用

useForm 方式

下面是一个简单表单的示例

vue
<template>
    <BasicForm @register="register" @submit="handleSubmit" @reset="handleReset"/>
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue';
import { BasicForm, FormSchema, useForm } from '@/components/Form/index';

const schemas: FormSchema[] = [
    {
        field: 'name',
        component: 'NInput',
        label: '姓名',
        labelMessage: '这是一个提示',
        defaultValue: '小马哥',
        componentProps: {
            placeholder: '请输入姓名',
            onInput: (e: any) => {
                console.log(e);
            },
        },
        rules: [{ required: true, message: '请输入姓名', trigger: ['blur'] }],
    }
];

export default defineComponent({
    components: { BasicForm },
    setup() {
        const formRef: any = ref(null);

        const [register, { setFieldsValue }] = useForm({
            gridProps: { cols: 1 },
            collapsedRows: 3,
            labelWidth: 120,
            layout: 'horizontal',
            schemas,
        });
        
        function handleSubmit(values: Recordable) {
            console.log(values);
        }

        function handleReset(values: Recordable) {
            console.log(values);
        }

        return {
            schemas,
            register,
            formRef,
            handleSubmit,
            handleReset,
        };
    },
});
</script>

template 方式

vue
<template>
    <BasicForm
        submitButtonText="提交预约"
        layout="horizontal"
        :gridProps="{ cols: 1 }"
        :schemas="schemas"
    >
        <template #statusSlot="{ model, field }">
            <n-input v-model:value="model[field]" />
        </template>
    </BasicForm>
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue';
import { BasicForm, FormSchema } from '@/components/Form/index';

const schemas: FormSchema[] = [
    {
        field: 'name',
        component: 'NInput',
        label: '姓名',
        labelMessage: '这是一个提示',
        defaultValue: '小马哥',
        componentProps: {
            placeholder: '请输入姓名',
            onInput: (e: any) => {
                console.log(e);
            },
        },
        rules: [{ required: true, message: '请输入姓名', trigger: ['blur'] }],
    }
];

export default defineComponent({
    components: { BasicForm },
    setup() {
        const formRef: any = ref(null);
        
        function handleSubmit(values: Recordable) {
            console.log(values);
        }

        function handleReset(values: Recordable) {
            console.log(values);
        }

        return {
            schemas,
            formRef,
            handleSubmit,
            handleReset,
        };
    },
});
</script>

useForm

form 组件还提供了 useForm,方便调用函数内部方法

参数介绍

ts
const [register, methods] = useForm(props);

参数 props 内的值可以是 computed 或者 ref 类型

register

register 用于注册 useForm,如果需要使用 useForm 提供的 api,必须将 register 传入组件的 onRegister

vue
<template>
  <BasicForm @register="register" @submit="handleSubmit" />
</template>
<script>
  export default defineComponent({
    components: { BasicForm },
    setup() {
      const [register] = useForm();
      return {
        register,
      };
    },
  });
</script>

Methods见下方说明

Methods

getFieldsValue

类型: () => Recordable;

说明: 获取表单值

setFieldsValue

类型: <T>(values: T) => Promise<void>

说明: 设置表单字段值

resetFields

类型: ()=> Promise<any>

说明: 重置表单值

validate

类型: (nameList?: NamePath[]) => Promise<any>

说明: 校验整个表单

submit

类型: () => Promise<void>

说明: 提交表单

clearValidate

类型: (name?: string | string[]) => Promise<void>

说明: 清空校验

setProps

TIP

设置表单的 props 可以直接在标签上传递,也可以使用 setProps,或者初始化直接写 useForm(props)

类型: (formProps: Partial<FormProps>) => Promise<void>

说明: 设置表单 Props

Props

温馨提醒

除以下参数外,官方文档内的 props 也都支持,具体可以参考 naiveui form

gridPropsgiProps 配置参考

属性类型默认值可选值说明版本
layoutstringfalseinline/Horizontal表单布局方式
schemasschema[]--表单配置,见下方 FormSchema 配置
submitOnResetbooleantrue-重置时是否提交表单
gridPropsPartial<grid>--配置表单栅格,详情见 grid组件
giPropsPartial<gi>--配置表单栅格,详情见 gi组件
baseGridStyleobject--配置 Grid 的 style 样式
isFullbooleantrue-组件是否width 100%,表单内所有组件适用
labelWidthnumber , string--form 内 label 宽度,表单内所有组件适用
labelPlacementstringleftleft/top标签位置
sizesmallmedium'large'向表单内所有组件传递 size 参数,自定义组件需自行实现 size 接收
collapsedbooleanfalsetrue/false是否折叠表单
collapsedRowsnumber1-默认展示的grid行数
disabledbooleanfalsetrue/false向表单内所有组件传递 disabled 属性
inlinebooleanfalsetrue/false是否展示为行内表单
showAdvancedButtonbooleanfalsetrue/false是否显示收起展开按钮
showActionButtonGroupbooleantruetrue/false是否显示操作按钮(重置/提交)
showResetButtonbooleantrue-是否显示重置按钮
resetButtonOptionsobject-重置按钮配置见下方 ActionButtonOption
showSubmitButtonbooleantrue-是否显示提交按钮
submitButtonOptionsobject-确认按钮配置见下方 ActionButtonOption
resetButtonTextstring重置-重置按钮文字
submitButtonTextstring查询-确认按钮文字
resetFunc () => Promise<void>-自定义重置按钮逻辑() => Promise<void>;
submitFunc () => Promise<void>-自定义提交按钮逻辑() => Promise<void>;

FormSchema

属性类型默认值可选值说明
fieldstring--字段名
labelstring--标签名
labelMessagestring , string[]--标签名右侧温馨提示
labelMessageStyleobject, string--标签名右侧样式
defaultValueany--所渲渲染组件的初始值
componentstring--组件类型,见下方 ComponentType
componentPropsany,()=>{}--所渲染的组件的 props 和 事件,请参考 naiveui 为了简化使用,和官方保持一致
slotstring--自定义 slot,渲染组件
suffixstring--组件后面的内容,返回值,{value,model,field}
rulesobject[]--校验规则 参考 naiveui form 组件 validation
giPropsPartial<gi>--配置表单栅格,详情见 gi组件
isFullbooleantrue-组件是否width 100%,优先级最高

ComponentType

温馨提醒

schema 内组件的可选类型,目前只测试了如下组件,实际上只要支持 v-model:value 表单组件理论上都支持,

组件存在子标签组件,需要单独增加,比如: 选项组 NCheckboxGroup 嵌套 NCheckbox 等...

tsx
export type ComponentType =
  | 'NInput'
  | 'InputNumber'
  | 'NSelect'
  | 'NRadioGroup'
  | 'NCheckbox'
  | 'NCheckboxGroup'
  | 'NDatePicker'
  | 'NSwitch';