【发布时间】:2018-04-13 22:32:39
【问题描述】:
TL;DR:React 提供受控组件 HOC,这是 NPM 中 React 验证库的基本思想。但是,弱点是与React Select等现有组件的集成以及错误消息的自定义显示位置
我正在从传统的编码 jQuery 和 PHP 迁移(多年来用于真实和大型项目,而不是学生学习玩代码)。我大部分时间都在关注 FORM,因为客户的要求总是关于 FORM。
现在有了 FORM,最重要的部分是验证方法/插件。首先忘记一些人告诉我们的“使用 React 你可以轻松地做受控组件,所以我们不需要验证插件”。我们在生产中的FORM需要上百个Field和很多Tab(比如一个人事表或者一些疯狂的组织报告),所以每个字段编码是不切实际的,它就像传统的js编码来验证表单。
来到图书馆,我测试了这三个可能已经足够了。
我不会详细介绍这些库,但它们的工作方式是相似的。我们必须为 input、select、textarea 和 form 创建一个组件才能使它们工作。在 Input 组件内部,我们定义了 Input 边框如何更改类以使边框错误变为红色以及错误消息如何出现(在 Input 下面的 div 或 span 中)。
(还有其他验证库,但它们的方法是对表单进行 json 验证,甚至使用 json 创建表单,这不是我的选择,因为我想仅通过输入中的一个简单属性来验证表单,例如 @987654329 @,不要在大量的定义 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 来解决。任何我们想到的 valition 案例都可以通过这个 lib 轻松优雅地解决(自定义错误放置、自定义字段、自定义验证器、自定义错误格式(不仅仅是 css 东西)......)
我只是在ComponentDidMount 中使用 React 表单进行 jQuery 验证,它可以正常工作。通过使用errorPlacement、highlight、success 函数 API 写入“验证配置文件”,也可以轻松集成任何自定义反应组件的验证。
感谢任何人到达此行,这真的是一个很长的话题。 这是我的问题:我试图“在反应中思考”,但无法解决最简单的问题:反应表单验证。
感谢任何提示我解决此问题。
【问题讨论】:
标签: jquery reactjs validation