Sameer
Sameer

Reputation: 3526

How to focus the next field of input, in react-native component

I have one component called ImageTextField:

import React from 'react';
import {TextInput, View } from 'react-native';

export default class ImageTextField extends React.Component {
  render() {
    const {
      placeHolderValue, value, editable
    } = this.props;
    return (
      <View>
        <TextInput
          placeholder={placeHolderValue}
          placeholderTextColor="#b1b1b1"
          value={value}
          editable={editable}
        />
      </View>
    );
  }
}

My screen:

import React from 'react';
import { StyleSheet, View, Text, TouchableOpacity} from 'react-native';
import ImageTextField from '../../custom-elements/ImageTextField';

export default class App extends React.Component {
  render() {
    return (
      <ImageTextField 
        onChangeText={text => this.onNameChange(text)}
        color={Colors.textFieldBlack}
        placeHolderValue="Name"
        value={this.state.name}
        autoCapitalize="words"
      />
      <ImageTextField
        onChangeText={text => this.onEmailChange(text)}
        color={Colors.textFieldBlack}
        placeHolderValue="E-mail"
        value={this.state.email}
        keyboardType='email-address'
      />
      <ImageTextField
        onChangeText={text => this.onPhoneChange(text)}
        color={Colors.textFieldBlack}
        placeHolderValue="Phone"
        value={this.state.phone}
        keyboardType="phone-pad"
      />
    );
  }
}

In above code, i have ImageTextField Component which i am using in my screen, i want to focus the next field, if user press next key in keyboard its need to be jump on second field.

Upvotes: 5

Views: 10095

Answers (2)

Muhammad Numan
Muhammad Numan

Reputation: 25413

Component Name= MyTextInput

render() {
return (
<View>
<TextInput
  onChangeText={this.props.onChangeText}
  placeholder="some text"
  value={this.state.value}
  ref={this.props.inputRef}
  onSubmitEditing={this.props.onSubmitEditing}
/>
  </View>
);
}

Then your App component will look like:

<MyTextInput 
    onChangeText={text => this.onNameChange(text)}
    color={Colors.textFieldBlack}
    placeHolderValue="Name"
    value={this.state.name}
    autoCapitalize="words"
    onSubmitEditing={() => this.email.focus()}
  />

  <MyTextInput 
    onChangeText={text => this.onNameChange(text)}
    color={Colors.textFieldBlack}
    placeHolderValue="email"
    value={this.state.name}
    autoCapitalize="words"
    inputRef={ref => this.email = ref}
    onSubmitEditing={() => alert('submitted')}
  />

Upvotes: 1

Foyarash
Foyarash

Reputation: 469

Add a prop which will retrieve the ref of the input to your ImageTextField component. So your render function should look like:

render() {
const {
  placeHolderValue, value, editable, inputRef
} = this.props;
return (
  <View>
    <TextInput
      placeholder={placeHolderValue}
      placeholderTextColor="#b1b1b1"
      value={value}
      editable={editable}
      ref={inputRef}
    />
  </View>
);
}

Then your App component will look like:

render() {
return (
  <ImageTextField 
    onChangeText={text => this.onNameChange(text)}
    color={Colors.textFieldBlack}
    placeHolderValue="Name"
    value={this.state.name}
    autoCapitalize="words"
    onSubmitEditing={() => this.emailAddress.focus()}
  />
  <ImageTextField
    onChangeText={text => this.onEmailChange(text)}
    color={Colors.textFieldBlack}
    placeHolderValue="E-mail"
    value={this.state.email}
    keyboardType='email-address'
    inputRef={ref => this.emailAddress = ref}
    onSubmitEditing={() => this.phoneNumber.focus()}
  />
  <ImageTextField
    onChangeText={text => this.onPhoneChange(text)}
    color={Colors.textFieldBlack}
    placeHolderValue="Phone"
    value={this.state.phone}
    keyboardType="phone-pad"
    inputRef={ref => this.phoneNumber = ref}
  />
);
}

Upvotes: 8

Related Questions