2 回答

TA贡献1802条经验 获得超10个赞
好了,在您的代码中有两件事是非常错误的。第一个是JS社区中的常见问题。我建议您更深入地了解'this'关键字的用法。在App.js中,您正在将方法定义为函数声明。
handleClickedQuote(id) {
console.log(id)
const quoteIndex = this.state.quotes.findIndex(q => q.id === id)
this.setState({
clickedQuote: this.state.quotes[quoteIndex].text
})
}
现在,函数声明中的'this'关键字是动态设置的,这意味着'this'实际上是在调用函数时设置的,并且由于它是一个事件处理程序,因此'this'的值实际上就是您的事件!您可以测试一下。但是我们希望'this'引用我们的类,以便我们可以访问状态。
有两种解决方法,第一种:
您可以像这样(旧方法)在App.js类的构造函数中为“ this”绑定正确的值:
constructor(props) {
super(props);
this.handleClickedQuote = this.handleClickedQuote.bind(this);
}
这将用您的对象构造步骤中使用正确的“ this”值的版本替换类中的方法。
或更简单一点,由于箭头函数中的'this'关键字是按词法设置的,因此可以使用箭头函数:
handleClickedQuote = id => {
console.log(id);
const quoteIndex = this.state.quotes.findIndex(q => q.id === id);
this.setState({
clickedQuote: this.state.quotes[quoteIndex].text
});
}
注意:在箭头函数中,“ this”的值基本上是指该代码块之外的任何内容,在这种情况下,这是您的整个对象。
另外,您在代码中有一个小错误,有人提到过。您实际上忘记了将报价ID作为道具传递给Quote组件。但这只是一个小小的疏忽。重要的是要知道这个问题与React的关系比JS本身的关系少。我的建议是对JS进行更深入的学习,并学习该语言的所有怪癖和技术知识。它将为您节省很多麻烦。还可以利用您的调试技能,这样,像丢失道具这样的错误就不会那么容易地掉入裂缝。
添加回答
举报