让我先说一下我是ReactJS的新手。我试图通过创建一个使用React填充数据的简单站点来学习。我有一个JSON文件,其中包含将通过map循环的链接数据。
我已经尝试将其设置为组件状态,然后通过道具将其传递给导航栏链接但是我得到了"未捕获的类型错误:无法读取属性'数据' of null"
我试图寻找解决方案但找不到任何东西。
注意:当我尝试对对象进行硬编码并以这种方式映射它时,返回的映射是未定义的。但是我不确定它是否与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')
);
答案 0 :(得分:52)
使用ES6,必须在React组件类的构造函数中创建初始状态,如下所示:
constructor(props) {
super(props)
this.state ={
// Set your state here
}
}
答案 1 :(得分:9)
this.state.data
在您的示例中为空,因为setState()
是异步的。相反,您可以将回调传递给setState,如下所示:
loadNavbarJSON: function() {
$.ajax({
url: "app/js/configs/navbar.json",
dataType: 'json',
success: function(data) {
console.log(data);
this.setState({data: data}, function(){
console.log(this.state.data);
}.bind(this));
}.bind(this),
});
}
https://facebook.github.io/react/docs/component-api.html#setstate
答案 2 :(得分:9)
这个问题已经得到了回答,但是我来到这里的问题很容易发生在任何人身上。
我在我的一种方法中得到console.log(this.state)
来记录null
,只是因为我没有写:
this.handleSelect = this.handleSelect.bind(this);
在我的构造函数中。
因此,如果您在某个方法中获得了此{。}}的null
,请检查您是否已将其绑定到您的组件。
干杯!
修改(因为@ tutiplain&#39; s问题)
为什么我null
获得了this.state
?
因为我在方法中写了console.log(this.state)
而不是我的类(我的handleSelect方法)。这导致this
指向对象层次结构中较高的某个对象(很可能是window
对象),该对象没有名为state
的属性。因此,通过将handleSelect
方法绑定到this
,我保证每当我在该方法中编写this
时,它就会指向该方法所在的对象。
我鼓励您为此here阅读一个非常好的解释。
答案 3 :(得分:6)
更多实际答案,使用ES7 + Classes:
export class Counter extends React.Component {
state = { data : [] };
...
}
ES6课程(alredy已被回答)
export class Component extends React.Component {
constructor(props) {
super(props);
this.state = { data : [] };
}
...
}
答案 4 :(得分:0)
我有类似的问题。就我而言,webpack-dev-server
在运行时没有正确重新编译我的内容。
我刚刚重新启动了开发服务器,以使其再次工作。