ReactNative TextInput焦点

时间:2017-07-13 14:00:08

标签: react-native

我在我的应用程序中有一个表单,我希望用户能够通过单击" Next"来转到下一个TextInput。返回按钮。 我的输入组件:

    export default class Input extends Component {

  focusNextField = (nextField) => {
    console.log('NEXT FIELD:', nextField);
    this.refs[nextField].focus();
  }

  render() {

    var keyboardType = this.props.keyboardType || 'default';
    var style = [styles.textInput, this.props.style];

    if (this.props.hasError) style.push(styles.error);

    return (
      <View style={styles.textInputContainer}>
        <TextInput
          placeholder={this.props.placeholder}
          onChangeText={this.props.onChangeText}
          style={style}
          blurOnSubmit={false}
          ref={this.props.reference}
          returnKeyType= {this.props.returnType}
          onSubmitEditing={() => this.focusNextField(this.props.fieldRef)}
          secureTextEntry={this.props.isPassword}
          value={this.props.value}
          keyboardType={keyboardType}
          underlineColorAndroid="transparent" />
        {this.props.hasError && this.props.errorMessage ? <Text style={{ color: 'red' }}>{this.props.errorMessage}</Text> : null}
      </View>
    );
  }
}

以及如何使用它:

<Input onChangeText={(email) => this.setState({ email })} value={this.state.email} returnType={"next"} reference={'1'} fieldRef={'2'} keyboardType="email-address" />

      <Text style={{ color: '#fff', marginTop: 10, }}>Password</Text>
      <Input onChangeText={(password) => this.setState({ password })} value={this.state.password} returnType={"done"}
       reference={'2'} fieldRef={'2'} isPassword={true} />

但我收到错误:

undefined is not an object (evaluating _this.refs[nextField].focus)

1 个答案:

答案 0 :(得分:3)

不确定您是否仍在尝试这样做,但对于遇到此问题的其他人,请执行以下操作:

  1. 将此代码添加到导入(导入中的任何位置)

    import { findNodeHandle } from 'react-native';
    import TextInputState from 'react-native/lib/TextInputState';
    export function focusTextInput(node) {
      try {
        TextInputState.focusTextInput(findNodeHandle(node));
      } catch(e) {
        console.log("Couldn't focus text input: ", e.message)
      }
    };
    
  2. 将以下行添加到构造函数

    this.focusNextField = this.focusNextField.bind(this);
    this.inputs = {};
    
  3. 将以下功能添加到您的班级

    focusNextField(id) {
      this.inputs[id].focus();
    }
    
  4. 按照以下方式修改TextInput

    <TextInput
      onSubmitEditing={() => {this.focusNextField('two');}}
      ref={ input => {this.inputs['one'] = input;}}
    />
    <TextInput
      onSubmitEditing={() => {this.focusNextField('three');}}
      ref={ input => {this.inputs['two'] = input;}}
    />
    ....
    
  5. Here is the source of that answer

    为我工作了0.45。