v3-schema-form
v0.4.0
Published
An engine that generates forms based on JSON Schema
Downloads
3
Readme
v3-schema-form 表单
基于 json-schema 协议,使用一段 json 配置化生成表单
vue3.0 中后台表单解决方案
对vant ui
的依赖是 peerDependency,默认用户是使用了 vant 的
Usage
<template>
<schema-form
ref="formRef"
v-model="formData"
:schema="schema"
/>
</template>
<script setup>
import { ref } from 'vue';
import SchemaForm , { FormRef } from 'v3-schema-form';
const formRef = ref<FormRef>()
const formData = ref({
userName: '王小明',
age: 18,
bio: '酷!',
});
const schema = {
type: '`object`',
properties: {
userName: {
type: '`string`',
title: '用户名',
required: true,
},
age: {
type: '`number`',
title: '年龄',
},
bio: {
type: '`string`',
title: '签名',
},
},
};
</script>
Props
Schema-form 组件的 props
| 属性名 | 类型 | 默认值 | 描述 |
| ------------------ | ----------------- | ------ | ------------------------------------------------------------------------- |
| schema | object
| {} | 表单协议配置 |
| v-model | object
| {} | 表单 data |
| disabled | boolean
| false | 全局禁用 |
| readonly | boolean
| false | 全局只读 |
| removeHiddenData | boolean
| false | getFormData 时是否过滤 hidden 为 true 的字段 |
| debug | boolean
| false | 表单值变更时,控制台输出日志 |
| displayType | 'row' | 'column' | 'row' | 统一指定 Label 与 Field 的展示关系,row 表示并排展示,column 表示两排展示 |
| border | boolean
| true | 是否展示边框 |
| inlineErrorMessage | boolean
| false | 是否在行内展示校验错误信息 |
Schema
表单的 schema 配置,基于json-schema 规范
| 属性名 | 类型 | 默认值 | 描述 |
| ----------- | ---------------------------------------------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------- |
| type | 'string
' | 'object
' | 'array
' | 'number
' | 'boolean
' | 'date' | {} | 表单协议配置 |
| title | string
| - | 用于渲染控件 label,title 为空时,label 不渲染 |
| border | boolean
| true | 是否展示边框 |
| required | boolean
| Function
| false | 是否必填,支持函数表达式 (formData)=> boolean
|
| placeholder | string
| - | 空值占位(需对应渲染控件支持 placeholder,才可生效) |
| disabled | boolean
| Function
| false | 是否禁用,支持函数表达式 (formData)=> boolean
|
| readonly | boolean
| Function
| false | 是否只读,支持函数表达式 (formData)=> boolean
|
| hidden | boolean
| Function
| false | 是否隐藏当前选项,支持函数表达式 (formData)=> boolean
|
| displayType | 'row' | 'column' | 'row' | 指定 Label 与 Field 的展示关系,row 表示并排展示,column 表示两排展示 |
| className | string
| - | 控件类名(用来做样式覆盖) |
| widget | string
| - | 指定使用哪个组件来渲染,除内置控件外,自定义控件需要注册才可使用 |
| enum | array
| - | 可用来生成组件的 options 的 value,例: [1,2] => [{label:1 , value:1},{label:2 , value:2}],可使用 enumNames 制定 label |
| enumNames | array
| - | 可用来生成组件的 options 的 label |
| rules | Rule
| Rule
[] | - | 指定组件校验逻辑, Rule |
Ref
可通过 ref 拿到组件暴露的方法
| 属性名 | 类型 | 描述 |
| -------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------ |
| getFormData | () => FormData | 获取表单数据(如果配置 removeHiddenData 则过滤掉 hidden 字段) |
| validate | (scrollToError?: boolean) => Promise<ErrorMessage[]>
| 触发整个表单校验(scrollToError 是否在提交表单且校验不通过时滚动至错误的表单项) |
| validateFields | (fields: string[], scrollToError?: boolean) => Promise<ErrorMessage[]>
| 校验单个字段 |
widgets
内置的控件
| 组件名称 | 值类型 | 描述 |
| ----------- | -------------------- | ------------------------------ |
| input | string
| 普通输入框,van-field 的封装 |
| checkbox | array
| 复选框 |
| switch | boolean
| 切换开关 |
| stepper | number
| 数字输入框,van-stepper 的封装 |
| radio | string
| number
| 单选框 |
| picker | string
| number
| 弹出选择器 |
| cascader | array
| 弹出-级联选择器 |
| date | string
| 日期选择器 |
| radioButton | string
| number
| 单选框(按钮选项) |
Rule
校验规则 基于async-validate
| 属性名 | 类型 | 默认值 | 描述 |
| --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ---------------------------------- |
| type | "string
" | "number
" | "boolean
" | "object
" | "enum" | "array
" | "date" | "pattern" | "url" | "email" | "method" | "regexp" | "integer" | "float" | "hex" | "any" | - | 校验值的类型 |
| message | string
| - | 自定义校验失败时对应的错误提示 |
| required | boolean
| false | 是否必填 |
| pattern | RegExp | string
| - | 正则校验 |
| min | number
| - | 值最小范围 ,用来校验number
|
| max | number
| - | 值最大范围 ,用来校验number
|
| len | number
| - | 值长度 ,用来校验array
|string
|
| validator | (rule: any) => boolean
| - | 自定义校验逻辑 |
Addon
自定义组件时,可在组件内部通过 useAddon hook 拿到当前组件的配置
| 属性名 | 类型 | 描 述 |
| ----------- | ----------------------- | -------------------------------------------------- |
| name | string
| 表单项的 key |
| rootSchema | Schema | 根节点的 schema |
| placeholder | string
| 占位符(当前节点 schema 配置时,可通过次属性拿到) |
| className | string
| 类名 |
| required | boolean
| 是否必填 |
| props | object
| 当前控件的 props 注入 |
| setFormData | (newFormData) => void
| 更新数据 |
| getFormData | () => any | 获取表单值 |
TODO
- Ui
- 字体大小,颜色,间距等使用 css 变量
- docs
- demo
- 自定义组件
- field
- 增加 title 字段
- 去除冗余 props 透传
- Cell 替换
- useAttrs 替代 props
- widget
- 从 props 中移除 addon, 使用 useAddon 来获取拓展属性
- 使用 useRegister 来注册组件
- schema
- showCellTitle