Predicate是运行时动态判定函数,用于决定多步骤向导中当前步骤是否满足进入下一环节的拓扑条件,替代硬编码校验,支持复用、组合、测试及响应式重求值。

在多步骤工作流向导中,Predicate 不是用来“标记”步骤的视觉状态,而是作为运行时的动态判定函数,决定当前步骤是否满足进入下一环节的拓扑条件。它的核心价值在于把“是否可通行”从静态配置升级为基于上下文数据的实时计算。
用 Predicate 替代硬编码校验逻辑
传统向导常把每步校验写死在按钮点击事件里,比如:if (form.name.value && form.email.valid) {...}。这种方式难以复用、难测试、难扩展。改用 Predicate 后,每个步骤对应一个可复用、可组合、可单元测试的判定函数:
-
步骤1(基础信息):
Predicate<formdata> step1Ready = data -> !data.name.trim().isEmpty() && isValidEmail(data.email);</formdata> -
步骤2(权限确认):
Predicate<formdata> step2Ready = data -> data.hasConsent && data.role != null;</formdata> -
步骤3(支付验证):
Predicate<formdata> step3Ready = data -> data.paymentMethod != null && data.amount > 0;</formdata>
将 Predicate 绑定到步骤拓扑节点
在工作流引擎(如 Dify、Prefect 或自研向导框架)中,每个步骤应关联一个 Predicate 实例,而非布尔开关。执行“下一步”前,引擎调用该 Predicate 并传入当前上下文数据:
- 若返回 true,允许推进,并自动记录
stepX.status = "passed"; - 若返回 false,阻止跳转,触发对应提示(如高亮未填字段、显示错误文案),不修改步骤状态;
- 支持组合多个 Predicate:
allOf(step1Ready, step2Ready).test(currentData),用于“必须全部满足”的聚合校验。
支持运行时动态拓扑变更
Predicate 的真正优势在于它能响应输入变化而重求值。例如:
- 用户在步骤2勾选“需要人工审核”,则步骤3的 Predicate 变为:
data -> data.requiresReview ? data.approverId != null : true; - 步骤1中选择“企业账户”,自动激活隐藏的步骤4(资质上传),其 Predicate 仅在该分支下生效;
- 所有 Predicate 可统一注入日志埋点或监控钩子,便于追踪哪一条件在何时失效。
与状态管理协同落地
Predicate 本身不保存状态,但可驱动状态更新。建议配合轻量状态对象使用:
- 定义
StepStatus { id: string, predicate: Predicate<t>, lastResult: boolean, lastEvalTime: Date }</t>; - 每次表单字段变更或步骤切换时,批量重执行相关 Predicate,刷新
lastResult; - UI 层根据
lastResult渲染步骤图标(✅ / ⚠️ / ❌),并禁用/启用导航按钮。

















