Почему моя функция экспорта вызывается каждый раз при изменении TextInput

Привет, вот мой код в сценарии реагирования и ввода. Почему этот console.info вызывается каждый раз, когда мой текстовый файл вызывает изменение..

export default function TabOneScreen({
  navigation,
}) {
  
  const [out_1, set_out1] = useState('');
  const [out_2, set_out2] = useState('');
  const [main_device, setMain_dev] = useState('');
 
  


  console.info("run every time .. on text changed .."); // on change  text run every time ..
 // here I had some function for init textInput value and don't want to run every time ..
  


  return (
    <View style = {styles.container}>
      <View style = {{
      }}>


        <TextInput
          value = {out_1}
          onChangeText = {(username) => set_out1(username)}. 
        />


    
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
0
425
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Каждый раз, когда текст изменяется, он запускает функцию, которая меняет состояние, и каждый раз, когда состояние изменяется, компонент перезапускается, как и console.info. Вы должны обернуть свой console.info или функцию в хук useEffect, например:

useEffect(()=> {
console.info('...')
}, [])

Итак, как я мог предотвратить это?

dev moore 20.12.2020 23:11

Итак, как я мог предотвратить это?

dev moore 20.12.2020 23:11

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

dev moore 20.12.2020 23:12
Ответ принят как подходящий

Потому что каждый раз, когда вы меняете состояние, функция будет вызываться с новым состоянием. Основной жизненный цикл компонента реакции: Mounting , Updating, Unmounting. Когда вы впервые визуализируете элемент, он находится на этапе монтажа. После этого, когда вы измените состояние элемента или его свойства, они будут обновлены. И когда элемент будет удален, он находится в фазе размонтирования. При каждом обновлении состояния весь компонент снова визуализируется с использованием той же функции. Чтобы вызвать это только один раз, вам нужно использовать его на этапе монтирования. Сделать это:

useEffect(() => console.info("run every time .. on text changed ..") , [])

useEffect принимает два аргумента: первый — это функция, которую нужно запустить, а второй — состояние запуска этой функции. Здесь [] просто означает запускать это только на этапе монтажа. Чтобы вызвать другое состояние и запустить его, вы помещаете его внутрь массива. Например, предположим, что вы хотите, чтобы он запускался только при изменении состояния out_1, вы можете добавить его во второй параметр:

useEffect(() => console.info("run every time .. on out_1 changes ..") , [out_1])

Это означает, что запускайте эту функцию только при изменении out_1. Если вы собираетесь получать данные из API или любого другого ресурса, которые вам нужны перед первым рендерингом, и вам не нужно повторять это снова, то фаза монтирования (пустой массив []) — это время, когда вам нужно получить эти данные.

Спасибо, не могли бы вы обновить свой ответ и заполнить [] состоянием? еще раз спасибо

dev moore 20.12.2020 23:22

большое спасибо , это работа .. вы похожи с ЭКСПО ?

dev moore 21.12.2020 07:32

Да, я знаком с экспо

Samuel Sorial 22.12.2020 20:34

Очень хорошо, не могли бы вы посмотреть эту тему: stackoverflow.com/questions/65103398/…

dev moore 22.12.2020 23:34

добрый день, как мне кажется см. react сравнивает старый virtualDOM и новый модифицированный virtualDOM, то есть когда вы делали setState, вы вызывали изменение состояния компонента, а так как console. log находит его в теле, он его просто нарисовал.

когда вы меняете текст внутри ввода, вы устанавливаете свое состояние.

onChangeText = {(username) => set_out1(username)} 

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

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

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