在Redux表单中的Enter上专注于下一个输入字段

时间:2018-09-02 08:02:24

标签: reactjs redux focus redux-form refs

我想定义一个HOC(高阶组件),它将负责处理功能。 从'react'导入React,{组件};

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已过时。因此,当按下 enter 键时,如何实现类似于 tab 的行为。 我的表格是

<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 :(得分:0)

在您的构造方法中,像这样定义您的引用

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

引用Refs Documentation React

答案 1 :(得分:0)

您可以使用callback ref funtion创建一组可在字段之间循环使用的引用数组。它将在16.2和更高版本上使用。

准备就绪时显示解决方案;)

答案 2 :(得分:0)

这是我解决此问题的方法:
“我的表格”包含字段组件:
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 组件:(在该项目中,我们使用基于本机的数据库,但是没有它几乎是相同的。)

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