Сосредоточиться на следующем поле ввода при вводе в форме Redux - PullRequest
0 голосов
/ 02 сентября 2018

Я хочу определить HOC (Компонент высшего порядка), который будет отвечать за обработку функциональности. импортировать React, {Component} из'act ';

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 устарело . Итак, как мне добиться поведения tab , когда нажата клавиша enter . Моя форма

<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>
  );
}

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Вы можете использовать обратный вызов ref funtion для создания массива ссылок, которые можно использовать для циклического перемещения между полями. Он будет работать с 16.2 и новее.

Показать решение, когда будет готов;)

0 голосов
/ 31 мая 2019

Вот как я решил эту проблему:
Моя форма с компонентами поля:
Когда поле 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>
  );
 }
}
0 голосов
/ 02 сентября 2018

В вашем методе конструктора определите ваш реф как этот

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"
/>  

Ссылка Ссылка Реакция документации Реакция

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...