【发布时间】:2021-07-25 04:22:17
【问题描述】:
我有表单和输入组件。表单包含 Input 作为子项。每当表单提交时,我都会向子 Input 组件发送一个递增的值。在 Input 组件中,我在该递增值上有一个侦听器 (useEffect) 来验证输入。在验证输入后,我正在调用一个函数 onValidation(isValid),它作为道具从父级接收。并尝试使用验证结果更新父组件。但是,当表单提交时,所有子组件同时调用 onValidation 方法,父组件立即设置状态。因为反应 setstate 不会立即影响验证数据在父项中设置不正确。这是代码。
有什么办法可以解决这个问题吗?如果不是,这些用例的最佳模式是什么?
function Form() {
const [validations,setValidations] = useState({})
function onValidation(isValid,key) {
setValidations({...validations,...{[key]:isValid}});
}
function onSubmit(){
//Here the validations object not containing all the input fields data.
// because while doing setValidation some data is missing
let isValid = Object.keys(validations).reduce((prev,curKey)=>{return (prev && validations[curKey]) },true);
if(isValid) {
window.alert("The form is valid");
}else {
window.alert("The form is not valid");
}
}
return (
<form onSubmit={onSubmit}>
<Input name="first" onValidation={onValidation}/>
<Input name="second" onValidation={onValidation}/>
<Input name="third" onValidation={onValidation}/>
<Input name="fourth" onValidation={onValidation}/>
</form>
)
}
function Input(value,name,onValidation) {
function validate(e) {
var val = e.target.value;
if(val){
onValidation(true,name)
}else {
onValidation(false,name)
}
}
return (
<input type="text" onChange={validate} value={value}>
)
}
【问题讨论】:
-
你应该提供一个最小的代码沙箱,这样我们才能最好地帮助你,从第一眼看这个代码似乎工作正常
-
抱歉耽搁了。附加代码框链接codesandbox.io/s/serene-hofstadter-4nqr3?file=/src/App.js@EliavLouski,您可以在检查窗口中看到验证的控制台打印。验证对象不包含所有键。
-
它是因为你用
{}而不是{fourth: false, first: false, second: false, third: false}初始化validations -
即使我用初始值初始化它们。当我在 useState() 中打印它们时,它们没有正确更新。因为反应异步更新状态。请检查控制台日志中的值。
-
我不明白你在说什么,更新的值记录在控制台中。
标签: javascript reactjs forms validation