Текущий текстовый ввод React Native

У меня есть компонент и использование этого компонента Я не могу написать правильный ввод, чтобы можно было вводить только числа без , . и так на, пожалуйста, помогите компонентиспользование компонента

мой компонент

export default function AppTextInput({icon, placeholder,onChangeText, ...otherProps}) {

 const  onChanged =(text) =>{
     let newText = '';
     let numbers = '0123456789';
     for (var i=0; i < text.length; i++) {

             if (numbers.indexOf(text[i]) > -1) {
                 newText = newText + text[i];
             } else {
                 alert("please enter integer numbers only");

             }
     }

   }

   return (

       <View style = {styles.container}>
           {icon &&
               <MaterialCommunityIcons style = {{marginRight: 10}} name = {icon} color = {colors.grayMedium} size = {20}/>}
           <TextInput style = {defaultStyles.text} placeholder = {placeholder}
                      onChangeText = {(text)=> onChanged(text)}  maxLength = {3} {...otherProps}
           ></TextInput>
       </View>
   )
}

использование компонента

  <View style = {{top: -80}}>
                    <AppTextInput icon = "timer-sand"  placeholder = {"Prep Time"} keyboardType='numeric' onChangeText = {(text) => setPrepTime(text)}/>
                    <AppTextInput icon = "timer" placeholder = {"Round Duration"} keyboardType='number-pad' onChangeText = {(text) => setRoundDuration(text)}/>
                    <AppTextInput icon = "timer" placeholder = {"Break Duration"} keyboardType='number-pad' onChangeText = {(text) => setBreakDuration(text)}/>
                    <AppTextInput icon = "repeat" placeholder = {"Number of Rounds"} keyboardType='number-pad'  onChangeText = {(text) => setNumRounds(text)}/>
                    <AppTextInput icon = "format-list-numbered" placeholder = {"Number of Sets"} keyboardType='number-pad' onChangeText = {(text) => setNumSets(text)}/>
                    {exerciseInputEles}
                </View>    

Я пробовал эти решения, но это не сработало, я думаю, что не понимаю, в какое место поставить и как использовать, чтобы оно начало работать.

почему решение не сработало? как выглядело решение? Вы должны поставить это onChangeText

jted95 13.12.2022 05:48

я редактирую свой вопрос, вы можете посмотреть?

akame 13.12.2022 07:22

Я добавил свой ответ, проверьте его. Я заменяю вашу функцию, чтобы проверить, есть ли в тексте нецифра, на функцию, которая использует regex для замены нецифры на пустую строку.

jted95 13.12.2022 09:08
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
62
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Во-первых, аргументом обработчика события onChange является не новое значение ввода, а объект события. Вы можете получить доступ к значению, выполнив что-то вроде этого:

