You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
其中,字段的前端验证,其实就是前面提供的 onValidate 接口,该种验证是同步完成的,通常速度极快,多只是校验表单数据是否为空,长度是否过长等「格式」上的问题。这种验证方式下,出错信息可以直接反映到字段上,通常来说,出错信息也是存储在组件的 state 中即可。
为字段验证带来挑战的是后端验证方式。由于需要走一趟后端,所以必然要调一趟 API,再从 API 的结果来确定是否有出错信息、出错信息是什么。而一般而言,我们的出错信息是在组件的 state 中管理的,而一般来说 API 作为有副作用的行为,发生地都在 redux/saga 中,最后必然是从 props 这种进来。那么,如何管理这两个不同的数据源?策略无外乎三种:
统一数据源到组件内部 state。这使得 API 必须写到组件内部,而非 thunk/saga 等专门管理的工具,不利于架构可追溯状态的应用,一定程度上违背了 react/redux 应用的架构和设计原则
React 表单设计
一份表单设计,其他涉及众多的细节。如果单独处理,无疑什么繁琐,充满众多细节。而其实上,作为「填表单」这个行为,它定制的部分却往往不多,比如使用者只需要关注「验证逻辑」、「显示什么错误信息」等高层的东西,而底层的行为和细节代码我们希望不需要过多关注。这样,「表单」就具有了一些逻辑上的共性,可以把这些东西抽取出来,封装成为组件,然后让使用者只需要关注高层的东西(逻辑、错误信息、验证方式等)。
基于这个考虑,「表单填写」这个场景有哪些细节需要考虑呢?不同的细节决定了怎样不同的技术实现方式呢?高层需要考虑的东西可以简化成什么呢?
基本问题
f(data) => errorMessage
更细节问题
技术支持
下面谈谈这几种场景所需要的解决方案。
onValidate
即可,因为这里需要支持定制化的点就是这个 validator:validate(data) => errorMessage
。它需要实现这个契约onSubmit
方法即可,这也是需要支持定制化的点Form
表单级别的组件,它会通过某种契约知晓、控制组件之间的状态(显示、错误信息、数据、是否禁用等)Field
字段级别的组件,它需要实现某种契约,与 Form 组件通晓状态比较难缠的是字段的异步(后端)验证这个问题。一般来说,表单的验证分为两种,一种是表单级别的验证,这种验证一定要通过后端验证;另一种是字段级别的验证,这种验证既可以使用前端验证,也可以使用后端验证。
其中,字段的前端验证,其实就是前面提供的
onValidate
接口,该种验证是同步完成的,通常速度极快,多只是校验表单数据是否为空,长度是否过长等「格式」上的问题。这种验证方式下,出错信息可以直接反映到字段上,通常来说,出错信息也是存储在组件的 state 中即可。为字段验证带来挑战的是后端验证方式。由于需要走一趟后端,所以必然要调一趟 API,再从 API 的结果来确定是否有出错信息、出错信息是什么。而一般而言,我们的出错信息是在组件的 state 中管理的,而一般来说 API 作为有副作用的行为,发生地都在 redux/saga 中,最后必然是从 props 这种进来。那么,如何管理这两个不同的数据源?策略无外乎三种:
API
综上,作为表单的设计者,在获得一个满意的解决方案前,你需要问自己,自己的表单复杂性有多高?是否需要支持字段级别的后端验证?是否需要支持跨字段的验证?是否需要定制 UI?有了确定的答案后,你才能知道这个表单需要什么技术支持、是否需要引入三方库,以及如何选择合适的三方库等。
三方库
The text was updated successfully, but these errors were encountered: