使用基本的表单/输入布局,很明显回调应该用于从子组件到父组件的状态更改(由子组件启动),但是父组件如何要求子组件重新评估其状态并将其传达回父组件?
这里的最终目标只是在提交表单按钮时触发子输入的验证。
给定的 [ts] 代码如下所示:
const Login : React.FC<Props> = (props) => {
...useStates omitted
const onSubmit = () : void => {
//trigger `verify()` in PasswordInput to get up-to-date `valid` state var
}
return (
<PasswordInput
onValidChange={setValid} />
<Button
onPress={submit} />
)
}
const PasswordInput : React.FC<Props> = (props) => {
...useStates omitted
const verify = () => {
//verify the password value from state
props.onValidChange(true)
}
return (<Input onBlur={verify}/>)
}
迄今为止采取的注意事项/路径:
- 您不能在函数组件上使用 ref 属性,因为它们没有实例。
- 尝试使用
useEffect
更新submitted
确实有效触发重新验证的状态变量,但排序useEffect
总是在父组件评估之后onSubmit
,导致过时的值。即,在valid
变量更新之前需要点击两次提交。 - react版本 16.14.4
更新 经验教训:
- 如果您要在子组件中触发一个动作,您可以使用下面 Nadia 概述的 refs 方法,但更合适的 React Way® 可能是通过共享的 Reducer。
- 不要期望在调用所述引用时始终通过对父级的回调来更新状态。就我而言,唯一有效的方法排序是让
verify
上面的方法实际返回最新值。