Как обновить useState в TextInput - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть простой <TextInput> в React Native, и я хочу напечатать некоторый текст при изменении значения. Его работает после ввода второго символа, но нет, когда пользователь нажимает только один символ. Я пытаюсь использовать функции и даже с onChange и взять из e.target.value, но всегда отсутствует один символ в состоянии "поиска".

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

const App = () => {
  const [search, setSearch] = useState('');
  const [searching, setSearching] = useState(false); 
  return(
    <View>
      <TextInput 
        onChangeText={(value) => {
          setSearch(value)
          setSearching(search=='' ? false : true)
        }}
        value = { search }
      />
      {
        searching ?
        (
          <Text>Searching</Text>
        ) : (
          <Text>No searching</Text>
        )
      }
    </View>
  );
} 

export default App

Я ожидаю показать «Поиск», когда значение TextBox не пустое.

Ответы [ 3 ]

1 голос
/ 29 апреля 2019

Вам необходимо сравнить фактическое значение TextInput

. Использование search=='' ? false : true проверит предыдущее состояние и не изменится

onChangeText={(value) => {
  setSearch(value)
  setSearching(search=='' ? false : true)
}}

Это проверит измененныезначение.

onChangeText={(value) => {
  setSearch(value)
  setSearching(value == '' ? false : true) // use value
}}

Вам нужно использовать value вместо search

Просто измените это

setSearching(search=='' ? false : true)

на

setSearching(value=='' ? false : true)
0 голосов
/ 29 апреля 2019

После помощи обоих я решил. Это код, если кому-то помочь. Идея заключается в TextInput с иконкой len слева, и когда пользователь начинает писать, он звонит в Firebase и показывает иконку загрузки справа (spinner).

    <Icon
      name='search'
      size={25} 
      color={PRIMARY_BACKGROUND_COLOR}
      style={styles.searchIcon}
    />
    <TextInput 
      underlineColorAndroid = 'transparent' 
      style = { styles.textBox }
      onChangeText={(value) => { onChangeText(value) }}
      value = { search }
      placeholder = { i18n.t('Search') }
    />
    {
      searching ?
      (
        <TouchableOpacity style = { styles.visibilityBtn }> 
          <Animatable.View
          ref={ref => (this.AnimationRef = ref)}
          animation='rotate'
          easing='linear'
          iterationCount='infinite'
          >
            <Icon
              name='spinner-3'
              size={20}
              color={PRIMARY_BACKGROUND_COLOR}
            />
          </Animatable.View>
        </TouchableOpacity>
      ) : (
        <TouchableOpacity onPress={ clearSearch } style = { styles.visibilityBtn }>
          <Icon
            name='close'
            size={20}
            color={PRIMARY_BACKGROUND_COLOR}
          />
        </TouchableOpacity>
      )
    }

И функция

  const onChangeText = value => {
    setSearch(value)
    setSearching(value =='' ? false : true)
    Helper.getCategoriesSearch(value, (categories) => {
      setSearching(false)
      //props.searchResults(categories); THIS DO NOT WORK RETURN DATA TO props :(
    })
  }

Спасибо всем

0 голосов
/ 29 апреля 2019

useState или setState может быть асинхронным , поэтому при первом вызове setSearch(value) состояние search может быть еще не обновлено.

onChangeText={(value) => {
  setSearch(value)
  setSearching(search == '' ? false : true) // "search" is still previous value
}}

Вместо этого вы можете напрямую использовать value вместо этого для проверки.

onChangeText={(value) => {
  setSearch(value)
  setSearching(value == '' ? false : true) // value is latest
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...