React Native — переход к следующему вводу после максимальной длины

#reactjs #react-native

#reactjs #react-native

Вопрос:

Я в значительной степени новичок в react native в настоящее время я создаю небольшое приложение, чтобы получить лучшее представление об этом. я использую react-native-paper в качестве библиотеки пользовательского интерфейса. В настоящее время я застрял в проблеме, т.Е. у меня было два поля ввода с максимальной длиной, равной 3. Мне нужно автоматически перейти от первого ввода к следующему, когда первый ввод достиг своей максимальной длины, т.Е. 3. Я пытался добавить returnKeyType="next" в поле ввода, но оно не работает.

         <View style={styles.textinputViewleft}>
            <NumberInput 
            style={styles.textinput} 
            label="Digit"
            returnKeyType="next"
            value={digit.value}
            onChangeText={(text) => setDigit({ value: text, error: '' })}
            error={!!digit.error}
            errorText={digit.error}
            keyboardType="numeric"
            maxLength={3} />
        </View>
        <View style={styles.textinputView}>
            <NumberInput 
            style={styles.textinput} 
            label="Count"
            value={count.value}
            onChangeText={(text) => setCount({ value: text, error: '' })}
            error={!!count.error}
            errorText={count.error}
            keyboardType="numeric"
            maxLength={3}  />
        </View>
 

Ссылка на закуску

Ответ №1:

Прежде всего, создайте ref , чтобы получить доступ к входным данным.

 const ref = React.useRef();
 

Затем передайте его второму TextInput .

 <NumberInput 
  ref={ref}
  style={styles.textinput}
  ...
/> 
 

Когда длина вашего первого ввода достигнет 3, вызовите focus , чтобы вставить курсор во второй ввод.

 onChangeText={(text) => {
  if (text.length === 3) {
    ref.current.focus();
  }
  setDigit({ value: text, error: '' });
}}
 

Комментарии:

1. Замечательный ответ, useRef — такой мощный хук.

2. @LeriGogsadze Поскольку я использую библиотеку react-native-paper, этот метод, который вы предложили выше, не работает. Если мы импортируем Textinput из встроенной в rect библиотеки по умолчанию, она будет работать. Но в конкретной библиотеке пользовательского интерфейса это не работает.

3. @soorajspillai Я пробовал, и это работает. Можете ли вы показать мне свой NumberInput компонент?

4. Я изменил numberinput на textinput, это также пользовательский компонент snack.expo.io/@ssoorajs96/sjs

5. Да, вот почему это не сработало. Вы должны использовать forwardRef hook. snack.expo.io/HgJK7hzIC проверьте это.

Ответ №2:

введите описание изображения здесь

Рабочий пример, основанный на существующем ответе @Leri Gogsadze :

 export default function App() {
  const [numOne, setNumOne] = useState('');
  const [numTwo, setNumTwo] = useState('');
  const ref = useRef();
  return (
    <View style={styles.container}>
      <TextInput
        style={styles.input}
        placeholder="enter number"
        maxLength={3}
        value={numOne}
        onChangeText={(value) => {
          setNumOne(value);
          if (value.length === 3) {
            ref.current.focus();
          }
        }}
        returnKeyType="next"
      />
      <TextInput
        style={styles.input}
        ref={ref}
        placeholder="enter name"
        maxLength={3}
        value={numTwo}
        onChangeText={(value) => setNumTwo(value)}
      />
    </View>
  );
}
 

Рабочий пример приложения: Expo Snack

Комментарии:

1. Поскольку я использую библиотеку react-native-paper, этот метод, который вы предложили выше, не работает. Если мы импортируем Textinput из встроенной в rect библиотеки по умолчанию, она будет работать. Но в конкретной библиотеке пользовательского интерфейса это не работает.

2. Если возможно, разместите ссылку на демонстрационное приложение, имеющее проблемы, о которых вы упомянули, нам будет легко воспроизвести те же сценарии и отладить.

3. Вы можете проверить эту закуску snack.expo.io/@ssoorajs96/sjs