Hello in new in react native,我的代码是:
import React, {
View,
Text,
TextInput,
Component
} from 'react-native';
import Style from './styles/signin';
import Button from '../common/button';
export default class SignIn extends Component {
constructor(props) {
super(props);
this.state = {
email: '',
password: ''
};
}
render(){
return(
<View style={Style.container}>
<Text style={Style.label}>Email</Text>
<TextInput
style={Style.input}
onChangeText={(text) => this.setState({email: text})}
value={this.state.email}
/>
<Text style={Style.label}>Password</Text>
<TextInput
style={Style.input}
onChangeText={(text) => this.setState({password: text})}
value={this.state.password}
secureTextEntry={true}
/>
<Button text={'Sign in'} onPress={this.onPress}/>
</View>
);
}
onPress(){
console.log(this.state.email);
}
}
当我填写此表单并按下登录时,我收到此错误消息:“无法读取未定义的属性'电子邮件'”。 谢谢你的帮助!
答案 0 :(得分:21)
这是一个具有约束力的问题。最简单的解决方案是更改按钮标记的JSX,如下所示:
<Button text={'Sign in'} onPress={this.onPress.bind(this)} />
ES6类失去了你可能习惯使用es5 react.createClass的自动绑定。当使用ES6作为反应组分时,您必须更加清楚自己的结合。
另一种选择是在构造函数中绑定方法,如下所示:
constructor(props) {
super(props);
this.state = {
email: '',
password: ''
};
this.onPress = this.onPress.bind(this)
}
或者您甚至可以使用胖箭头es6语法函数来维护与您正在创建的组件的“this”绑定:
<Button text={'Sign in'} onPress={() => this.onPress()} />
更新:
要再次更新此内容,如果您的环境支持某些ES7功能(我相信本机构建的是react-native init
或create-react-native-app
shoudl),您可以使用此表示法自动绑定您的类方法使用this
关键字。
// This is auto-bound so `this` is what you'd expect
onPress = () => {
console.log(this.state.email);
};
而不是
// This is not auto-bound so `this.state` will be `undefined`
onPress(){
console.log(this.state.email);
}
最佳选择是使用ES7功能(如果可用)或在构造函数中绑定。直接在onPress={() => this.onPress()}
上使用匿名函数onPress={this.onPress.bind(this)}
或Button
对性能原因的影响要小得多。