策略模式验证通过provide/inject实现可插拔、可隔离、可测试的校验逻辑:定义iverifystrategy接口,各规则独立实现,用validationregistry统一管理并注入,结合usefieldvalidator封装调用,支持动态获取策略与mock测试。

直接用 provide/inject 实现策略模式的变量验证,核心不是“把策略塞进去”,而是让验证逻辑可插拔、可隔离、可测试。Vue 的 provide/inject 本身不实现策略模式,但它能天然支撑策略模式的落地——尤其在跨层级组件共享统一验证上下文时。
验证策略需先抽象成接口化行为
不要把具体规则(比如邮箱正则、手机号长度)硬编码进组件。先定义一个轻量契约:
- 创建
IVerifyStrategy接口(TypeScript 中显式声明,JS 中可用注释或运行时校验):只含一个方法validate(value: any): { valid: boolean; message?: string } - 每个验证规则单独实现,如
EmailStrategy、PhoneStrategy、RequiredStrategy,彼此无依赖、无 if-else 分支 - 所有策略实例应由 DI 或工厂统一管理,避免组件内
new具体类
用 provide 注入策略容器而非单个策略
不推荐 provide('emailValidator', new EmailStrategy()) —— 这会锁死类型,失去运行时切换能力。正确做法是提供一个策略注册与分发中心:
- 定义一个
ValidationRegistry类,内部用Map<string iverifystrategy></string>存储已注册策略 - 在根组件或组合式函数中
provide('validatorRegistry', registry) - 子组件
inject('validatorRegistry')后,按字段名(如'email')动态获取对应策略,再调用.validate(value)
结合 Composition API 封装可复用验证逻辑
把策略调用封装成组合函数,让业务组件保持干净:
- 写一个
useFieldValidator(fieldName: string),内部自动 inject registry 并绑定当前字段策略 - 返回
{ validate, reset, isValid, errorMessage }等响应式状态和方法 - 表单组件只需
const { validate } = useFieldValidator('phone'),完全不关心底层是正则还是 API 校验
测试时通过 provide 轻松替换策略实现
单元测试最受益于此设计:
- 测试某个字段时,
render(Component, { global: { provide: { validatorRegistry: mockRegistry } } }) -
mockRegistry可返回预设结果的模拟策略(如 always return{ valid: false, message: 'mock error' }) - 彻底解耦验证逻辑与 UI 渲染,避免因策略内部网络请求或复杂计算导致测试不稳定










