Вот как я решил эту проблему:
Моя форма с компонентами поля:
Когда поле expirationDate активно и пользователь нажимает следующую клавишу, фокус переходит к следующему полю, называемому securityCode . Кроме того, когда securityCode активен, и пользователь нажимает следующую кнопку, мы отправляем форму (потому что это последнее поле формы). Вот почему в этом поле определена onSubmitEditing prop.
<Form>
<Field
name={'expirationDate'}
component={renderInputRef}
withRef
forwardRef
ref={componentRef => (this.expirationDate = componentRef)}
refField="expirationDate"
onEnter={() => {
try {
this.cvc.getRenderedComponent().refs.cvc._root.focus();
} catch {
/*Do nothing */
}
}}
onChange={(event, newValue) => {
try {
if (newValue?.length == 5) {
this.cvc.getRenderedComponent().refs.cvc._root.focus();
}
} catch {
/*Do nothing */
}
}}
/>
<Field
name={'securityCode'}
component={renderInputRef}
onSubmitEditing={!invalid ? handleSubmit(this.submit) : null}
accessibilityLabel={'new-card-cvc'}
keyboardType={'number-pad'}
withRef
forwardRef
refField="cvc"
ref={componentRef => (this.cvc = componentRef)}
/>
</Form>
И компонент renderInputRef : (В этом проекте мы используем native-base, но без него почти то же самое.)
export class renderInputRef extends PureComponent<Props> {
render() {
const {
input,
onEnter,
refField,
display,
description,
iconRight,
meta: { touched, warning },
...custom
} = this.props;
var hasError = touched && (error !== undefined || warning !== undefined);
return (
<React.Fragment>
<Item
withRef
forwardRef
>
<Input
ref={refField}
returnKeyType={'next'}
onSubmitEditing={onEnter}
{...input}
{...custom}
/>
</Item>
</React.Fragment>
);
}
}