【问题标题】:How to update useState into TextInput如何将 useState 更新为 TextInput
【发布时间】:2019-04-29 13:33:01
【问题描述】:

我在 React Native 中有一个简单的 <TextInput>,我想在值更改时打印一些文本。它在输入第二个字符后工作,但不是,当用户只按一个字符时。 我尝试使用函数,甚至使用 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 值不为空时显示“正在搜索”。

【问题讨论】:

    标签: react-native react-hooks


    【解决方案1】:

    useStatesetStatemay be asynchronous,所以第一次调用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
    }}
    

    【讨论】:

      【解决方案2】:

      你需要比较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)
      

      【讨论】:

        【解决方案3】:

        在双方的帮助下,我解决了。如果对某人有帮助,这是代码。这个想法是一个左侧带有 len 图标的 TextInput,当用户开始编写时调用 Firebase 并在右侧显示一个加载图标(微调器)。

            <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 :(
            })
          }
        

        谢谢大家

        【讨论】:

          猜你喜欢
          • 2021-10-05
          • 1970-01-01
          • 2020-09-17
          • 2020-10-16
          • 1970-01-01
          • 2021-07-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多