【发布时间】:2020-06-18 07:13:45
【问题描述】:
我有一个表单,它使用大量逻辑和自动填充字段,具体取决于用户输入等。 此外,我需要在用户输入时提供实时验证。
我曾经手动调用验证器,这取决于 setState() 将更新哪些字段,但很快就变得无法维护。然后我创建了一个函数来调用我拥有的所有验证器方法,并在每次更新状态时手动调用它。
现在我考虑更进一步,并自动调用该函数。我想使用
componentDidUpdate() react 生命周期方法。
componentDidUpdate(prevProps, prevState) {
if (_.isEqual(prevState.data, this.state.data))
return;
this.validateAll();
}
现在,如果任何表单字段发生更改 - 我们会运行完整验证以确保我们没有忘记任何内容。但问题是 lodash _.isEqual() 是一个代价高昂的深度比较操作,并且 componentDidUpdate() 生命周期方法会在任何用户输入时调用,因此这可能会导致性能问题。
我决定通过去抖动来减少比较的数量以及验证函数调用的数量。
handleValidation = (prevState) => {
if (_.isEqual(prevState.data, this.state.data))
return;
this.validateAll();
};
debouncedHandleValidation = _.debounce(this.handleValidation, 200);
componentDidUpdate(prevProps, prevState) {
this.debouncedHandleValidation(prevState);
}
这是一个Live demo(记录对深度比较和验证的调用)
我的问题是:这样处理表单验证可以吗,或者有什么我没有采取 考虑到我的方法不好?
谢谢。
【问题讨论】:
-
componentDidUpdate()不是一个反应钩子,它是一个生命周期方法。我可能有点迂腐,但我认为值得了解其中的区别。 -
@evolutionxbox 谢谢,已修复 - 我的 php 过去让我这么称呼它;]
标签: javascript reactjs forms