我不确定何时在TextInput
组件中使用onChange
与onChangeText
。我知道onChangeText
接受更改的文本作为回调中的参数,但这就是您使用onChangeText
的原因,因为您可以在回调中更新状态?
更新 26.08.2019
自答案的初始版本以来,TextInput 的 API 已更改,下面的答案不再有效。我已经超过 2 年没有使用 react-native 了,所以我真的不知道哪个版本有这些变化。
关于答案,onChangeText
仍然是一个简单的道具,它给出了每次更改时输入字段的值。
另一方面,onChange
传递一个带有{ nativeEvent: { eventCount, target, text} }
的事件(如本答案的注释中所述)。现在,我不能自信地说,你为什么需要eventCount
和target
.我只能声明,每次您与组件交互(添加、删除、删除、全部删除、粘贴值)时,eventCount
都会增加TextInput
并且target
是该 TextInput 字段的唯一整数。text
的值与onChangeText
所以基本上,我建议使用onChangeText
,作为一个更直接的道具。
如果你想完成像旧答案(下面)这样的功能,你可以创建自定义组件,它包装TextInput
并接收自定义属性,并在以后将它们传递给onChange
prop。示例如下:
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}}>
像这样使用它:
<Input label='First Name' onChange={this.onChange} value={this.state.first}/>
onChange = (event) => {
const {eventCount, target, text} = event.nativeEvent;
this.setState({first:text});
};
target
属性似乎毫无用处。看起来您不能将数据属性附加到 react-native 元素并像在 react 中那样从目标元素中检索它们,因为该应用程序不是浏览器。
对于 react,我们被告知出于性能原因,最好不要将内联函数附加到 onChange 事件。 我们应该在 HTML 元素上使用自定义 props 或 data-* 属性,并从 onChange 处理程序中的e.target检索信息。
但是对于 react-native,似乎这种传递数据的格式实际上是可以接受的:
<Input
label='First Name'
onChangeText={text=>this.onChange('first',text,'anotherValueIWantToPass')}
value={this.state.first}/>
onChangeText
只给你字符串作为回调的参数。
onChange
为您提供合成事件作为参数。