5.6.8 • Published 4 months ago

@cimom/vben-core-form-ui v5.6.8

Weekly downloads
-
License
MIT
Repository
github
Last release
4 months ago

Form UI 组件

Form UI 组件是一个基于 Vue 3 的高度可定制化表单组件,提供了丰富的表单项和布局选项,支持表单验证、联动和动态渲染等功能。

安装

npm install @cimom/vben-core-ui-kit-form-ui

基本使用

<script setup lang="ts">
import { VbenForm } from '@cimom/vben-core-ui-kit-form-ui';
import { ref } from 'vue';
import { z } from 'zod';

const formData = ref({
  username: '',
  password: '',
});

const schema = [
  {
    fieldName: 'username',
    label: '用户名',
    component: 'VbenInput',
    componentProps: {
      placeholder: '请输入用户名',
    },
    rules: z.string().min(3, '用户名至少3个字符'),
    required: true,
  },
  {
    fieldName: 'password',
    label: '密码',
    component: 'VbenInputPassword',
    componentProps: {
      placeholder: '请输入密码',
    },
    rules: z.string().min(6, '密码至少6个字符'),
    required: true,
  },
];

const handleSubmit = (values) => {
  console.log('表单提交:', values);
};

const handleReset = () => {
  console.log('表单重置');
};
</script>

<template>
  <VbenForm
    v-model="formData"
    :schema="schema"
    :handle-submit="handleSubmit"
    :handle-reset="handleReset"
  />
</template>

组件属性

VbenForm Props

属性名类型默认值说明
modelValueRecord<string, any>{}表单数据对象
schemaFormSchema[][]表单配置模式
layout'horizontal' \| 'vertical''horizontal'表单布局方式
collapsedbooleanfalse是否折叠表单
collapsedRowsnumber1折叠时显示的行数
showCollapseButtonbooleanfalse是否显示折叠按钮
showDefaultActionsbooleantrue是否显示默认的操作按钮
submitButtonOptionsActionButtonOptions{}提交按钮配置
resetButtonOptionsActionButtonOptions{}重置按钮配置
actionWrapperClassstring''操作按钮容器的类名
wrapperClassWrapperClassType'grid-cols-1'表单容器的类名
commonConfigFormCommonConfig{}公共配置
handleSubmitHandleSubmitFnundefined提交表单的处理函数
handleResetHandleResetFnundefined重置表单的处理函数
handleValuesChange(values: Record<string, any>, fieldsChanged: string[]) => voidundefined表单值变化的处理函数
submitOnChangebooleanfalse值变化时是否自动提交
submitOnEnterbooleanfalse按回车键是否自动提交

FormSchema 配置项

属性名类型说明
fieldNamestring字段名称(必填)
labelstring \| (() => Component \| string)标签文本
componentComponent \| string组件类型
componentPropsMaybeComponentProps \| ((value, actions) => MaybeComponentProps)组件属性
defaultValueany默认值
rulesFormSchemaRuleType验证规则
requiredboolean是否必填
helpstring \| (() => Component \| string)帮助信息
descriptionstring \| (() => Component \| string)描述信息
suffixstring \| (() => Component \| string)后缀内容
dependenciesFormItemDependencies依赖配置
renderComponentContentRenderComponentContentType自定义渲染组件内容

FormCommonConfig 公共配置

属性名类型默认值说明
disabledbooleanfalse是否禁用所有表单项
hideLabelbooleanfalse是否隐藏所有表单项的标签
labelWidthnumber-标签宽度
labelClassstring''标签类名
controlClassstring''控件类名
formItemClassstring''表单项类名
colonbooleanfalse是否在标签后显示冒号
hideRequiredMarkbooleanfalse是否隐藏必填标记
emptyStateValuenull \| undefinedundefined空状态值

表单项联动

可以通过 dependencies 属性设置表单项之间的联动关系:

<script setup>
const schema = [
  {
    fieldName: 'type',
    label: '类型',
    component: 'VbenSelect',
    componentProps: {
      options: [
        { label: '类型A', value: 'A' },
        { label: '类型B', value: 'B' },
      ],
    },
  },
  {
    fieldName: 'extraInfo',
    label: '额外信息',
    component: 'VbenInput',
    dependencies: {
      triggerFields: ['type'],
      show: (values) => values.type === 'B',
      required: (values) => values.type === 'B',
    },
  },
];
</script>

