专注于 Redux 表单中 Enter 的下一个输入字段
Focus on next Input field on Enter in Redux Form
我想定义一个负责处理功能的 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>
//生成域
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>
);
}
在你的构造方法中,像这样定义你的 ref
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"
/>
您可以使用 callback ref funtion 创建可用于在字段之间循环的引用数组。它适用于 16.2 和更新版本。
准备好后显示解决方案 ;)
我是这样解决这个问题的:
我的表单包含字段组件:
当 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>
);
}
}
我想定义一个负责处理功能的 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>
//生成域
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>
);
}
在你的构造方法中,像这样定义你的 ref
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"
/>
您可以使用 callback ref funtion 创建可用于在字段之间循环的引用数组。它适用于 16.2 和更新版本。
准备好后显示解决方案 ;)
我是这样解决这个问题的:
我的表单包含字段组件:
当 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>
);
}
}