未捕获的类型错误:无法读取 null 的属性“setState”
2016-12-22
5391
我是 React 新手,遇到了如下问题:
Uncaught TypeError: Cannot read property 'setState' of null.
基本上,我想做的是,用户可以点击三个不同的标题,点击后,它将呈现特定于该标题的特定模板。这是我当前使用的代码,它给了我这个错误:
class Selection extends React.Component {
constructor(props) {
super(props);
this.state = {selections: [], donateActive: true, fundraiseActive: false, speakActive: false };
}
componentDidMount() {
this.setState({
selections: selectionData.selections
})
}
componentWillUnMount(){
console.log("unmounted!");
}
donateOnClick() {
this.setState({ donateActive: true, fundraiseActive: false, speakActive: false});
}
fundraiseOnClick() {
this.setState({ fundraiseActive: true, donateActive: false, speakActive: false});
}
speakOnClick() {
this.setState({ speakActive: true, fundraiseActive: false, donateActive: false});
}
donateTemplate() {
return (
<div>
<h1>donate template</h1>
</div>
)
}
fundraiseTemplate() {
return (
<div>
<h1>fundraise template</h1>
</div>
)
}
speakTemplate() {
return (
<div>
<h1>speak template</h1>
</div>
)
}
render() {
return(
<div>
<div className="col-sm-6 col-sm-push-6 right">
<div className="right-content-container">
<div className="selections">
<h3>You can</h3>
<h1 onClick={this.donateOnClick} className="selection active" id="selection-donate">donate</h1>
<h1 onClick={this.fundraiseOnClick} className="selection" id="selection-fundraise">fundraise</h1>
<h1 onClick={this.speakOnClick} className="selection" id="selection-speak">speak up</h1>
<hr></hr>
</div>
<div>
{
if (this.state.donateActive) {
this.donateTemplate()
}
if (this.state.fundraiseActive) {
this.fundraiseTemplate()
}
if (this.state.speakActive) {
this.speakTemplate()
}
}
</div>
</div>
</div>
<div className="col-sm-6 col-sm-pull-6 left">
<div className="left-content-container">
<img className="img-responsive hidden-xs" src="./images/selections/.jpg" alt=""/>
<img className="img-responsive hidden-sm hidden-md hidden-lg" src="./images/selections/.jpg" alt=""/>
</div>
</div>
</div>
);
}
}
此外,我不确定我是否能够像现在在
render()
方法中那样在
return()
中使用
IF
语句,有没有更好的方法来做到这一点?
任何帮助都将不胜感激。
2个回答
您的问题与
this
绑定有关。React 不会自动将 React 组件绑定到
this
的值,除了构造函数和生命周期方法。要解决此问题,请在构造函数中,为要绑定
this
的每个函数添加 this
constructor(props) {
super(props);
this.donateOnClick = this.donateOnClick.bind(this);
// other function bindings
}
至于您的
if
语句问题,只要 if 语句包裹在
{
中,您就可以使用它们。花括号向 JSX 解析器指示其中的任何内容都应作为 javascript 进行评估,因此任何有效的 javascript 都可以放在其中。
更新:不确定为什么那些
if
语句会引发意外的令牌错误,但请尝试以下操作:
<div>
{ this.state.donateActive ? this.donateTemplate() : null }
{ this.state.fundraiseActive ? this.fundraiserTemplate() : null }
{ this.state.speakactive ? this.speakTemplate() : null }
</div>
这是使用三元 if 语句。如果您不熟悉语法: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator
如果这不起作用,请使用更详细的错误消息更新您的问题。特别是,我很想知道它说的哪个令牌是意外的
taylorc93
2016-12-22
您还可以在类中自动绑定方法,方法是像这样声明它们:
donateOnClick = () => {
this.setState({ donateActive: true, fundraiseActive: false, speakActive: false});
}
fundraiseOnClick = () => {
this.setState({ fundraiseActive: true, donateActive: false, speakActive: false});
}
speakOnClick = () => {
this.setState({ speakActive: true, fundraiseActive: false, donateActive: false});
}
Diogo Sgrillo
2016-12-22