TL;DR:React 提供受控组件 HOC,这是 NPM 中 React 验证库的基本思想。但是,弱点是与React Select等现有组件的集成以及错误消息的自定义显示位置
我正在从传统的 jQuery 和 PHP 编码迁移(多年来用于真实和大型项目,而不是学生学习玩代码)。我大部分时间都在 FORM 上,因为客户的要求总是关于 FORM。
现在有了 FORM,最重要的部分是验证方法/插件。首先忘记一些人告诉我们“使用 React 你可以轻松地做受控组件,所以我们不需要验证插件”。我们在生产中的 FORM 需要数百个带有许多选项卡的字段(例如人事表格或一些疯狂的组织报告),因此每个字段的编码是不切实际的,就像传统的 js 编码来验证表单一样。
来到图书馆,我测试发现这三个可能已经足够了。
我不会详细介绍这些库,但它们的工作方式是相似的。我们必须为 input、select、textarea 和 form 创建一个组件才能使它们工作。在 Input 组件中,我们定义了 Input 边框如何更改类以使边框错误为红色以及错误消息如何出现(在 Input 下方的 div 或 span 中)。
(还有其他验证库,但他们的方法是对表单进行 json 验证,甚至使用 json 创建表单,这不是我的选择,因为我只想通过输入中的一个简单属性来验证表单,例如[required, email]
,而不是在大量定义上浪费时间json)
现在我在这些情况下坚持使用这种技术:
1. 存在优秀组件的集成
我从 NPM 下载了优秀的组件来解决一些特定的功能(比如React Select)。现在开始真正的工作,我们必须验证这些自定义组件的输入。这是一项额外的工作,我们必须将验证集成到任何发现的额外组件中。我一头撞在墙上想出使用 HOC 来验证React Select像这样(React-Validation 代码)。为了完成这项工作,我必须修改 origin HOC 以创建自定义 HOC。
// Define own Input component
function MySelect({ error, isChanged, isUsed, ...selectProps }) {
return(
<div>
<Select onChange={selectProps.onChange.bind(this)} {...selectProps} {...( isChanged && isUsed && error ? {
className: `is-invalid-input ${selectProps.className}`
} : { className: selectProps.className } )} />
<input type="hidden" {...selectProps} />
{isChanged && isUsed && error}
</div>
)
}
const MyValidationSelect = controlSelect(MySelect); //My custom HOC
现在,我想不出更多在未来使用这种技术。想象一下,我们有项目并且需要一个额外的组件。我们没有太多时间来编写自己的代码,所以下载一个库。BOOM*,我们拼命想弄清楚如何使自定义组件验证。我们将把时间浪费在“副项目”上,而不是主要任务(客户端请求功能)上。
2. 验证消息的自定义位置
组件很好,但它也将代码包装在布局中。错误信息必须是输入组件的一部分。现在是困难的部分,一些疯狂的客户端需要将错误消息放在表单顶部或模式框中。在这种情况下,如果在组件中使用包装输入和错误,我仍然想不出解决方案。
3.我的肮脏解决方案
jQuery 出现的时间足以让 jQuery lib 变得成熟。使用 jquery 的验证可以通过所谓的jQuery Validation解决。使用这个库(自定义错误位置、自定义字段、自定义验证器、自定义错误格式(不仅仅是 css)...)
我只是使用 React 表单进行 jQuery 验证,ComponentDidMount
并且它按原样工作。通过使用errorPlacement
, highlight
,success
函数 API写入“验证配置文件” ,为任何自定义react组件集成验证也很简单。
感谢任何人到达这条线,这真的是一个很长的话题。这是我的问题:我试图“在react中思考”,但无法解决最简单的问题:react表单验证。
感谢您对我解决此问题的任何提示。