依赖联动
概述
依赖联动功能允许您声明字段间的依赖关系,当依赖字段的值发生变化时,自动触发联动逻辑。本章节将详细介绍依赖联动的配置和使用方法。
基础用法
依赖声明
通过 deps 属性声明字段依赖:
联动回调
通过 onDepsChange 定义联动逻辑:
依赖联动示例
联动参数详解
OnDepsChangeParams
联动回调接收以下参数:
返回值
联动回调可以返回以下内容:
链式联动与循环依赖防护
链式联动
当字段 A 的联动回调修改了字段 B 的值,而字段 B 又是字段 C 的依赖时,会自动触发链式联动。Schema FormX 内置最大 20 次联动触发限制,超过限制时自动终止联动链并在控制台输出 over maxTimes 错误。
循环依赖防护
如果字段之间形成循环依赖(如 A 依赖 B,B 依赖 A),会导致联动链无限递归。Schema FormX 通过以下机制防护:
- 次数限制:联动链最多触发 20 次,超过自动终止
- 监控参数:使用
triggerCount和totalTriggerCount监控联动深度
建议:确保依赖关系是单向的,避免 A→B→A 的循环依赖模式。
常见联动模式
异常处理
重要:与
validator不同,onDepsChange回调中的异常不会被自动捕获。如果回调中发生错误(如异步请求失败),异常会直接向上抛出。建议在onDepsChange中使用try-catch处理异常:
级联选择
实现省市区级联选择:
条件显示
根据其他字段的值控制字段的显示:
动态验证
根据其他字段的值动态调整验证规则:
异步数据加载
从服务器加载数据:
最佳实践:推荐将异步获取数据的逻辑封装到自定义组件内部(如组件的
useEffect中),在onDepsChange中仅通过schema.props传递数据标识(如categoryId),由组件自行加载数据。这样可以更好地控制加载状态、错误处理和缓存逻辑。
多依赖
一个字段可以依赖多个字段:
联动触发时机
初始触发
当表单初始化时,如果依赖字段有值,会触发一次联动:
值变化触发
当依赖字段的值发生变化时触发:
异步联动
异步回调
联动回调支持异步操作:
错误处理
异步联动需要处理错误:
性能优化
防抖处理
对于频繁触发的联动,可以使用防抖:
缓存结果
对于相同参数的请求,可以缓存结果:
循环依赖防护
自动防护机制
Schema FormX 内置了循环依赖防护机制:
- 触发次数限制:单次联动最多触发 20 次
- 递归检测:自动检测并阻止无限递归
- 错误提示:超过限制时会在控制台输出错误信息
常见循环依赖场景
错误示例:
正确示例:
triggerCount 参数
triggerCount 参数可以帮助识别循环依赖:
链式联动
自动级联触发
当 patch 中的字段也是其他字段的依赖时,会自动触发链式联动:
链式联动限制
- 最多触发 20 次联动
- 超过限制会停止并输出错误
- 建议控制联动层级不超过 3-4 层
最佳实践
依赖管理
- 保持依赖链简洁:避免过深的级联依赖
- 确保依赖单向:依赖关系应为单向,避免循环依赖
- 使用异步操作处理服务端数据:通过
onDepsChange加载远程数据
性能优化
- 避免在 onDepsChange 中执行耗时操作:保持回调轻量
- 使用防抖处理频繁触发:对高频联动使用防抖或节流
- 缓存结果:对相同请求参数缓存结果,避免重复请求
错误处理与用户体验
- 使用 try-catch 处理异常:为异步联动添加错误处理,提供兜底数据
- 提供加载状态:在异步加载时显示 loading 或错误提示,控制联动层级不超过 3-4 层