使用 API 方法

<script setup>
import { VbenForm, useVbenForm } from '@cimom/vben-core-ui-kit-form-ui';
import { ref } from 'vue';

const formRef = ref(null);
const { formApi } = useVbenForm(formRef);

// 使用表单API
const handleClick = () => {
  // 获取表单值
  const values = formApi.getValues();

  // 设置表单值
  formApi.setValues({ username: 'admin' });

  // 验证表单
  formApi.validate().then((result) => {
    if (result.valid) {
      console.log('表单验证通过');
    }
  });

  // 重置表单
  formApi.reset();
};
</script>

<template>
  <VbenForm ref="formRef" :schema="schema" />
  <button @click="handleClick">操作表单</button>
</template>

可用的表单API方法

方法名参数返回值说明
getValues-Record<string, any>获取表单所有值
getValue(name: string)any获取指定字段的值
setValues(values: Record<string, any>)void设置表单多个值
setValue(name: string, value: any)void设置指定字段的值
validate(names?: string[])Promise<{ valid: boolean, errors: Record<string, string> }>验证表单
reset(names?: string[])void重置表单
setFieldError(name: string, error: string)void设置字段错误信息
clearErrors(names?: string[])void清除错误信息
setFieldTouched(name: string, isTouched: boolean)void设置字段触摸状态
setFieldDisabled(name: string, disabled: boolean)void设置字段禁用状态

示例

基础表单示例

<template>
  <div class="p-4">
    <h2 class="mb-4 text-lg font-bold">基础表单</h2>
    <VbenForm
      v-model="formData"
      :schema="schema"
      :handle-submit="handleSubmit"
      :handle-reset="handleReset"
    />
  </div>
</template>

<script setup lang="ts">
import { VbenForm } from '@cimom/vben-core-ui-kit-form-ui';
import { ref } from 'vue';
import { z } from 'zod';

const formData = ref({
  username: '',
  password: '',
  remember: false,
});

const schema = [
  {
    fieldName: 'username',
    label: '用户名',
    component: 'VbenInput',
    componentProps: {
      placeholder: '请输入用户名',
    },
    rules: z.string().min(3, '用户名至少3个字符'),
    required: true,
  },
  {
    fieldName: 'password',
    label: '密码',
    component: 'VbenInputPassword',
    componentProps: {
      placeholder: '请输入密码',
    },
    rules: z.string().min(6, '密码至少6个字符'),
    required: true,
  },
  {
    fieldName: 'remember',
    label: '记住我',
    component: 'VbenCheckbox',
    defaultValue: false,
  },
];

const handleSubmit = (values) => {
  console.log('表单提交:', values);
};

const handleReset = () => {
  console.log('表单重置');
};
</script>

表单布局示例

<template>
  <div class="p-4">
    <h2 class="mb-4 text-lg font-bold">表单布局</h2>
    <div class="mb-4">
      <span class="mr-4">布局方式:</span>
      <label class="mr-2">
        <input type="radio" v-model="layout" value="horizontal" /> 水平
      </label>
      <label>
        <input type="radio" v-model="layout" value="vertical" /> 垂直
      </label>
    </div>
    <VbenForm
      v-model="formData"
      :schema="schema"
      :layout="layout"
      :wrapperClass="wrapperClass"
    />
  </div>
</template>

<script setup lang="ts">
import { VbenForm } from '@cimom/vben-core-ui-kit-form-ui';
import { ref } from 'vue';

const layout = ref('horizontal');
const wrapperClass = ref('grid-cols-1 md:grid-cols-2');

const formData = ref({
  name: '',
  age: '',
  address: '',
  email: '',
});

const schema = [
  {
    fieldName: 'name',
    label: '姓名',
    component: 'VbenInput',
  },
  {
    fieldName: 'age',
    label: '年龄',
    component: 'VbenInput',
  },
  {
    fieldName: 'address',
    label: '地址',
    component: 'VbenInput',
    formItemClass: 'md:col-span-2',
  },
  {
    fieldName: 'email',
    label: '邮箱',
    component: 'VbenInput',
    formItemClass: 'md:col-span-2',
  },
];
</script>