ReactJS this.state为空

首先,我说我是ReactJS的新手。我正在尝试通过制作一个使用React填充数据的简单站点来学习。我有一个JSON文件,其中包含将与map循环通过的链接数据。

我尝试将其设置为组件状态,然后通过道具将其传递到导航栏链接,但出现“未捕获的TypeError:无法读取null的属性'data'”

我试图四处寻找解决方案,但找不到任何东西。

注意:当我尝试对对象进行硬编码并通过该对象映射时,它返回map的方式是不确定的。但是我不确定这与setState错误直接相关。

/** @jsx React.DOM */

var conf = {
    companyName: "Slant Hosting"
  };

var NavbarLinks = React.createClass({
  render: function(){
    var navLinks = this.props.data.map(function(link){
      return(
        <li><a href={link.target}>{link.text}</a></li>
      );
    });
    return(
      <ul className="nav navbar-nav">
        {navLinks}
      </ul>
    )
  }
});

var NavbarBrand = React.createClass({
  render: function(){
    return(
      <a className="navbar-brand" href="#">{conf.companyName}</a>
    );
  }
});

var Navbar = React.createClass({
  getInitalState: function(){
    return{
      data : []
    };
  },
  loadNavbarJSON: function() {
    $.ajax({
      url: "app/js/configs/navbar.json",
      dataType: 'json',
      success: function(data) {
        this.setState({
          data: data
        });
        console.log(data);
        console.log(this.state.data);
      }.bind(this),
      error: function(xhr, status, err) {
        console.error(this.props.url, status, err.toString());
      }.bind(this)
    });
  },
  componentDidMount: function(){
    this.loadNavbarJSON();
  },
  render: function(){
    return(
      <nav className="navbar navbar-default navbar-fixed-top" role="navigation">
        <div className="container-fluid">
          <div className="navbar-header">
            <NavbarBrand />
          </div>
          <NavbarLinks data={this.state.data} />
        </div>
      </nav>
    );
  }
});

var Header = React.createClass({
  render: function(){
    return(
      <Navbar />
    );
  }
});

React.renderComponent(
  <Header />,
  document.getElementById('render')
);
Tony凯2020/04/07 11:13:33

使用ES7 +类的更多实际答案:

export class Counter extends React.Component {
  state = { data : [] };
  ...
}

ES6课程(已回答警告)

export class Component extends React.Component {
  constructor(props) {
    super(props);
    this.state = { data : [] };
  }
  ...
}
LGil2020/04/07 11:13:33

这个问题已经得到了回答,但是我来到这里时遇到的问题很容易发生在任何人身上。

我得到console.log(this.state)登录null一个我的方法,只是因为我没有写:

this.handleSelect = this.handleSelect.bind(this);

在我的构造函数中。

因此,如果您null通过一种方法获取了this.state,请检查是否已将其绑定到组件。

干杯!

编辑(由于@tutiplain的问题)

为什么我得到nullthis.state

因为我写console.log(this.state)的方法不受类限制(我的handleSelect方法)。这导致this指向对象层次结构中较高的某个对象(最有可能是该window对象),而对象没有名为的属性state因此,通过将我的handleSelect方法绑定this,可以确保无论何时编写this该方法,它都将指向该方法所在的对象。

我建议你阅读这一个很好的解释在这里

卡卡西Near2020/04/07 11:13:33

我有类似的问题。就我而言,运行时并webpack-dev-server没有重新编译我的东西。
我刚刚重新启动了开发服务器,以使其再次工作。

阿飞2020/04/07 11:13:32

使用ES6,必须在您的React组件类的构造函数中创建初始状态,如下所示:

constructor(props) {
    super(props)
    this.state ={
    // Set your state here
    }
}

请参阅本文档