在 android 上使用状态时反应本机 textInput 中的错误
Bug in react native textInput when using state on android
此错误仅存在于 Android。
如果我在 Android 上有一个 textInput 并将值设置为状态。然后在其他地方我更改值,当我在 textInput 上使用 onChange 时,它使用旧文本值而不是新状态。
这是我的点心
https://snack.expo.io/SyV1mkIc4
下面是显示它不起作用的完整代码
import * as React from 'react';
import { Text, View, StyleSheet, TextInput, TouchableOpacity } from 'react-native';
import { Constants } from 'expo';
// You can import from local files
import AssetExample from './components/AssetExample';
// or any pure javascript modules available in npm
import { Card } from 'react-native-paper';
export default class App extends React.Component {
constructor(props) {
super(props)
this.state = {
text: 'aaa'
}
}
render() {
return (
<View style={styles.container}>
<TextInput
value={this.state.text}
onChange={(event) => this.setState({
text: event.text,
})}
/>
<TouchableOpacity
onPress={()=>this.setState({
text: "",
})}
style={styles.submit}
>
</TouchableOpacity>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
paddingTop: Constants.statusBarHeight,
backgroundColor: '#ecf0f1',
padding: 8,
},
submit: {
height: 200,
width: 200,
backgroundColor: 'blue',
textAlign: 'center',
},
});
改用onChangeText
,
onChangeText={(text)=>{this.setState({text});}}
好的,我发现这是一个三星独有的问题,与键盘缓存有关。解决方法是keyboard.dismiss改变状态值后。
我也在 Moto 手机上看到了这个。我通过从 onKeyPress 而不是 onChangeText 更新状态来处理它。烦人是因为您必须处理退格键,还因为它现在会闪烁——输入会短暂显示新的按键值,然后隐藏它,然后显示我的按键处理程序设置的新状态。 ()也许我忽略了一个更简单的解决方案,但这是我的例子:
validateEmail({ nativeEvent: { key } }) {
if (key == "Enter") return;
let value = (this.state.email || "");
if (key == "Backspace") {
value = value.substring(0, Math.max(0, value.length - 1));
}
else {
value = value.concat(key.replace(/[^a-z0-9.+@_-]+/ig, "").toLowerCase());
}
this.setState({ email: value});
}
...
const Email = <Input
value={this.state.email}
onKeyPress={this.validateEmail}
/>
所以现在我正在制定一个解决方法,让 onchangetext 处理有效的按键,并且只在必要时将其从 onkeypress 更改为最小化闪烁:
isValidEmail(str) {
return !/[^a-z0-9.+@_-]+/g.test(str);
}
validateEmail({ nativeEvent: { key } }) {
console.log("key: " + key);
// don't update state here if key is valid:
if (key == "Enter" || key == "Backspace" || this.isValidEmail(key)) return;
// update state with corrected key:
value = (this.state.email || "").concat(key.replace(/[^a-z0-9.+@_-]+/ig, "").toLowerCase());
console.log("value: " + value);
this.setState({ email: value});
}
...
const Email = <Input
value={this.state.email}
onChangeText={(text) => { if (this.isValidEmail(text)) this.setState({email: text})}}
onKeyPress={this.validateEmail}
/>
此错误仅存在于 Android。
如果我在 Android 上有一个 textInput 并将值设置为状态。然后在其他地方我更改值,当我在 textInput 上使用 onChange 时,它使用旧文本值而不是新状态。
这是我的点心 https://snack.expo.io/SyV1mkIc4
下面是显示它不起作用的完整代码
import * as React from 'react';
import { Text, View, StyleSheet, TextInput, TouchableOpacity } from 'react-native';
import { Constants } from 'expo';
// You can import from local files
import AssetExample from './components/AssetExample';
// or any pure javascript modules available in npm
import { Card } from 'react-native-paper';
export default class App extends React.Component {
constructor(props) {
super(props)
this.state = {
text: 'aaa'
}
}
render() {
return (
<View style={styles.container}>
<TextInput
value={this.state.text}
onChange={(event) => this.setState({
text: event.text,
})}
/>
<TouchableOpacity
onPress={()=>this.setState({
text: "",
})}
style={styles.submit}
>
</TouchableOpacity>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
paddingTop: Constants.statusBarHeight,
backgroundColor: '#ecf0f1',
padding: 8,
},
submit: {
height: 200,
width: 200,
backgroundColor: 'blue',
textAlign: 'center',
},
});
改用onChangeText
,
onChangeText={(text)=>{this.setState({text});}}
好的,我发现这是一个三星独有的问题,与键盘缓存有关。解决方法是keyboard.dismiss改变状态值后。
我也在 Moto 手机上看到了这个。我通过从 onKeyPress 而不是 onChangeText 更新状态来处理它。烦人是因为您必须处理退格键,还因为它现在会闪烁——输入会短暂显示新的按键值,然后隐藏它,然后显示我的按键处理程序设置的新状态。 (
validateEmail({ nativeEvent: { key } }) {
if (key == "Enter") return;
let value = (this.state.email || "");
if (key == "Backspace") {
value = value.substring(0, Math.max(0, value.length - 1));
}
else {
value = value.concat(key.replace(/[^a-z0-9.+@_-]+/ig, "").toLowerCase());
}
this.setState({ email: value});
}
...
const Email = <Input
value={this.state.email}
onKeyPress={this.validateEmail}
/>
所以现在我正在制定一个解决方法,让 onchangetext 处理有效的按键,并且只在必要时将其从 onkeypress 更改为最小化闪烁:
isValidEmail(str) {
return !/[^a-z0-9.+@_-]+/g.test(str);
}
validateEmail({ nativeEvent: { key } }) {
console.log("key: " + key);
// don't update state here if key is valid:
if (key == "Enter" || key == "Backspace" || this.isValidEmail(key)) return;
// update state with corrected key:
value = (this.state.email || "").concat(key.replace(/[^a-z0-9.+@_-]+/ig, "").toLowerCase());
console.log("value: " + value);
this.setState({ email: value});
}
...
const Email = <Input
value={this.state.email}
onChangeText={(text) => { if (this.isValidEmail(text)) this.setState({email: text})}}
onKeyPress={this.validateEmail}
/>