" undefined不是一个对象" this.state没有受到约束

时间:2016-01-07 06:53:54

标签: reactjs react-native

我通过React.createClass创建的本机反应组件似乎没有正确绑定this关键字,导致我无法访问this.state。这是我得到的错误:

error

代码如下。我没有看到与网站上的例子有本质区别的东西,所以我无法弄清楚我做错了什么。我该如何解决这个问题?

'use strict';

var React = require('react-native');

var Main = React.createClass({
  getInitialState: () => {
    return { username: '', isloading: false, iserror: false };
  },
  handleChange: (event) => {
    this.setState({
      username: event.nativeEvent.text
    });
  },
  handleSubmit: (event) => {
    this.setState({
      isloading: true
    });
    console.log('Submitting... ' + this.state.username);
  },
  render: () => {
    return (
      <View style={styles.mainContainer}>
        <Text> Search for a Github User</Text>
        <TextInput style={styles.searchInput}
                   value={this.state.username}
                   onChange={this.handleChange.bind(this)} /> 
        <TouchableHighlight style={styles.button}
                            underlayColor='white'
                            onPress={this.handleSubmit.bind(this)} /> 
        <Text style={styles.buttonText}> SEARCH</Text>
      </View>
    );
  }
});

var { Text, View, StyleSheet, TextInput, TouchableHighlight, ActivityIndicatorIOS } = React;

var styles = StyleSheet.create({
  mainContainer: {
    flex: 1,
    padding: 30,
    marginTop: 65,
    flexDirection: 'column',
    justifyContent: 'center',
    backgroundColor: '#48BBEC'
  },
  title: {
    marginBottom: 20,
    fontSize: 25,
    textAlign: 'center',
    color: '#fff'
  },
  searchInput: {
    height: 50,
    padding: 4,
    marginRight: 5,
    fontSize: 23,
    borderWidth: 1,
    borderColor: 'white',
    borderRadius: 8,
    color: 'white'
  },
  buttonText: {
    fontSize: 18,
    color: '#111',
    alignSelf: 'center'
  },
  button: {
    height: 45,
    flexDirection: 'row',
    backgroundColor: 'white',
    borderColor: 'white',
    borderWidth: 1,
    borderRadius: 8,
    marginBottom: 10,
    marginTop: 10,
    alignSelf: 'stretch',
    justifyContent: 'center'
  },
});

module.exports = Main

1 个答案:

答案 0 :(得分:9)

问题是在render: () => {中使用ES6胖箭头会导致React在.createClass函数中提供的自动调整功能无效。

如果您不想将代码转换为ES6类,只需将此更改为render: function() {..即可。

如果您确实将其转换为ES6课程,请查看this

  

方法遵循与常规ES6类相同的语义,这意味着   他们不会自动将其绑定到实例。你必须这样做   明确使用.bind(this)或arrow functions =&gt;。