使用typescript将React Native中的UseState传递给输入框组件并在onChange上更新它

Passing UseState in React Native with typescript to Input box component and updating it onChange

我在将使用状态传递给自定义文本输入时遇到了一些问题component.I 想要在用户每次在输入框中进行更改时更新符号的状态。使用状态符号未更新并返回为未定义。

App.tsx

    const App = () => {
    
    const [symbol, setSymbol] = useState('AMD');
    
    
       function handleSymbolChange() {
        setSymbol(symbol);
      }
    
    return (
    <View>
      <AppTextInput placeholder="Symbol" icon="activity" value={symbol} 
      onTextInputChange= {handleSymbolChange}/>
    </View>
  );
};
    }

AppTextInput.tsx

 interface Props {
      icon: string;
      placeholder: string;
      value: string;
      onTextInputChange: any;

}

    const AppTextInput: React.FC<Props> = ({
      icon,
      placeholder,
      value,
      onTextInputChange,
    }) => {
     
       const handleChange = (e: any) => {
        onTextInputChange(e.target.value);
        console.log(e.target.value);
      };
    
      return (
        <View>
            <Icon name={icon} size={20}/>
     
          <TextInput
            style={styles.textInput}
            placeholder={placeholder}
            value={value}
            onChange={handleChange}
          />
        </View>
      );
    };

您的代码未按预期工作的原因有 2 个。

第一个原因是 onTextInputChange 正在传回一个值,e.target.value 但您没有在 handleSymbolChange 回调中使用该值。您可能应该将 handleSymbolChange 函数更改为如下内容:

function handleSymbolChange(value: string) {
  setSymbol(value);
}

第二个原因是您没有正确使用 onChange TextInput 回调的 e 参数。如果您查看文档,您会发现 onChange 回调需要一个具有以下属性的对象:{ nativeEvent: { eventCount, target, text} } 作为参数,而您使用的是 e.target.value。为了使其正常工作,您需要将其更改为如下内容:

import {
  NativeSyntheticEvent,
  TextInput,
  TextInputChangeEventData,
  View,
} from 'react-native';

const App = () => {
  const handleChange = ({
    nativeEvent: { text },
  }: NativeSyntheticEvent<TextInputChangeEventData>) => {
    onTextInputChange(text);
  };

  return (
    <View>
      <TextInput onChange={handleChange} />
    </View>
  );
};

或使用 onChangeText 属性 代替:

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

const App = () => {
  const handleChange = (text: string) => {
    onTextInputChange(text);
  };

  return (
    <View>
      <TextInput onChangeText={handleChange} />
    </View>
  );
};