Окей, после нескольких часов борьбы вот что я должен был сделать (как я уже сказал, я использую новый синтаксис ссылок, Реакт 16.3).Я создал InputComponent с ref, переданным как props:
import React, { PureComponent } from 'react';
import PropTypes from 'prop-types';
import { Input } from 'native-base';
class InputComponent extends PureComponent {
static navigationOptions = {
header: null,
};
render() {
const { input, externalRef, ...rest } = this.props;
return (
<Input
{...rest}
ref={externalRef}
keyboardType="numeric"
maxLength={1}
value={input.value}
onChangeText={input.onChange}
/>
);
}
}
InputComponent.propTypes = {
input: PropTypes.object,
externalRef: PropTypes.object,
};
export default InputComponent;
Затем в моем компоненте, где реализованы вводы пин-кода:
constructor() {
super();
this.field0 = React.createRef();
this.field1 = React.createRef();
this.field2 = React.createRef();
this.field3 = React.createRef();
this.field4 = React.createRef();
this.field5 = React.createRef();
}
componentDidMount() {
this.field0.current._root.focus();
}
onChange = (text, val, body, name) => {
if (text.length === 1 && name !== '6') {
this[`field${name}`].current._root.focus();
} else if (text.length === 1 && name === '6') {
this.field5.current._root.blur();
}
};
Проблема здесь заключалась в том, что этот ужасный NativeBase Input имелтрудно получить доступ к функциям focus () и blur ().Наконец - одно из моих шести полей:
<Field
externalRef={this.field0}
style={styles.input}
name="1"
component={InputComponent}
placeholder="*"
onChange={this.onChange}
secureTextEntry
/>
Прямо сейчас, когда пользователь вводит некоторые числа, он переходит к следующему вводу и когда он или она вводит в последнее поле, запускается функция blur ().