我正在尝试使用React构建一个随机引用API应用程序。当第一次应用程序加载按钮点击它生成的随机报价,但在第二次点击应用程序崩溃
应用程序组件出错
考虑向树中添加错误边界以自定义错误处理行为。
class App extends React.Component {
state = {
quotes: null
};
componentDidMount() {
fetch("https://gist.githubusercontent.com/camperbot/5a022b72e96c4c9585c32bf6a75f62d9/raw/e3c6895ce42069f0ee7e991229064f167fe8ccdc/quotes.json")
.then(res => res.json())
.then(data => {
// console.log(data);
this.setState({
quotes: data.quotes
});
});
// console.log(this.state.quotes);
}
randomQuoteHandler = () => {
const randNumb = Math.floor(Math.random() * this.state.quotes.length);
const randomQuote = this.state.quotes[randNumb];
this.setState({
quotes: randomQuote
});
console.log(this.state.quotes);
};
render() {
return (
<div>
<button onClick={this.randomQuoteHandler}>gen</button>
<p>{this.state.quotes !== null && this.state.quotes.quote}</p>
<p> {this.state.quotes !== null && this.state.quotes.author}</p>
</div>
);
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
3条答案
按热度按时间vq8itlhq1#
randomQuoteHandler
将this.state.quotes
数组替换为所选的quote
对象。因此,在第二次单击时,this.state.quotes.length
未定义。您需要将选择的引号存储在另一个状态变量中,如
randomQuote
。vhmi4jdf2#
问题是,在
randomQuoteHandler
中,您将整个quotes
数组替换为随机的randomQuote
对象。randomQuoteHandler
函数末尾的log
显示了这一点。因此第二次在状态中没有阵列要读取
this.state.quotes.quote
dhxwm5r43#
我在自己的应用程序中也犯了同样的错误。基本上,这个错误的发生是因为我的应用程序试图读取一个格式错误的对象。
在我的例子中,我在存储到
localStorage
之前意外地使用了JSON.stringify()
两次,因此当我的应用程序从localStorage
读取此数据时,它的格式出乎意料。一般来说,如果在应用程序中出现此错误,请确保以预期的格式存储对象,以便可以正确读取它们。