新闻中心
Yup when 方法语法更新指南:解决 is 属性不再支持的问题

本文详细阐述了 Yup 库从旧版本(如 0.26.x)升级到新版本(如 1.x)后,`when` 方法在条件验证语法上的主要变化。重点解决了旧版中 `is` 属性不再被支持的问题,并提供了使用函数式回调进行条件判断的新方法,帮助开发者顺利迁移并正确实现复杂的表单验证逻辑。
在现代前端开发中,表单验证是不可或缺的一环。Yup 作为一款强大的 J*aScript 模式验证库,因其简洁的 API 和灵活的验证能力,在 React 等框架中广受欢迎。然而,随着 Yup 库的不断迭代更新,其 API 也可能发生变化,这在版本升级时会给开发者带来一些挑战。本文将聚焦于 Yup 从旧版本(如 0.26.x)升级到新版本(如 1.x)后,when 条件验证方法的核心语法变更,特别是旧版中 is 属性不再被支持的问题,并提供相应的解决方案。
旧版 when 语法及问题分析
在 Yup 的早期版本中,when 方法允许开发者根据另一个字段的值来条件性地应用验证规则。其语法通常采用一个对象字面量,其中包含 is、then 和 otherwise 属性,用于定义条件和对应的验证模式。
考虑以下一个典型的旧版 Yup 验证模式,它根据 enabled 字段的布尔值来决定 hostname 字段是否需要验证:
import * as Yup from 'yup'; // 假设 Yup 已导入
// 辅助函数,包含正则表达式定义
const helpers = {
regEx: {
domainName: /^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$/
}
};
const { domainName } = helpers.regEx;
export default Yup.object({
enabled: Yup.boolean(),
hostname: Yup.string().when('enabled', {
is: true, // 旧版语法,判断 enabled 是否为 true
then: Yup.string()
.matches(domainName, '请提供一个完全限定域名')
.required('您必须提供主机名'),
otherwise: Yup.string().notRequired(),
}),
});当尝试将包含上述代码的项目从 Yup 0.26.x 升级到 1.x 版本时,编译器会抛出以下错误:
No overload matches this call.
Overload 1 of 4, '(keys: string | string[], builder: ConditionBuilder<StringSchema<string, AnyObject, undefined, "">>): StringSchema<string, AnyObject, undefined, "">', g*e the following error.
Argument of type '{ is: boolean; then: Yup.StringSchema<string, Yup.AnyObject, undefined, "">; otherwise: Yup.StringSchema<string, Yup.AnyObject, undefined, "">; }' is not assignable to parameter of type 'ConditionBuilder<StringSchema<string, AnyObject, undefined, "">>'.
Object literal may only specify known properties, and 'is' does not exist in type 'ConditionBuilder<StringSchema<string, AnyObject, undefined, "">>'.这个错误信息明确指出,传入 when 方法的第二个参数(一个对象字面量)与期望的类型 ConditionBuilder 不匹配,并且最关键的是,is 属性在 ConditionBuilder 类型中不再存在。这意味着 Yup 1.x 版本已经移除了通过 is 属性来定义条件的方式。
新版 when 语法:函数式回调的引入
在 Yup 1.x 及更高版本中,when 方法变得更加灵活,它不再接受一个包含 is 属性的对象,而是期望一个回调函数作为其第二个参数。这个回调函数负责接收依赖字段的值,并根据这些值返回相应的验证模式。
回调函数的签名通常是 ([dependentValue], schema) => Schema:
- [dependentValue]:一个数组,包含 when 方法第一个参数(依赖字段名)所对应的字段值。如果依赖多个字段,这个数组将包含所有这些字段的值。
- schema:当前正在构建的 Yup 模式实例。这允许你在回调函数内部链式调用 Yup 的验证方法。
这种函数式的方法提供了更大的灵活性,可以实现更复杂的条件逻辑。
实践案例:布尔值条件验证
让我们将前面提到的 ho
stname 验证逻辑,从旧版语法重构为 Yup 1.x 支持的新版函数式回调语法。
import * as Yup from 'yup';
const helpers = {
regEx: {
domainName: /^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$/
}
};
const { domainName } = helpers.regEx;
export default Yup.object({
enabled: Yup.boolean(),
hostname: Yup.string().when('enabled', ([enabled], schema) => {
// enabled 是一个数组,因为 'enabled' 是字符串数组的简写形式
// 如果只有一个依赖字段,可以安全地取第一个元素
if (enabled) { // 判断 enabled 字段的值是否为 true (或存在)
return schema
.matches(domainName, '请提供一个完全限定域名')
.required('您必须提供主机名');
}
return schema.notRequired();
}),
});在这个新的实现中:
- when('enabled', ...):我们依然指定 enabled 字段作为依赖。
- ([enabled], schema) => { ... }:第二个参数现在是一个箭头函数。
- [enabled] 解构了依赖字段的值。这里 enabled 变量将直接持有 enabled 字段的布尔值。
- schema 是当前 hostname 字段的 Yup.string() 实例。
- 在函数内部,我们使用简单的 if (enabled) 条件判断,然后返回链式调用的 schema,应用所需的验证规则。
实践案例:字符串值条件验证
新版 when 方法的函数式回调对于处理字符串或枚举类型的条件也同样强大。例如,根据 marital_status(婚姻状况)字段的值来决定 companion_name(伴侣姓名)字段是否必填。
假设 marital_status 的值可以是 'C' (已婚), 'D' (同居), 'E' (订婚) 或其他(单身,离异等)。只有当婚姻状况为 'C', 'D', 'E' 时,伴侣姓名才需要填写。
import * as Yup from 'yup';
export const userSchema = Yup.object({
marital_status: Yup.string().required('请选择婚姻状况'),
companion_name: Yup.string().when('marital_status', ([marital_status], schema) => {
// 定义需要伴侣姓名的婚姻状态列表
const requiresCompanionName = ['C', 'D', 'E'];
// 检查当前的 marital_status 是否在列表中
if (requiresCompanionName.includes(marital_status)) {
return schema
.trim() // 移除前后空格
.min(2, '伴侣姓名至少需要2个字符')
.required('请提供伴侣姓名');
}
return schema.notRequired();
}),
// 其他字段...
});这个例子清晰地展示了如何利用回调函数内的 J*aScript 逻辑来处理更复杂的条件判断,例如使用 Array.prototype.includes() 方法。
注意事项与最佳实践
- 版本兼容性: 始终注意 Yup 的版本。本教程中的新语法适用于 Yup 1.x 及更高版本。如果你的项目仍在使用旧版本,请在升级前仔细阅读官方迁移指南。
- 官方文档: 遇到任何不确定的情况,官方文档永远是最好的参考来源。它会提供最权威、最新的 API 信息。
-
复杂条件: 对于涉及多个依赖字段或更复杂逻辑的条件,函数式回调的优势更加明显。你可以传递一个字段名数组给 when 方法,回调函数将接收一个包含所有这些字段值的数组。
// 示例:依赖两个字段 Yup.string().when(['fieldA', 'fieldB'], ([valueA, valueB], schema) => { if (valueA === 'someValue' && valueB > 10) { return schema.required(); } return schema.notRequired(); }); - 链式调用: 在回调函数内部,务必返回一个 Yup 模式实例。你可以对传入的 schema 参数进行链式调用,添加或修改验证规则。
总结
Yup 1.x 版本对 when 方法的语法更新,从 is 属性的对象字面量转向了函数式回调,这代表了一种更灵活、更强大的条件验证范式。虽然这要求开发者适应新的编码风格,但它也使得处理复杂依赖和动态验证逻辑变得更加直观和可维护。通过理解并掌握这种新的函数式方法,开发者可以更高效地构建健壮且用户友好的表单验证系统。在进行 Yup 版本升级时,务必注意这些语法变化,并根据本文提供的指南进行相应的代码调整。
以上就是Yup when 方法语法更新指南:解决 is 属性不再支持的问题的详细内容,更多请关注其它相关文章!
# 第二个
# 长沙农产品营销推广招聘
# 长沙全网营销专业推广
# 滁州网站建设方案服务
# 少儿培训竞价推广营销
# 搜狗网站建设推广
# 绵竹网站推广网络营销
# 天津SEO优化电池推荐
# 梅州420seo-80310
# 山东阀门网站建设
# 北京网站建设收费标准
# 重构
# 多个
# 第一个
# 是一个
# 升级到
# react
# 旧版
# 表单
# 链式
# 回调
# red
# 字符串数组
# win
# ai
# 前端开发
# 回调函数
# 编码
# 正则表达式
# 前端
# java
# javascript
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】
Promise错误处理:在catch后终止链式then执行的策略
使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战
小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】
Golang如何实现状态模式管理对象状态_Golang State模式实现技巧
Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏
J*a递归快速排序中静态变量的状态管理与陷阱
响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配
如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension
快速CSGO开箱网站指南 CSGO开箱平台推荐
极速漫画官方主页网址 极速漫画漫画在线浏览官网链接
HTML空白字符处理机制:渲染、DOM与编码实践
处理Kafka消费者会话超时:深入理解消息处理语义与幂等性
Selenium Python中处理点击后新窗口加载冻结问题的策略与实践
HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解
CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示
豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售
ExcelARRAYTOTEXT函数怎么自定义分隔符输出数组文本_ARRAYTOTEXT实现动态生成SQL语句
Android Studio计算器C键功能异常排查与修复教程
Python自定义类排序:解决lambda键值访问TypeError的实践指南
深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现
PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程
J*aScript DOM操作:高效清空列表元素的策略与实践
J*aScript动态修改指定div内所有a标签样式指南
C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责
Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略
汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口
Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践
Composer中的^和~符号代表什么_精通Composer版本号语义化约束
如何使用Go和Martini动态服务解码后的图片
使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性
实现全屏滚动与导航点:专业教程
PySpark中从现有列右侧提取可变长度字符创建新列的教程
如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略
win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】
微博网页版官方账号登录 微博网页版内容浏览使用指南
windows10怎么关闭系统提示音_windows10彻底静音设置方法
在哪找SublimeJ远程工具_SFTP插件配置教程
PHP 枚举:根据字符串获取枚举案例的策略与实现
c++ 获取系统当前时间 c++时间戳获取方法
Django表单验证失败时保留用户输入数据的最佳实践
铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则
Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】
PHP中获取MongoDB服务器运行时间(Uptime)的专业指南
构建轻量级网站内部消息系统:Formspree 集成指南
sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件
Log4j Console Appender性能瓶颈与高并发优化策略
在Runstone环境中高效处理TasteDive API的JSON数据
Tailwind CSS line-clamp 布局问题解析与修复指南
ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版


2025-11-13
浏览次数:次
返回列表