onChange(event) {
    let text = event.target.value;
    ...
onChangeText имеет text с типом string в качестве аргумента
jted95 13.12.2022 08:45

я пытаюсь сделать так, но

export default function AppTextInput({icon, placeholder,onChangeText, ...otherProps}) {

  const  onChanged =(text) =>{
      let newText = '';
      let numbers = '0123456789';
      for (var i=0; i < text.length; i++) {

              if (numbers.indexOf(text[i]) > -1) {
                  newText = newText + text[i];
              } else {
                  alert("please enter integer numbers only");

              }
      }

    }

    return (

        <View style = {styles.container}>
            {icon &&
                <MaterialCommunityIcons style = {{marginRight: 10}} name = {icon} color = {colors.grayMedium} size = {20}/>}
            <TextInput style = {defaultStyles.text} placeholder = {placeholder}
                       onChangeText = {(text)=> onChanged(text)}  maxLength = {3} {...otherProps}
            ></TextInput>
        </View>
    )
}

когда я ввожу оповещение, работает, но onChangeText = {(text) => setNumRounds(text)} и другие не видят мой ввод, почему?

  <View style = {{top: -80}}>
                    <AppTextInput icon = "timer-sand"  placeholder = {"Prep Time"} keyboardType='numeric' onChangeText = {(text) => setPrepTime(text)}/>
                    <AppTextInput icon = "timer" placeholder = {"Round Duration"} keyboardType='number-pad' onChangeText = {(text) => setRoundDuration(text)}/>
                    <AppTextInput icon = "timer" placeholder = {"Break Duration"} keyboardType='number-pad' onChangeText = {(text) => setBreakDuration(text)}/>
                    <AppTextInput icon = "repeat" placeholder = {"Number of Rounds"} keyboardType='number-pad'  onChangeText = {(text) => setNumRounds(text)}/>
                    <AppTextInput icon = "format-list-numbered" placeholder = {"Number of Sets"} keyboardType='number-pad' onChangeText = {(text) => setNumSets(text)}/>
                    {exerciseInputEles}
                </View>

Вы не предоставили никакой ценности для своего ввода и, возможно, забыли изменить состояние. Читайте о управляемых входах. Есть пример для компонентов класса, но он работает аналогично и для функциональных компонентов.

Azizbek PhD 13.12.2022 07:27

как я могу решить мою проблему, я не понимаю?

akame 13.12.2022 07:34

Вы только обработали событие, но не прочитали значение из текущего состояния

Azizbek PhD 13.12.2022 07:50

Вы можете изменить мой код, чтобы решить эту проблему?

akame 13.12.2022 07:53
Ответ принят как подходящий

Вот код, который вы можете использовать:

  1. Я перемещаю имеющуюся у вас функцию onChanged в другой файл и использую Regex для замены нецифрового символа пустой строкой.

Кроме того, я изменил входное значение вашего onChangeText с (text)=> onChanged(text) на onChangeText (это реквизит), потому что onChanged больше нет.


export default function AppTextInput({
  icon,
  placeholder,
  onChangeText,
  ...otherProps
}) {
  return (
    <View style = {styles.container}>
      {icon && (
        <MaterialCommunityIcons
          style = {{ marginRight: 10 }}
          name = {icon}
          color = {colors.grayMedium}
          size = {20}
        />
      )}
      <TextInput
        style = {defaultStyles.text}
        placeholder = {placeholder}
        onChangeText = {onChangeText}
        maxLength = {3}
        {...otherProps}
      ></TextInput>
    </View>
  );
}
  1. Здесь я добавил функцию под названием replaceNonNumeric, функция используется для замены любой нечисловой цифры на пустую строку, поэтому в ней будет только цифра.

  2. Я вызвал replaceNonNumeric прямо перед изменением состояния и передал новое значение в setState.

...
 const replaceNonNumeric = (text) => {
    return text.replace(/[^0-9]/g, '');
  };

  return (
    <View style = {{ top: -80 }}>
      <AppTextInput
        icon = "timer-sand"
        placeholder = {'Prep Time'}
        keyboardType = "numeric"
        onChangeText = {(text) => {
          const newText = replaceNonNumeric(text);
          setPrepTime(newText);
        }}
      />
      <AppTextInput
        icon = "timer"
        placeholder = {'Round Duration'}
        keyboardType = "number-pad"
        onChangeText = {(text) => {
          const newText = replaceNonNumeric(text);
          setRoundDuration(newText);
        }}
      />
      <AppTextInput
        icon = "timer"
        placeholder = {'Break Duration'}
        keyboardType = "number-pad"
        onChangeText = {(text) => {
          const newText = replaceNonNumeric(text);
          setBreakDuration(newText);
        }}
      />
      <AppTextInput
        icon = "repeat"
        placeholder = {'Number of Rounds'}
        keyboardType = "number-pad"
        onChangeText = {(text) => {
          const newText = replaceNonNumeric(text);
          setNumRounds(newText);
        }}
      />
      <AppTextInput
        icon = "format-list-numbered"
        placeholder = {'Number of Sets'}
        keyboardType = "number-pad"
        onChangeText = {(text) => {
          const newText = replaceNonNumeric(text);
          setNumSets(text);
        }}
      />
      {exerciseInputEles}
    </View>
...

Другие вопросы по теме