Сосредоточиться на следующем поле ввода при вводе в форме Redux
Я хочу определить HOC(Компонент высшего порядка), который будет отвечать за обработку функциональности. импортировать React, { Component } из 'response';
const NextFieldOnEnter = WrappedContainer =>
class extends Component {
componentDidMount() {
console.log('hoc', this.refs);
//move to next input field
}
render() {
return <WrappedContainer {...this.props} />;
}
};
export default NextFieldOnEnter;
Это говорит, что this.refs устарела. Итак, как я могу добиться поведения, подобного вкладке, когда нажата клавиша ввода. Моя форма
<Form>
<Field
withRef
hasFeedback
name="name"
ref={ref => {
this.field1 = ref;
}}
refField = "field1"
component={makeField}
type="date"
/>
<Field
withRef
hasFeedback
name="address"
ref={ref => {
this.field2 = ref;
}}
refField ="field2"
component={makeField}
type="date"
/>
</Form>
//makefield
render() {
const {type, input, label, ref, refField, ...rest} = this.props;
return (
<Form.Item
label={label}
colon={false}
type={type}
value={value}
ref={ref}
>
<Input {...props} />
</Form.Item>
);
}
2 ответа
В вашем методе конструктора определите ваш реф как
constructor(props) {
super(props);
this.field1 = React.createRef();
this.field2 = React.createRef();
}
В вашем рендере, где вы используете ref
сделай это.
<Field
withRef
hasFeedback
name="name"
ref={this.field1} // Proper way to assign ref in react ver 16.4
refField = "field1"
component={makeField}
type="date"
/>
Ссылка Ссылка Документация Реакция
Вот как я решил эту проблему:
Моя форма с компонентами поля:
Когда поле expirationDate активно и пользователь нажимает следующую клавишу, фокус переходит к следующему полю, называемому securityCode. Также, когда активен securityCode, и пользователь нажимает следующую кнопку, мы отправляем форму (потому что это последнее поле формы). Вот почему в этом поле определен реквизит onSubmitEditing.
<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>
);
}
}
Вы можете использовать функцию обратного вызова для создания массива ссылок, которые можно использовать для циклического перемещения между полями. Будет работать с 16.2 и новее.
Покажите решение, когда будете готовы;)