常见问题 (FAQ)
基础问题
Q1: Schema FormX 支持哪些 React 版本?
A: Schema FormX 支持 React 16.8+ 版本,需要支持 Hooks 特性。
Q2: 如何安装使用 Schema FormX?
A: 使用 npm 或 pnpm 安装:
基本使用:
Q3: Schema FormX 是否支持 TypeScript?
A: 是的,Schema FormX 使用 TypeScript 编写,提供完整的类型定义。
验证相关
Q4: 如何实现远程校验(如检查用户名是否已存在)?
A: 使用异步验证函数:
Q5: 为什么 boolean 类型的必填字段显示验证错误?
A: boolean 类型的 false 不被视为空值,请确认是否真的设置了 required: true。如果协议同意只需要勾选表态,可以不设置 required:
Q6: 如何自定义验证提示信息?
A: 使用自定义验证函数并返回特定的错误信息:
依赖联动相关
Q7: 依赖联动为什么没有触发?
A: 请检查以下几点:
- deps 声明:确保依赖字段在
deps数组中 - 字段名称匹配:
deps中的字段名必须与目标字段的name完全一致 - 依赖字段存在:确保依赖的字段已存在于 schema 中
Q8: 如何实现多级联动(如省→市→区)?
A: 通过链式依赖自动级联:
Q9: 循环依赖是什么?如何避免?
A: 循环依赖指 A 依赖 B,B 依赖 A 的情况,会导致无限递归。
问题现象:控制台报错 over maxTimes
避免方法:
- 确保依赖是单向的
- 使用
triggerCount判断是否进入死循环
Q10: patch 和 schema 返回值有什么区别?
A:
分组表单相关
Q11: 如何使用分组表单(Group)?
A: 使用 GroupSchema 数组作为 schema:
Q12: 如何自定义分组的容器样式?
A: 通过覆盖 DefaultGroup 组件,从 props 中读取标题:
自定义组件相关
Q13: 如何注册自定义组件?
A: 通过 components 属性注册:
Q14: 自定义组件需要接收哪些 props?
A: 自定义组件会自动接收以下 props:
提示:如果需要在自定义组件中显示验证错误,可以通过
onChange回调更新值后,在组件外部使用validate()获取错误信息。错误提示由 Form 组件统一管理并显示在控件下方的span元素中。
表单数据相关
Q15: 如何设置表单默认值?
A: 使用 defaultData 属性:
Q16: 表单数据类型有哪些?
A: 支持以下类型:
性能相关
Q17: 大型表单性能很差怎么办?
A: 参考以下优化策略:
- 拆分表单:使用 Group 拆分或拆分为多个 Form
- 控制依赖深度:避免超过 3-4 层的级联依赖
- 缓存数据:使用 Map 缓存异步请求结果
- 使用
useMemo:缓存 schema 和 layout 对象 - 局部验证:只验证需要的字段
详见性能优化指南。
Q18: 依赖联动触发太快导致性能问题?
A: 可以采取以下措施:
- 检查是否循环依赖:确保依赖是单向的
- 使用防抖:对频繁触发的联动进行防抖
- 限制触发次数:Schema FormX 内置最大 20 次限制,超过会自动停止
其他问题
Q19: 如何获取表单实例方法?
A: 使用 FormInstance 类型和 ref:
Q20: 与 antd/element-plus 集成使用?
A: 需要注册对应的组件:
然后按各 UI 库的 props 传入 schema.props:
Q21: hidden: true 的字段还会参与验证吗?
A: 会。hidden: true 仅在视觉上隐藏字段(设置 display: none),字段仍然会参与 required 验证。如果隐藏字段设置了 required: true,提交时仍会触发验证错误。
如需跳过隐藏字段的验证,可以:
- 使用条件
required:根据其他字段值动态决定是否必填 - 使用自定义
validator:在验证函数中判断字段是否应参与验证 - 使用
setData清空隐藏字段值后再验证
Q22: setData 和 onChange 有什么区别?
A:
Q23: 表单初始化的顺序是什么?
A: 表单初始化顺序如下:
- 解析 schema:处理
FieldSchema[]或GroupSchema[] - 注册组件:将
components映射到对应字段 - 初始化数据:使用
defaultData或空对象初始化表单数据 - 应用布局:根据
layout属性设置表单布局 - 触发首次渲染:渲染表单字段和初始状态
注意:初始化时不会触发
onChange回调,也不会触发依赖联动。依赖联动在用户交互时自动触发,调用setData或reset时也会触发。验证仅在用户交互或手动调用validate()时触发。
Q24: 多个依赖同时变化时如何处理?
A: 当多个依赖字段同时变化时,Schema FormX 会按以下顺序处理:
- 合并依赖值:将所有变化的依赖字段值合并到
deps数组中 - 触发
onDepsChange:调用当前字段的onDepsChange回调 - 应用返回值:将
patch和schema应用到表单
如果多个字段的依赖相互影响,可能会触发多次联动。Schema FormX 内置了最大 20 次触发限制,超过后会自动停止并打印警告。
Q25: 如何与 Redux/Zustand 等状态管理库集成?
A: Schema FormX 是独立的表单状态管理方案,通常不需要额外的状态管理库。但如果需要与外部状态同步,可以:
- 使用
onChange同步到外部状态:
- 使用
setData从外部状态回填:
提示:Schema FormX 内部使用
Object.freeze保护表单数据,外部状态管理库无法直接修改表单数据,必须通过setData方法。