React Native - onChange 与 onChangeText of TextInput 之间的区别



我不确定何时在TextInput组件中使用onChangeonChangeText。我知道onChangeText接受更改的文本作为回调中的参数,但这就是您使用onChangeText的原因,因为您可以在回调中更新状态?

更新 26.08.2019

自答案的初始版本以来,TextInput 的 API 已更改,下面的答案不再有效。我已经超过 2 年没有使用 react-native 了,所以我真的不知道哪个版本有这些变化。

关于答案,onChangeText仍然是一个简单的道具,它给出了每次更改时输入字段的值。

另一方面,onChange传递一个带有{ nativeEvent: { eventCount, target, text} }的事件(如本答案的注释中所述)。现在,我不能自信地说,你为什么需要eventCounttarget.我只能声明,每次您与组件交互(添加、删除、删除、全部删除、粘贴值)时,eventCount都会增加TextInput并且target是该 TextInput 字段的唯一整数。text的值与onChangeText

所以基本上,我建议使用onChangeText,作为一个更直接的道具。

如果你想完成像旧答案(下面)这样的功能,你可以创建自定义组件,它包装TextInput并接收自定义属性,并在以后将它们传递给onChangeprop。示例如下:

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为您提供合成事件作为参数。

最新更新