@schemx/vant
@schemx/vant
@schemx/vant 是 Schemx 的 Vant 4 Renderer 集合。根入口提供 Vant Renderer、Registry 和布局组件,并重新导出 Vue 与 Core 的公开 API;导入根入口时会通过 configureSchemx() 写入 Vant 的模块级全局默认配置,也可以通过 Form Props 或 ConfigProvider 覆盖。
适用于 Vue 3 + Vant 4 的移动端 Schema 表单。使用 Element Plus 时请改用 @schemx/element-plus;使用其他组件库或自研控件时,可使用 @schemx/vue 并自行注册 Renderer。
@schemx/vant 不导出独立的 Cell 公共组件;内置弹窗 Renderer 使用 Vant 的 Cell,自定义 Renderer 的只读 / 禁用状态包装请使用 @schemx/vue 的 Wrapper。
安装
pnpm add @schemx/vant vant vue
@schemx/vue 和 @schemx/core 会随 @schemx/vant 自动安装;vant 和 vue 是 peer dependencies,需要由业务项目显式安装。Schemx 的样式由 ESM 根入口自动加载;Vant 自身样式需按项目现有方案加载:
import "vant/lib/index.css"
若使用 CommonJS,或构建工具未处理入口 CSS import,请显式导入:
import "vant/lib/index.css"
import "@schemx/vue/style.css"
import "@schemx/vant/style.css"
样式顺序为“Vant 基础样式 → Schemx Vue 结构样式 → Vant 适配样式”。Vant 适配包默认使用单列布局、标签右对齐、普通字段内容左对齐,只读字段内容右对齐,并使用移动端分隔线;可通过 Form Props 或 ConfigProvider 覆盖。
若业务代码直接导入 @schemx/vue、@schemx/core 或其公开子路径(例如 @schemx/vue/style.css),也应在项目中显式声明对应包。
快速开始
<script setup lang="ts">
import { ref } from "vue"
import Schemx from "@schemx/vant"
import type { SchemxField } from "@schemx/vant"
type ProfileValues = {
name: string
city: string
notification: boolean
}
const modelValue = ref<ProfileValues>({
name: "",
city: "",
notification: true,
})
const schemas: SchemxField<ProfileValues>[] = [
{
name: "name",
label: "姓名",
componentType: "input",
required: true,
componentProps: {
placeholder: "请输入姓名",
clearable: true,
},
},
{
name: "city",
label: "城市",
componentType: "picker",
componentProps: {
options: [
{ text: "杭州", value: "hangzhou" },
{ text: "上海", value: "shanghai" },
],
},
},
{
name: "notification",
label: "接收通知",
componentType: "switch",
},
]
</script>
<template>
<Schemx v-model="modelValue" :schemas="schemas" />
</template>
Group 与 Dependency 容器
Vant 适配层直接消费 Core 解析后的容器状态,因此 Group 和 Dependency 均可统一控制后代 Vant Renderer 的可见、只读和禁用状态。折叠只属于 Group 的展示行为,不会改变字段值或校验语义。
const schemas: SchemxField[] = [
{ name: "editable", label: "允许编辑", componentType: "switch", initialValue: true },
{
key: "shipping",
label: "配送信息",
collapsible: true,
destroyOnCollapse: false,
dependencies: {
triggerFields: ["editable"],
readonly: (values) => !values.editable,
},
children: [{ name: "address", label: "地址", componentType: "input" }],
},
]
Dependency 使用 to 生成或更新动态子树,使用 dependencies 改变整棵子树状态;两条链路相互独立。容器 dependencies 只支持 visible、readonly、disabled,不支持字段 dependencies 的 trigger、rules 或 componentProps。可运行的操作示例见 Vant 示例项目 中的“动态表单”和“字段联动”。
动态数组
Dynamic 数组字段使用必填的 key、数组路径 name 和行模板 item。item 中的普通字段和 Group 使用相对路径,Vant 表单会根据当前数组索引渲染每一行;新增、删除和移动通过 setFieldValue(path, updater) 操作数组值。
import { useForm, type SchemxField } from "@schemx/vant"
type Member = { name: string; role: "developer" | "designer" }
type TeamValues = { members: Member[] }
const schemas: SchemxField<TeamValues>[] = [
{
key: "members",
name: "members",
label: "团队成员",
item: [
{
key: "member",
label: "成员信息",
children: [
{ name: "name", label: "姓名", componentType: "input" },
{
name: "role",
label: "角色",
componentType: "selector",
componentProps: {
options: [
{ label: "开发", value: "developer" },
{ label: "设计", value: "designer" },
],
},
},
],
},
],
},
]
const form = useForm<TeamValues>({
initialValues: { members: [{ name: "张三", role: "developer" }] },
schemas,
})
form.setFieldValue("members", (members) => [
...(members ?? []),
{ name: "李四", role: "designer" },
])
Dynamic 容器的 visible、readonly、disabled 和 dependencies 会递归作用于每行的后代字段。行内模板可以包含普通字段、Group 和 Dependency,但不能嵌套 Dynamic;行内 Dependency 的 to 使用完整表单路径,renderer 返回的子 Schema 使用当前行相对路径。Vant 不会自动提供数组操作按钮,业务代码需要自行实现。
Renderer 总览
下表顺序与根入口导出的 DEFAULT_RENDERER_TYPES 完全一致。Dictionary 的“完整支持”表示运行时存在 WithRemoteOptions 包装,且 packages/vant/src/types/schemx.ts 同时为 Schema componentProps 注入 SchemxWithDictionary。
componentType |
导出组件 | Value 类型 | Option 类型 | Dictionary | 主要 Vant 组件 |
|---|---|---|---|---|---|
input |
InputRenderer |
InputValue |
— | 不支持 | Vant Field |
text |
TextRenderer |
TextValue |
— | 不支持 | Vant Field、Icon |
textarea |
TextAreaRenderer |
TextAreaValue |
— | 不支持 | Vant Field |
number |
NumberRenderer |
NumberValue |
— | 不支持 | Vant Field |
switch |
SwitchRenderer |
SwitchValue |
— | 不支持 | Vant Switch |
radio |
RadioRenderer |
RadioValue |
RadioOption |
完整支持 | Vant RadioGroup、Radio |
checkbox |
CheckboxRenderer |
CheckboxValue |
CheckboxOption |
完整支持 | Vant CheckboxGroup、Checkbox |
date |
DateRenderer |
DateValue |
— | 不支持 | Vant DatePicker、Popup、Cell |
calendar |
CalendarRenderer |
CalendarValue |
— | 不支持 | Vant Calendar、Cell |
picker |
PickerRenderer |
PickerValue |
Vant PickerOption(未从本包导出) |
完整支持 | Vant Picker、Popup、Cell |
selectPicker |
SelectPickerRenderer |
SelectPickerValue |
SelectPickerOption |
完整支持 | Vant Popup、Checkbox / Radio、Button、Cell |
selector |
SelectorRenderer |
SelectValue |
SelectorOption |
完整支持 | 包内 Selector |
sensitiveInput |
SensitiveInputRenderer |
SensitiveInputValue |
— | 不支持 | Vant Field、Icon |
rate |
RateRenderer |
RateValue |
— | 不支持 | Vant Rate |
slider |
SliderRenderer |
SliderValue |
— | 不支持 | Vant Slider |
stepper |
StepperRenderer |
StepperValue |
— | 不支持 | Vant Stepper |
upload |
UploadRenderer |
UploadValue |
UploadFile(文件项) |
不支持 | Vant Uploader、ImagePreview |
cascader |
CascaderRenderer |
CascaderValue |
Vant CascaderOption(未从本包导出) |
完整支持 | Vant Cascader、Popup、Cell |
全部 Renderer 都接受 Schemx 字段上下文提供的基础契约。下文只列继承来源、排除或重写字段,以及本包显式增加的字段;Vant 的完整通用 Props 请查阅 Vant 文档。
Dictionary
支持范围与优先级
radio、checkbox、picker、selectPicker、selector、cascader 在类型与运行时都支持 dict。WithRemoteOptions 在存在 dict 时调用 useDictionary,把结果注入为 options,并注入 loading;此时远程结果替代静态 options。没有 dict 时直接使用传入的静态 options。
cascader 的根导出通过 WithRemoteOptions 包装,静态 options 和 Dictionary 产生的远程选项都会传给 Vant <Cascader>,也会用于展示标签路径映射。其 Schema 类型同样注入了 SchemxWithDictionary,因此可以像其他支持 Dictionary 的选择 Renderer 一样配置 dict。
SchemxDictionary 字段
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
api |
(values, form, signal?) => R | Promise<R> |
必填 | 获取原始数据;接收当前表单值、实例和可选的 AbortSignal。 |
formatter |
(res, form) => TOption[] | Promise<TOption[]> |
— | 把 API 响应转换为 Renderer 所需的选项数组。 |
dependsOn |
NamePath[] |
— | 依赖字段变化后重新加载。 |
shouldFetch |
(values) => boolean |
始终执行 | 返回 false 时跳过请求并清空选项。 |
immediate |
boolean |
true |
是否在挂载后立即加载。 |
resetOnDepsChange |
boolean |
false |
依赖变化时清空当前字段;Vant 内建 Dictionary Renderer 会自动从 Field 的字段 Context 取得目标路径。 |
retryCount |
number |
0 |
失败重试次数。 |
retryInterval |
number |
1000 |
重试间隔,单位为毫秒。 |
onSuccess |
(data, form) => void |
— | 格式化并写入选项后触发。 |
onError |
(error, form) => void |
— | 最终失败后触发。 |
onDepsChange |
(values, form) => void |
— | 依赖变化后、shouldFetch 判断前触发。 |
每次 loadDict() 都会递增请求计数并中止上一次仍在进行的请求。api 声明第三个参数时会收到当前请求的 AbortSignal;重试等待也可被中止。过期请求的成功结果、异步 formatter 结果和错误都不会写入当前状态;shouldFetch 返回 false 时会清空选项并结束加载。底层 API 是否真正停止仍取决于它是否使用 AbortSignal,不要把请求中止等同于业务服务端已经取消处理。
resetOnDepsChange 仍以 useDictionary(options, fieldName) 的第二参数作为底层重置目标。支持 Dictionary 的 Vant Renderer 经 WithRemoteOptions 包装后,会在 Field 内自动从字段 Context 取得当前 Schema 字段路径,因此严格类型的 Schema 只需配置 dict,无需声明或传入内部 fieldName。自定义 Renderer 若直接调用 useDictionary(),或将 HOC 脱离 Field 使用,仍可显式传入 fieldName。此边界与 @schemx/vue README 的 useDictionary / WithRemoteOptions 说明一致。
可复制的依赖联动示例
import type { SchemxField } from "@schemx/vant"
type AddressValues = {
province: string
city: string
}
type CityResponse = {
id: string
name: string
}[]
export const addressSchemas: SchemxField<AddressValues>[] = [
{
name: "province",
label: "省份",
componentType: "picker",
componentProps: {
options: [
{ text: "浙江", value: "zhejiang" },
{ text: "江苏", value: "jiangsu" },
],
},
},
{
name: "city",
label: "城市",
componentType: "selectPicker",
componentProps: {
type: "radio",
dict: {
api: async (values: AddressValues): Promise<CityResponse> => {
const response = await fetch(`/api/cities?province=${values.province}`)
return response.json()
},
formatter: (rows: CityResponse) =>
rows.map((row) => ({ label: row.name, value: row.id })),
dependsOn: ["province"],
shouldFetch: (values: AddressValues) => Boolean(values.province),
},
},
},
]
Renderer API
每个 Renderer 都是可直接注册到 rendererRegistry 的 Vue 组件,并从根入口导出对应的组件和 Props 类型。Schema 中使用 componentType 选择 Renderer,具体参数放在 componentProps 中;下列小节只列出各 Renderer 的值类型、Schemx 注入项和 Vant 专属配置。
单独挂载 Renderer 时,表中 onChange、onBlur 等回调由 Renderer 自身处理;通过 <Schemx> 使用时,@schemx/vue 的 Field 会注入统一的字段回调,并在其中调用 componentProps 和 Schema 顶层回调。需要异步替换值或等待 Renderer 内部 loading 的场景,应按对应 Renderer 的独立组件契约接入。
内置 Renderer
以下 Renderer 由 @schemx/vant 注册到与 @schemx/vue 共用的全局 Registry;导入 Vant 根入口后可直接写入 Schema 的 componentType,也可以将独立 Registry 传给 Form 或 ConfigProvider 创建隔离配置。
componentType |
值形态 | 用途与关键 componentProps |
|---|---|---|
input |
字符串 | 通用单行输入。可配置 type、maxlength、clearable、formatter、图标和字数统计。 |
text |
字符串 | 文本输入,type: "password" 时内置密码显隐切换。支持 clearable、formatter、图标和字数统计。 |
textarea |
字符串 | 多行文本输入。使用 rows、autosize(或兼容别名 autoSize)、maxlength 和 showWordLimit。 |
sensitiveInput |
字符串 | 脱敏文本输入。使用 maskFormatter、revealed、defaultRevealed、revealable 和 hideOnBlur 控制完整值展示。 |
number |
字符串 | 数字或整数键盘输入。使用 type: "number" | "digit"、min、max、maxlength 和 clearable。 |
switch |
boolean、字符串或数字 |
开关选择。使用 activeValue、inactiveValue、activeText、inactiveText;onChange 可返回 Promise。 |
radio |
单个选项值 | 单选组。使用 options 和 fieldNames 配置选项及其标签、值、禁用字段。 |
checkbox |
选项值数组或字符串 | 多选组。使用 options 和 fieldNames 配置选项;单个选项可独立设置 Vant Checkbox Props。 |
picker |
单值或列值数组 | 底部弹窗选择器。使用 options 或 Vant 原生 columns,并可配置 fieldNames、showAllLevels、separator、popupProps。 |
selectPicker |
单值或选项值数组 | 单选/多选弹窗。使用 type: "radio" | "checkbox"、options、fieldNames、title 和 popupProps。 |
selector |
单值或选项值数组 | 行内选项选择器。使用 options、multiple 和 fieldNames;适合不需要弹窗的选项组。 |
cascader |
级联路径数组 | 级联选择弹窗。使用 options、fieldNames、showAllLevels、separator、title 和 popupProps。 |
date |
字符串、字符串数组或 Date |
底部日期/时间选择器。使用 Vant DatePicker Props、format、title、popupProps 和 onConfirm。 |
calendar |
字符串、字符串数组、Date 或 Date[] |
日历选择。通过 type: "single" | "range" | "multiple" 指定选择模式,并使用 format、title、separator。 |
rate |
数字 | 星级评分。使用 count、allowHalf 及 Vant Rate Props。 |
slider |
数字或数值范围 | 滑块选择。使用 min、max、step 和 range。 |
stepper |
数字 | 步进器。使用 min、max、step、integer、decimalLength 和 allowEmpty。 |
upload |
UploadFile[] |
文件上传与预览。使用 accept、maxCount、uploader、propsHttp、listType、deletable 和 previewOptions。 |
radio、checkbox、picker、selectPicker、selector 和 cascader 支持在 componentProps.dict 中配置远程选项;其余兼容的 Vant Props 也可直接放入 componentProps。
每个 Renderer 的 Props 都通过字段 componentProps 配置。例如:
const schemas: SchemxField[] = [
{
name: "level",
label: "满意度",
componentType: "rate",
componentProps: {
count: 5,
allowHalf: true,
},
},
{
name: "attachments",
label: "附件",
componentType: "upload",
componentProps: {
maxCount: 3,
accept: ".pdf,.doc,.docx",
},
},
]
根入口导出各 Renderer 组件及其 Props 类型,例如 InputRenderer、InputRendererProps、UploadRenderer 和 UploadRendererProps,便于覆盖默认注册或单独使用。
Schema
@schemx/vant 重新导出 SchemxField 与 Core 的所有类型。Schema 有 4 种结构:
| 类型 | 关键字段 | 用途 |
|---|---|---|
| 普通字段 | name、label、componentType、componentProps |
使用一个 Vant Renderer 渲染字段。 |
| 分组字段 | label、children、collapsible、collapsed |
组织静态字段子树,并控制收起与展开。 |
| 动态依赖字段 | to、renderer |
根据当前表单值动态返回一组字段。 |
| 动态数组字段 | key、name、item |
根据对象数组值按行展开字段模板。 |
普通字段还支持 Core 的 preserve;Schema 被移除或字段改名时默认保留字段值和状态,设为 preserve: false 才会清理旧路径。Schema 通用状态、分组折叠参数和动态依赖示例见 @schemx/core。Vue 组件 Props、Slots 和组合式 API 见 @schemx/vue。
覆盖或新增 Renderer
根入口导出的 rendererRegistry 与 @schemx/vue 导出的全局 Registry 是同一实例,Vant 默认项注册在其中。可通过同一实例覆盖某个类型,或注册新类型:
import { rendererRegistry } from "@schemx/vant"
import CustomInput from "./CustomInput.vue"
rendererRegistry.register("input", CustomInput)
rendererRegistry.register("addressPicker", AddressPicker)
需要避免全局共享时,创建独立 RendererRegistry 并将其传给 <Schemx :renderer-registry="registry" /> 或 useForm({ rendererRegistry: registry })。
input / InputRenderer
- 值与选项:
InputValue = FieldProps["modelValue"];无 Option。 - Props:
InputRendererProps extends Omit<SchemxBaseComponentProps, "onChange" | "onBlur" | "value" | "onUpdate:value">,不直接继承全部FieldProps。 - Dictionary: 不支持。
- 行为:
formatter按formatTrigger处理输入;无确认步骤;clearable使用 Vant Field 清空;readonly使用Wrapper的只读插槽展示,disabled保留输入但阻止编辑。
| 包内显式字段 | 类型 / 说明 |
|---|---|
value |
InputValue,当前值。 |
onChange |
(value: string) => void。 |
onBlur / onFocus |
(event: FocusEvent) => void。 |
type |
FieldProps["type"]。 |
readonly / disabled |
只读 / 禁用状态。 |
placeholder / readonlyPlaceholder |
输入占位 / 空只读占位。 |
autofocus |
是否自动聚焦。 |
maxlength |
最大输入长度。 |
min / max |
数字输入边界。 |
rows |
textarea 行数。 |
autosize |
boolean | TextAreaAutosize。 |
formatter / formatTrigger |
Vant Field 格式化函数 / 触发时机。 |
clearable / clearIcon / clearTrigger |
清空按钮配置。 |
leftIcon / rightIcon |
左右图标。 |
showWordLimit |
是否显示字数统计。 |
className |
Renderer 根元素类名。 |
autocomplete / autocapitalize / autocorrect |
原生输入提示属性。 |
enterkeyhint / spellcheck / inputmode |
原生键盘与拼写属性。 |
align |
"left" | "right" | "center"。 |
const field = {
name: "nickname",
componentType: "input",
componentProps: { placeholder: "请输入昵称", clearable: true },
} as const
text / TextRenderer
- 值与选项:
TextValue = Extract<InputValue, string>;无 Option。 - Props:
TextRendererProps extends Omit<SchemxInputProps, "value" | "onChange">,再重写下表字段。 - Dictionary: 不支持。
- 行为: 支持 Field formatter;
type: "password"时提供显隐按钮;无确认步骤;clearable可清空;readonly使用Wrapper的只读插槽,disabled禁止输入。
| 包内重写字段 | 类型 / 说明 |
|---|---|
value |
TextValue。 |
onChange |
(value: string) => void。 |
onBlur / onFocus |
Focus 回调。 |
className |
根元素类名。 |
placeholder / readonlyPlaceholder |
占位文本。 |
readonly / disabled |
只读 / 禁用。 |
align |
文本对齐。 |
clearable / clearIcon / clearTrigger |
清空配置。 |
leftIcon / rightIcon |
图标。 |
showWordLimit / maxlength |
字数限制与统计。 |
min / max |
数字模式边界。 |
formatter / formatTrigger |
格式化配置。 |
autocomplete / autocapitalize / autofocus |
原生输入配置。 |
textarea / TextAreaRenderer
- 值与选项:
TextAreaValue = InputValue;无 Option。 - Props:
TextAreaRendererProps extends Omit<SchemxInputProps, "value" | "type" | "onChange">。 - Dictionary: 不支持。
- 行为: 强制使用 textarea;
autoSize兼容旧拼写并优先于autosize;无确认步骤;可通过继承的clearable清空;只读时使用Wrapper的只读插槽,禁用时隐藏字数统计。
| 包内重写 / 新增字段 | 类型 / 说明 |
|---|---|
value |
TextAreaValue。 |
onChange |
(value: string) => void。 |
onBlur / onFocus |
Focus 回调。 |
className |
根元素类名。 |
autosize |
boolean | TextAreaAutosize。 |
autoSize |
autosize 的兼容旧属性名,优先级更高。 |
rows |
显式行数;未传时取 autosize.minRows 或 2。 |
maxlength / showWordLimit |
字数限制与统计。 |
readonly / readonlyPlaceholder / disabled |
状态与空只读占位。 |
align |
文本对齐。 |
number / NumberRenderer
- 值与选项:
NumberValue = InputValue,运行时保持字符串形式;无 Option。 - Props:
NumberRendererProps extends Omit<SchemxInputProps, "value" | "type" | "onChange">。 - Dictionary: 不支持。
- 行为:
number支持小数、digit仅整数;无确认步骤;clearable可清空为空字符串;readonly使用Wrapper的只读插槽,disabled禁止输入。
| 包内重写字段 | 类型 / 说明 |
|---|---|
value |
NumberValue。 |
onChange |
(value: string) => void。 |
onBlur / onFocus |
Focus 回调。 |
className |
根元素类名。 |
type |
"number" | "digit"。 |
readonly / readonlyPlaceholder / disabled |
状态与占位。 |
align |
默认右对齐。 |
clearable |
是否显示清空按钮。 |
min / max |
数值边界。 |
maxlength |
最大输入长度。 |
switch / SwitchRenderer
- 值与选项:
SwitchValue = boolean | string | number;无 Option。 - Props: 同时继承 Schemx 基础契约与
Partial<Omit<SwitchProps, "modelValue" | "onUpdate:modelValue" | "onChange" | "activeValue" | "inactiveValue" | "loading" | "disabled">>。 - Dictionary: 不支持。
- 行为:
onChange可异步返回替代值,等待期间显示 loading;切换即确认;无独立清空;readonly用Wrapper的只读插槽显示 active/inactive 文案,disabled禁止切换。
| 包内重写 / 新增字段 | 类型 / 说明 |
|---|---|
value |
SwitchValue。 |
onChange |
(value) => void | Promise<SwitchValue | void>。 |
className |
根元素类名。 |
activeText / inactiveText |
只读展示文案。 |
activeValue / inactiveValue |
开 / 关对应值,默认 true / false。 |
readonly / readonlyPlaceholder / disabled |
状态与占位。 |
radio / RadioRenderer
- 值与选项:
RadioValue = RadioProps["name"];RadioOption继承Partial<Omit<RadioProps, "modelValue" | "onUpdate:modelValue" | "name">>,增加label、value与扩展字段。 - Props: 同时继承 Schemx 基础契约与
Partial<Omit<RadioProps, "modelValue" | "onUpdate:modelValue" | "name">>。 - Dictionary: 完整支持。
- 行为: 选中即更新,无额外格式化和确认步骤;无内置清空按钮;
readonly用Wrapper的只读插槽映射选项标签,disabled禁用组及选项。
| 包内重写 / 新增字段 | 类型 / 说明 |
|---|---|
value |
RadioValue。 |
onChange |
(value: RadioValue) => void。 |
options |
RadioOption[]。 |
fieldNames |
{ label?, value?, disabled? }。 |
className |
根元素类名。 |
readonly / readonlyPlaceholder / disabled |
状态与占位。 |
checkbox / CheckboxRenderer
- 值与选项:
CheckboxValue = CheckboxProps["name"][] | string;CheckboxOption继承排除 model/change/name 的 Vant Checkbox Props,并增加label、value与扩展字段。 - Props: 同时继承 Schemx 基础契约与
Partial<Omit<CheckboxProps, "modelValue" | "onUpdate:modelValue" | "onChange" | "name">>。 - Dictionary: 完整支持。
- 行为: 字符串输入按逗号拆分为组选中值,变更回传数组;无确认步骤和内置清空按钮;
readonly用Wrapper的只读插槽以、拼接标签,disabled禁用组及选项。
| 包内重写 / 新增字段 | 类型 / 说明 |
|---|---|
value |
CheckboxValue。 |
onChange |
(value: CheckboxValue) => void。 |
options |
CheckboxOption[]。 |
fieldNames |
{ label?, value?, disabled? }。 |
className |
根元素类名。 |
readonly / readonlyPlaceholder / disabled |
状态与占位。 |
date / DateRenderer
- 值与选项:
DateValue = string | string[] | Date;无 Option。 - Props: 同时继承 Schemx 基础契约与
Partial<Omit<DatePickerProps, "modelValue" | "onUpdate:modelValue">>。 - Dictionary: 不支持。
- 行为: 输入统一经 dayjs 和
format转成字符串;确认时依次写值、调用onConfirm/onChange并关闭;取消不改值,Popup 关闭触发onBlur;无内置清空;只读 / 禁用不挂载 Popup。
| 包内重写 / 新增字段 | 类型 / 说明 |
|---|---|
value |
DateValue。 |
onConfirm / onChange |
(value: string) => void。 |
onBlur |
Popup 关闭回调。 |
onClose |
声明的关闭回调;Popup 关闭时在 onBlur 后调用。 |
format |
string | (() => string);函数返回传给 dayjs 的格式字符串。 |
className / popupClassName |
根元素 / Popup 类名。 |
popupProps |
Partial<Omit<PopupProps, "show">>。 |
contentAlign |
Cell 内容对齐。 |
readonly / readonlyPlaceholder / disabled |
状态与占位。 |
import type { DateRendererProps, SchemxField } from "@schemx/vant"
const dateProps = {
format: "YYYY-MM-DD",
minDate: new Date(2020, 0, 1),
maxDate: new Date(2030, 11, 31),
popupProps: { closeOnClickOverlay: false },
} satisfies DateRendererProps
const dateField: SchemxField<{ birthday: string }>[] = [
{
name: "birthday",
label: "生日",
componentType: "date",
componentProps: dateProps,
},
]
calendar / CalendarRenderer
- 值与选项:
CalendarValue = string | string[] | Date | Date[];无 Option。 - Props: 同时继承 Schemx 基础契约与
Partial<Omit<CalendarProps, "show" | "onUpdate:show">>。 - Dictionary: 不支持。
- 行为: 单选 / 范围 / 多选日期经
format转为字符串或字符串数组供回调与展示,模型保留 Vant 返回的Date/Date[];确认后关闭,关闭触发onBlur;无内置清空;readonly使用Wrapper的只读插槽,disabled阻止打开。
| 包内重写 / 新增字段 | 类型 / 说明 |
|---|---|
value |
CalendarValue。 |
onConfirm / onChange |
(value: string | string[]) => void。 |
onBlur |
Calendar 关闭回调。 |
className / popupClassName |
根元素 / Calendar 类名。 |
readonly / disabled |
只读、禁用状态。 |
readonlyPlaceholder |
空只读占位。 |
type |
CalendarProps["type"],默认 single。 |
title |
Calendar 标题。 |
format |
日期格式字符串,默认 YYYY-MM-DD。 |
separator |
范围展示分隔符,默认 " - "。 |
contentAlign |
Cell 内容对齐。 |
import type { CalendarRendererProps } from "@schemx/vant"
const calendarProps = {
type: "range",
format: "YYYY-MM-DD",
separator: " 至 ",
minDate: new Date(2024, 0, 1),
} satisfies CalendarRendererProps
picker / PickerRenderer
- 值与选项:
PickerValue = PickerProps["modelValue"][number] | PickerProps["modelValue"];选项使用 VantPickerOption。 - Props: 同时继承 Schemx 基础契约与
Partial<Omit<PickerProps, "modelValue" | "onUpdate:modelValue">>。 - Dictionary: 完整支持。
- 行为:
options非空时优先于columns;确认时emitPath决定返回完整路径还是末级值,并携带 Vant detail;取消不改值,关闭触发onBlur;无内置清空;只读 / 禁用不挂载 Popup。
| 包内重写 / 新增字段 | 类型 / 说明 |
|---|---|
value |
PickerValue。 |
onConfirm / onChange |
(value, detail: PickerConfirmEventParams) => void。 |
onBlur |
Popup 关闭回调。 |
className / popupClassName |
根元素 / Popup 类名。 |
emitPath |
是否返回完整值路径,默认 false。 |
showAllLevels |
是否展示完整标签路径,默认 false。 |
separator |
标签路径分隔符,默认 " - "。 |
options |
PickerOption[],供 Dictionary 与统一选项输入使用。 |
columns / columnsFieldNames |
Vant 原生列与字段名。 |
fieldNames |
PickerFieldNames;columnsFieldNames 优先。 |
title |
Picker 标题。 |
contentAlign |
Cell 内容对齐。 |
popupProps |
Partial<Omit<PopupProps, "show">>。 |
readonly / readonlyPlaceholder / disabled |
状态与占位。 |
import type { PickerRendererProps, SchemxField } from "@schemx/vant"
const areaPickerProps = {
emitPath: true,
showAllLevels: true,
fieldNames: { text: "name", value: "code", children: "children" },
options: [
{
name: "浙江",
code: "33",
children: [{ name: "杭州", code: "3301" }],
},
],
} satisfies PickerRendererProps
const areaField: SchemxField<{ area: string[] }>[] = [
{
name: "area",
label: "地区",
componentType: "picker",
componentProps: areaPickerProps,
},
]
selectPicker / SelectPickerRenderer
- 值与选项:
SelectPickerValue是 Radio / Checkbox name 或其数组;SelectPickerOption提供label、value、disabled与扩展字段。 - Props: 继承
Omit<SchemxBaseComponentProps, "onChange" | "onBlur" | "value" | "onUpdate:value">,不继承完整 Vant Popup / Radio / Checkbox Props。 - Dictionary: 完整支持。
- 行为: 弹窗内先写
pendingValue,点击确认才更新模型并依次调用onChange/onConfirm;关闭不提交并触发onBlur;无内置清空;readonly使用Wrapper的只读插槽,disabled阻止打开。
| 包内显式字段 | 类型 / 说明 |
|---|---|
value |
SelectPickerValue。 |
onChange / onConfirm |
(value, detail) => void。 |
onBlur |
Popup 关闭回调。 |
className / popupClassName |
根元素 / Popup 类名。 |
readonly / disabled |
只读、禁用。 |
readonlyPlaceholder |
空只读占位。 |
options / columns |
SelectPickerOption[];非空 options 优先。 |
fieldNames |
SelectPickerFieldNames。 |
type |
"radio" | "checkbox",默认 checkbox。 |
title |
弹窗标题。 |
contentAlign |
Cell 内容对齐。 |
popupProps |
Partial<Omit<PopupProps, "show">>,运行时也会剔除 show。 |
import type { SelectPickerRendererProps, SchemxField } from "@schemx/vant"
const roleProps = {
type: "checkbox",
title: "选择角色",
options: [
{ label: "管理员", value: "admin" },
{ label: "审阅者", value: "reviewer", disabled: true },
],
} satisfies SelectPickerRendererProps
const roleField: SchemxField<{ roles: string[] }>[] = [
{
name: "roles",
label: "角色",
componentType: "selectPicker",
componentProps: roleProps,
},
]
selector / SelectorRenderer
- 值与选项:
SelectValue = string | number | (string | number)[];SelectorOption提供label、value、disabled与扩展字段。 - Props: 继承
Omit<SchemxBaseComponentProps, "onChange" | "onBlur" | "value" | "onUpdate:value">。 - Dictionary: 完整支持。
- 行为:
SelectorRendererProps继承SelectorProps,因此multiple在 Renderer 和内部Selector类型中都可用;默认单选,设为true后返回数组。点击即更新,无格式化、确认或内置清空;readonly使用Wrapper的只读插槽,disabled禁止选择。
| 包内显式字段 | 类型 / 说明 |
|---|---|
value |
SelectValue。 |
onChange |
(value: SelectValue) => void。 |
options |
SelectorOption[]。 |
multiple |
boolean,默认 false。 |
fieldNames |
{ label?, value?, disabled? }。 |
className |
根元素类名。 |
readonly / readonlyPlaceholder / disabled |
状态与占位。 |
SelectorProps(内部 Selector 组件)
根入口同时公开 SelectorProps,它描述包内 Selector.vue 基础组件。SelectorRendererProps 在此基础上使用 Schemx 的 value / onChange 契约,并在运行时把值转换为内部组件的 modelValue;两者共享 options、fieldNames、disabled 和 multiple 的语义。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
modelValue |
SelectValue |
[] |
内部 Selector 当前选中值;Renderer 对外对应 value。 |
options |
SelectorOption[] |
[] |
选项列表。 |
multiple |
boolean |
false |
是否多选;SelectorRendererProps 也会继承该字段。 |
fieldNames |
{ label?: string; value?: string; disabled?: string } |
{ label: "label", value: "value", disabled: "disabled" } |
选项字段映射。 |
disabled |
boolean |
false |
禁用整个内部 Selector。 |
sensitiveInput / SensitiveInputRenderer
- 值与选项:
SensitiveInputValue = string;无 Option。 - Props:
SensitiveInputRendererProps extends Omit<SchemxInputProps, "type" | "value" | "onChange">。 - Dictionary: 不支持。
- 行为: 默认使用 Renderer 子目录内实现的
defaultMaskFormatter脱敏;maskFormatter只影响脱敏展示,formatter用于完整值展示和输入格式化。无确认步骤,展开输入继承清空能力;disabled不可展开,readonly仅在revealWhenReadonly为真时可查看完整值。defaultMaskFormatter不从@schemx/vant根入口导出。
| 包内重写 / 新增字段 | 类型 / 说明 |
|---|---|
value |
SensitiveInputValue,真实值。 |
onChange |
回传未脱敏的输入字符串;若配置 formatter,回调收到格式化后的值。 |
formatter |
完整值展示格式化。 |
maskFormatter |
脱敏格式化;未传时使用子目录内的 defaultMaskFormatter。 |
defaultRevealed |
非受控初始展开状态。 |
revealed |
类型中声明的受控状态;当前实现仍以内部状态为准,不会按该值同步。 |
onRevealChange |
类型中声明的回调;当前实现通过 reveal-change 事件通知,未调用该 Prop 回调。 |
revealable |
是否允许展开。 |
revealText / hideText |
按钮文案。 |
revealIcon / hideIcon |
按钮图标。 |
focusOnReveal |
展开后是否聚焦。 |
hideOnBlur |
失焦后是否重新脱敏。 |
revealWhenReadonly |
只读时是否允许展开。 |
组件通过 reveal-change 事件通知展开状态变化;该事件参数为 (revealed: boolean)。当前展开状态由内部管理,初始状态可通过 defaultRevealed 设置;若需要受控展开,当前版本尚未实现 revealed / onRevealChange 的受控语义。
rate / RateRenderer
- 值与选项:
RateValue = RateProps["modelValue"];无 Option。 - Props: 同时继承 Schemx 基础契约与
Partial<Omit<RateProps, "modelValue" | "onUpdate:modelValue" | "onChange">>。 - Dictionary: 不支持。
- 行为: 值直接传给 Vant Rate,无额外格式化或确认;无内置清空;只读且值为
0/ 空时显示占位,否则显示只读 Rate;禁用阻止评分。
| 包内重写 / 新增字段 | 类型 / 说明 |
|---|---|
value |
RateValue。 |
onChange |
(value: RateValue) => void。 |
count |
星星总数,默认 5。 |
allowHalf |
是否允许半星。 |
className |
根元素类名。 |
readonly / readonlyPlaceholder / disabled |
状态与占位。 |
slider / SliderRenderer
- 值与选项:
SliderValue = SliderProps["modelValue"],支持单值或范围;无 Option。 - Props: 同时继承 Schemx 基础契约与
Partial<Omit<SliderProps, "modelValue" | "onUpdate:modelValue" | "onChange">>。 - Dictionary: 不支持。
- 行为: 范围值只读展示用
" - "连接;拖动即更新,无确认或内置清空;readonly使用Wrapper的只读插槽,disabled由 Vant Slider 阻止交互。
| 包内重写 / 新增字段 | 类型 / 说明 |
|---|---|
value |
SliderValue。 |
onChange |
(value: SliderValue) => void。 |
min / max / step |
最小值、最大值、步长。 |
range |
是否范围选择。 |
className |
根元素类名。 |
readonly / readonlyPlaceholder / disabled |
状态与占位。 |
stepper / StepperRenderer
- 值与选项:
StepperValue = StepperProps["modelValue"];无 Option。 - Props: 同时继承 Schemx 基础契约与
Partial<Omit<StepperProps, "modelValue" | "onUpdate:modelValue" | "onChange">>。 - Dictionary: 不支持。
- 行为: 直接遵循 Vant 的数值、整数与小数位规则;点击即更新,无确认;
allowEmpty可清空;readonly使用Wrapper的只读插槽,disabled禁止调整。
| 包内重写 / 新增字段 | 类型 / 说明 |
|---|---|
value |
StepperValue。 |
onChange |
(value: StepperValue) => void。 |
min / max / step |
边界与步长。 |
integer / decimalLength |
整数限制 / 小数位数。 |
allowEmpty |
是否允许空值。 |
className |
根元素类名。 |
readonly / readonlyPlaceholder / disabled |
状态与占位。 |
upload / UploadRenderer
- 值与选项:
UploadValue = UploadFile[];UploadFile是兼容 Vant 文件项的本包结构。 - Props: 同时继承 Schemx 基础契约与
Partial<Omit<UploaderProps, "modelValue" | "onUpdate:modelValue" | "imageFit">>,并补充文件列表与预览配置。 - Dictionary: 不支持。
- 行为: 默认
afterRead调用uploader,维护 uploading / done / failed 状态;上传成功或删除后回调onChange。listType: "card"使用图片卡片布局,listType: "list"使用横向附件列表;图片可通过previewFullImage打开ImagePreview。beforeDelete会在实际删除前执行,支持同步或异步拦截。readonly隐藏上传和删除,且无文件时展示readonlyPlaceholder;disabled禁用 Uploader;disableUpload仅隐藏新增入口,保留已有文件删除能力。multiple默认true,也可显式设为false。
| 包内重写 / 新增字段 | 类型 / 说明 |
|---|---|
value |
UploadValue。 |
onChange |
(files: UploadFile[]) => void。 |
accept |
接受的文件类型,默认 "*"。 |
className |
根元素类名。 |
showUpload |
是否显示上传入口。 |
multiple |
是否允许多文件选择,默认 true。 |
listType |
"card" | "list";图片卡片或横向附件列表,默认 "card"。 |
imageFit |
图片缩略图填充方式,默认 "cover"。 |
previewFullImage |
是否允许点击图片打开全屏预览,默认 true。 |
previewOptions |
透传给 Vant ImagePreview 的配置;图片与起始位置由组件控制。 |
disableUpload |
隐藏上传入口,不影响已有文件的删除。 |
deletable |
是否可删除。 |
readonly / disabled |
只读、禁用状态。 |
readonlyPlaceholder |
只读且无文件时由 Wrapper 的只读插槽展示的占位文本。 |
uploader |
(file: File) => Promise<any>。 |
propsHttp |
{ res?, url?, name? };覆盖上传响应中的数据、URL、文件名字段。 |
propsHttp 默认值为 { res: "data", url: "link", name: "originalName" };自定义 uploader 的返回值按这三个字段读取,也可通过 propsHttp 改为接口实际字段:
实际上传必须提供返回结构与 propsHttp 匹配的 uploader;内置默认函数只返回空对象,不能完成文件上传。
type UploadResponse = {
data: {
link: string
originalName: string
}
}
import type { SchemxField, UploadRendererProps } from "@schemx/vant"
const uploadProps = {
accept: "image/*",
maxCount: 3,
uploader: async (file) => {
const body = new FormData()
body.append("file", file)
const response = await fetch("/api/upload", { method: "POST", body })
// 接口必须返回 { data: { link, originalName } }
return (await response.json()) as {
data: { link: string; originalName: string }
}
},
} satisfies UploadRendererProps
const uploadField: SchemxField<{ photos: { url?: string }[] }>[] = [
{
name: "photos",
label: "照片",
componentType: "upload",
componentProps: uploadProps,
},
]
cascader / CascaderRenderer
- 值与选项:
CascaderValue = Array<NonNullable<CascaderProps["modelValue"]>>,始终以数组承载路径或末级值;选项使用 Vant Cascader options。 - Props: 同时继承 Schemx 基础契约与
Partial<Omit<CascaderProps, "modelValue" | "onUpdate:modelValue">>。 - Dictionary: HOC 可以加载并注入选项;Schema
componentProps类型也支持dict,远程选项会传给 Vant Cascader。 - 行为:
options可把已有值映射为展示标签路径,也会作为级联弹窗数据源。事件处理代码会在收到 finish 时按emitPath生成路径、调用onConfirm/onChange,关闭触发onBlur;无内置清空;只读 / 禁用不挂载 Popup。
| 包内重写 / 新增字段 | 类型 / 说明 |
|---|---|
value |
CascaderValue。 |
onConfirm / onChange |
(value: CascaderValue) => void。 |
onBlur |
Cascader 关闭回调。 |
className / popupClassName |
根元素 / Popup 类名。 |
showAllLevels |
是否展示全部标签层级,默认 true。 |
emitPath |
是否返回完整路径,默认 true。 |
fieldNames |
CascaderFieldNames。 |
separator |
标签路径分隔符,默认 " - "。 |
options |
CascaderProps["options"];同时用于展示标签映射和级联弹窗。 |
title |
Cascader 标题。 |
contentAlign |
Cell 内容对齐。 |
popupProps |
Partial<Omit<PopupProps, "show">>,运行时剔除 show。 |
readonly / readonlyPlaceholder / disabled |
状态与占位。 |
下例使用
readonly展示标签路径映射;将readonly改为false即可打开带有options的级联弹窗。
import type { CascaderRendererProps, SchemxField } from "@schemx/vant"
const regionProps = {
readonly: true,
emitPath: true,
showAllLevels: true,
fieldNames: { text: "name", value: "code", children: "children" },
options: [
{
name: "浙江",
code: "33",
children: [{ name: "杭州", code: "3301" }],
},
],
popupProps: { closeOnClickOverlay: false },
} satisfies CascaderRendererProps
const initialValues: { region: string[] } = {
region: ["33", "3301"],
}
const regionField: SchemxField<typeof initialValues>[] = [
{
name: "region",
label: "地区",
componentType: "cascader",
componentProps: regionProps,
},
]
将 initialValues 传给表单后,Renderer 可显示“浙江 - 杭州”;示例使用 readonly: true 先展示标签路径,编辑态同样会使用这些 options 打开级联弹窗。
工具函数
| 导出 | 参数 | 返回值 | 行为与适用场景 |
|---|---|---|---|
getFieldProps |
attrs: T、key: keyof T、可选 defaultValue |
T[typeof key] |
读取 attrs 中的字段;仅在结果为 null / undefined 时回退默认值,false、0 和空字符串会保留。 |
isEmptyDisplayValue |
value: unknown |
boolean |
仅把 undefined、null、空字符串和空数组判为空;0、false、空对象及非空数组不为空。 |
getReadonlyDisplayValue |
value: T、可选 readonlyPlaceholder = "-" |
T | string |
按 isEmptyDisplayValue() 判断;空值返回只读占位,其余值原样返回。 |
resolveRendererMode |
{ disabled?: boolean; readonly?: boolean } |
RendererMode |
解析展示模式;disabled 优先于 readonly,否则为 "editable"。 |
isRendererInteractive |
mode: RendererMode |
boolean |
仅 "editable" 返回 true,用于统一守卫点击、键盘或弹窗交互。 |
findTreeItem |
tree: any[]、targetValue: any、可选 { labelKey?, valueKey?, childrenKey? } |
FindTreeItemResult |
按数组顺序深度优先查找,使用严格相等比较 value;默认字段为 label / value / children,返回原节点及从根到节点的 label / value 路径。 |
getFileName |
url: string | undefined | null |
string |
去掉 query 和 hash 后取最后一个 / 后的片段;空输入、末段为空或解析异常时返回当前毫秒时间戳字符串。 |
findTreeItem() 在 tree 非数组、目标为 null / undefined 或没有匹配项时返回 { node: null, labels: [], values: [] };自定义字段配置可用于 Cascader、Picker 等不同选项结构。公开工具类型如下:
| 类型 | 定义与用途 |
|---|---|
RendererMode |
"editable" | "disabled" | "readonly",供模式解析与交互守卫共用。 |
FindTreeItemResult |
{ node: Record<string, any> | null; labels: string[]; values: any[] },描述树节点和两条祖先路径。 |
cutString、formatNumber、getStringLength 与脱敏 Renderer 子目录实现的 defaultMaskFormatter 当前仅属于包内实现,不从 @schemx/vant 根入口导出;本文不提供这些值的根入口导入示例。
默认注册行为
导入 @schemx/vant 根入口时,Vant 默认 Renderer 会注册到 @schemx/vue 共用的全局 rendererRegistry,并由入口写入模块级全局配置:input、text、textarea、number、switch、radio、checkbox、date、calendar、picker、selectPicker、selector、sensitiveInput、rate、slider、stepper、upload、cascader。Vant 与 Vue 导出的 presetRuleRegistry 也指向同一实例。
Field 使用 col 配置列宽,Form、Group 和 Dynamic 使用 row 配置行;Vant 的 Row/Col 已作为入口的全局默认值,也可通过表单 Props 或 ConfigProvider 覆盖。
registerAll() 会直接覆盖 Registry 中已有的同名项,因此自定义 Renderer 应在导入 @schemx/vant 后注册:
import Schemx, { rendererRegistry } from "@schemx/vant"
import CustomInputRenderer from "./CustomInputRenderer.vue"
rendererRegistry.register("input", CustomInputRenderer)
register() 默认也允许覆盖;需要保护已有项时可传 { override: false }。Form 与 useForm 默认读取入口写入的全局配置;需要隔离时再显式传入 rendererRegistry、presetRuleRegistry、colComponent 和 rowComponent。若只导入 @schemx/vue,不会触发 Vant 的默认注册;深层导入源码既不保证副作用,也不属于发布出口。
DEFAULT_RENDERER_TYPES 是按上述顺序排列的只读字面量元组,适合能力枚举、文档生成和类型推导。当前注册模块仍显式维护组件映射,并不是遍历该元组完成注册;该常量也不代表 Renderer 一定处于可编辑模式。实际交互仍由字段的 readonly / disabled、各 Renderer 实现及 resolveRendererMode() 共同决定。
类型参考
根入口提供 Renderer 相关的 Props、Value、Option 和 FieldNames 类型。字段与限制已在对应的 Renderer API 小节说明;这里按导出符号逐项索引,避免把同一契约重复成另一份可能漂移的字段表。
| Renderer | 类型导出 | 用途 |
|---|---|---|
| Input | InputRendererProps |
Input Renderer 的 Props。 |
| Input | InputValue |
Input Renderer 的值类型。 |
| Text | TextRendererProps |
Text Renderer 的 Props。 |
| Text | TextValue |
Text Renderer 的字符串值。 |
| TextArea | TextAreaRendererProps |
TextArea Renderer 的 Props。 |
| TextArea | TextAreaAutosize |
TextArea 自动高度配置。 |
| TextArea | TextAreaValue |
TextArea Renderer 的字符串值。 |
| Checkbox | CheckboxRendererProps |
Checkbox Renderer 的 Props。 |
| Checkbox | CheckboxOption |
Checkbox 单个选项结构。 |
| Checkbox | CheckboxValue |
Checkbox Renderer 的数组值。 |
| Date | DateRendererProps |
Date Renderer 的 Props。 |
| Date | DateValue |
Date Renderer 的值类型。 |
| Calendar | CalendarRendererProps |
Calendar Renderer 的 Props。 |
| Calendar | CalendarValue |
Calendar 单日 / 范围 / 多选值。 |
| Number | NumberRendererProps |
Number Renderer 的 Props。 |
| Number | NumberValue |
Number Renderer 的数值或空值类型。 |
| Picker | PickerRendererProps |
Picker Renderer 的 Props。 |
| Picker | PickerFieldNames |
Picker 选项字段映射。 |
| Picker | PickerValue |
Picker Renderer 的选中值数组。 |
| Radio | RadioRendererProps |
Radio Renderer 的 Props。 |
| Radio | RadioOption |
Radio 单个选项结构。 |
| Radio | RadioValue |
Radio Renderer 的值类型。 |
| Rate | RateRendererProps |
Rate Renderer 的 Props。 |
| Rate | RateValue |
Rate Renderer 的评分值。 |
| Slider | SliderRendererProps |
Slider Renderer 的 Props。 |
| Slider | SliderValue |
Slider 单值或范围值。 |
| Stepper | StepperRendererProps |
Stepper Renderer 的 Props。 |
| Stepper | StepperValue |
Stepper Renderer 的值类型。 |
| Switch | SwitchRendererProps |
Switch Renderer 的 Props。 |
| Switch | SwitchValue |
Switch Renderer 的值类型。 |
| Upload | UploadRendererProps |
Upload Renderer 的 Props。 |
| Upload | UploadFile |
单个上传文件项。 |
| Upload | UploadValue |
上传文件项数组。 |
| Upload | UploadListType |
上传文件列表展示方式。 |
| Cascader | CascaderRendererProps |
Cascader Renderer 的 Props。 |
| Cascader | CascaderFieldNames |
Cascader 选项字段映射。 |
| Cascader | CascaderValue |
Cascader 路径或末级值数组。 |
| Selector | SelectorRendererProps |
Selector Renderer 的 Props。 |
| Selector | SelectorOption |
Selector 单个选项结构。 |
| Selector | SelectorProps |
包内 Selector 基础组件 Props。 |
| Selector | SelectValue |
Selector 单选或多选值。 |
| SelectPicker | SelectPickerFieldNames |
SelectPicker 选项字段映射。 |
| SelectPicker | SelectPickerOption |
SelectPicker 单个选项结构。 |
| SelectPicker | SelectPickerRendererProps |
SelectPicker Renderer 的 Props。 |
| SelectPicker | SelectPickerValue |
SelectPicker 单选或多选值。 |
| SensitiveInput | SensitiveInputRendererProps |
SensitiveInput Renderer 的 Props。 |
| SensitiveInput | SensitiveInputValue |
SensitiveInput 的真实字符串值。 |
DEFAULT_RENDERER_TYPES 是运行时值,不是类型;defaultMaskFormatter 当前不属于根入口公开 API。
Vue 与 Core API
Vant 根入口的 default 与命名 SchemxForm 都直接引用 @schemx/vue 的默认表单组件;此外,export * from "@schemx/vue" 原样传递 Vue 和 Core 的公开导出。它们的所有权仍分别属于 Vant、Vue 和 Core,不应被描述成 Vant 自有 API。
注意命名差异:Vue 根入口的组件别名是小写开头的 schemxForm,没有命名 SchemxForm;Vant 才额外增加命名别名 SchemxForm。在 Vant 根入口中,default === SchemxForm,并且二者也与传递进来的 schemxForm 指向同一组件。
使用 dependencies 可以根据其他字段值动态调整字段状态:
const schemas = [
{
name: "accountType",
componentType: "radio",
componentProps: {
options: [
{ label: "个人", value: "personal" },
{ label: "企业", value: "company" },
],
},
},
{
name: "companyName",
componentType: "input",
dependencies: {
triggerFields: ["accountType"],
visible: (values: { accountType?: string }) => values.accountType === "company",
required: (values: { accountType?: string }) => values.accountType === "company",
},
},
]
通过组件 ref 可调用 SchemxInstance。它包含值、快照、初始值、touched、pending、校验、提交与重置、响应式 effect、Schema 更新、默认配置、view、Renderer / 预设规则注册和 destroy 等完整实例能力;实例契约以 @schemx/core 的 SchemxInstance 类型为准。
导出清单
下列列表按来源说明当前公开 API。导出总数不在文档中固定统计;新增 Renderer、Hook 或 Core 类型后,请以包根入口和 package.json 的 exports 为准。
Vant 自有运行时值(含 default)
| 分类 | 导出 | 用途 |
|---|---|---|
| 表单组件 | SchemxForm |
Vue 默认表单组件的 Vant 命名别名。 |
| 表单组件 | default |
Vue 默认表单组件;与 SchemxForm 指向同一组件。 |
| Renderer | InputRenderer |
input 字段 Renderer。 |
| Renderer | TextRenderer |
text 字段 Renderer。 |
| Renderer | TextAreaRenderer |
textarea 字段 Renderer。 |
| Renderer | NumberRenderer |
number 字段 Renderer。 |
| Renderer | SwitchRenderer |
switch 字段 Renderer。 |
| Renderer | RadioRenderer |
radio 字段 Renderer。 |
| Renderer | CheckboxRenderer |
checkbox 字段 Renderer。 |
| Renderer | DateRenderer |
date 字段 Renderer。 |
| Renderer | CalendarRenderer |
calendar 字段 Renderer。 |
| Renderer | PickerRenderer |
picker 字段 Renderer。 |
| Renderer | SelectPickerRenderer |
selectPicker 字段 Renderer。 |
| Renderer | SelectorRenderer |
selector 字段 Renderer。 |
| Renderer | SensitiveInputRenderer |
sensitiveInput 字段 Renderer。 |
| Renderer | RateRenderer |
rate 字段 Renderer。 |
| Renderer | SliderRenderer |
slider 字段 Renderer。 |
| Renderer | StepperRenderer |
stepper 字段 Renderer。 |
| Renderer | UploadRenderer |
upload 字段 Renderer。 |
| Renderer | CascaderRenderer |
cascader 字段 Renderer;当前交互限制见对应 API 小节。 |
| Renderer 元数据 | DEFAULT_RENDERER_TYPES |
默认 Renderer key 的只读元组。 |
| 工具 | getFieldProps |
从 attrs 读取属性并处理 nullish 默认值。 |
| 工具 | isEmptyDisplayValue |
判断展示层空值。 |
| 工具 | getReadonlyDisplayValue |
生成保留有效 falsy 值的只读展示值。 |
| 工具 | resolveRendererMode |
解析 editable / disabled / readonly 模式。 |
| 工具 | isRendererInteractive |
判断 Renderer 模式是否允许交互。 |
| 工具 | findTreeItem |
查找树节点并返回 label / value 路径。 |
| 工具 | getFileName |
从 URL 或路径提取文件名。 |
Vant 自有类型
Renderer 类型的逐项用途见 类型参考,工具类型的结构见 工具函数。
| 分类 | 导出 |
|---|---|
| Renderer 类型 | InputRendererProps、InputValue、TextRendererProps、TextValue、TextAreaRendererProps、TextAreaAutosize、TextAreaValue、CheckboxRendererProps、CheckboxOption、CheckboxValue、DateRendererProps、DateValue、CalendarRendererProps、CalendarValue、` |
Related Packages
Version History
| Version | Released | Vue | License |
|---|---|---|---|
| 1.1.2 | ^3.0.0 | MIT | |
| 1.1.1 | ^3.0.0 | MIT | |
| 1.1.0 | ^3.0.0 | MIT | |
| 1.0.1 | ^3.0.0 | MIT | |
| 1.0.0 | ^3.0.0 | MIT | |
| 0.2.3 | ^3.0.0 | MIT | |
| 0.2.1 | ^3.0.0 | MIT | |
| 0.2.0 | ^3.0.0 | MIT | |
| 0.1.12 | ^3.0.0 | MIT |
Pre-releases (8)
| Version | Released | Vue | License |
|---|---|---|---|
| 1.0.0-next.6 | ^3.0.0 | MIT | |
| 1.0.0-next.5 | ^3.0.0 | MIT | |
| 1.0.0-next.4 | ^3.0.0 | MIT | |
| 1.0.0-next.3 | ^3.0.0 | MIT | |
| 1.0.0-next.2 | ^3.0.0 | MIT | |
| 1.0.0-next.1 | ^3.0.0 | MIT | |
| 1.0.0-next.0 | ^3.0.0 | MIT | |
| 0.2.4-beta.20260716174917.f6b485a | ^3.0.0 | MIT |