我不确定何时在onChange
组件中使用onChangeText
和TextInput
。我知道onChangeText
在回调中接受已更改的文本作为arg,但这就是为什么要使用onChangeText
,因为您可以随后在回调中更新状态?
最佳答案
更新26.08.2019
从答案的初始版本开始,TextInput的API已更改,并且下面的答案不再有效。我与React-native的合作已经两年多了,所以我真的无法确定哪个版本进行了这些更改。
关于答案,onChangeText
仍然是一个简单的 Prop ,它在每次更改时都给出输入字段的值。
另一方面,onChange
通过{ nativeEvent: { eventCount, target, text} }
传递事件(如该答案的注释中所述)。现在,我无法自信地说出为什么需要eventCount
和target
。我只能说,每次与eventCount
组件(添加,删除,全部删除,粘贴值)进行交互时,TextInput
都会增加,并且target
是该TextInput字段的唯一整数。且text
与onChangeText
中的值相同
因此,基本上,我建议使用onChangeText
作为更直接的 Prop 。
如果您想完成旧的答案(如下所示)中的功能,则可以创建自定义组件,该组件包装TextInput
并接收自定义属性,然后将它们传递给onChange
属性。下面的例子:
const MyTextInput = ({ value, name, type, onChange }) => {
return (
<TextInput
value={value}
onChangeText={text => onChange({ name, type, text })}
/>
);
};
然后在需要使用
TextInput
时使用它handleChange(event) {
const {name, type, text} = event;
let processedData = text;
if(type==='text') {
processedData = value.toUpperCase();
} else if (type==='number') {
processedData = value * 2;
}
this.setState({[name]: processedData})
}
<MyTextInput name="username" type="text" value={this.state.username} onChange={this.handleChange}}>
<MyTextInput name="password" type="number" value={this.state.password} onChange={this.handleChange}}>
旧答案
onChangeText
基本上是onChange
的简化版本,因此您可以轻松使用它,而无需经历event.target.value
来获取更改值的麻烦。因此,何时应使用
onChange
以及何时onChangeText
?如果您的表单很简单,文本输入很少,或者逻辑很简单,则可以直接使用
onChangeText
<TextInput value={this.state.name} onChangeText={(text) => this.setState({name: text})}>
如果您具有更复杂的形式和/或在用户更改输入时在处理数据方面有更多的逻辑(例如,处理不同于数字的文本),那么最好使用
onChange
,因为它为您提供了更大的灵活性。例如:handleChange(event) {
const {name, type, value} = event.nativeEvent;
let processedData = value;
if(type==='text') {
processedData = value.toUpperCase();
} else if (type==='number') {
processedData = value * 2;
}
this.setState({[name]: processedData})
}
<TextInput name="username" type="text" value={this.state.username} onChange={this.handleChange}}>
<TextInput name="password" type="number" value={this.state.password} onChange={this.handleChange}}>