由于我目前正在学习React,所以我正在创建一个笑话生成器。我创建了一个本地文件,并能够提取数据(笑话)并将其显示在浏览器中。现在,我试图创建一个按钮,当您单击该按钮时,它将显示一个随机笑话。我可以看到玩笑和按钮,但是没有触发任何动作。我检查了控制台,没有错误。如果我使用onClick = {randomJoke}
,则会收到一条错误消息,说明侦听器期望一个函数,而不是一个对象。有人可以帮我指出问题了吗?
这是我目前的设置方式:
import React from 'react'
import SportsJokesData from './SportsJokesData';
class SportsJokesApi extends React.Component {
constructor(props){
super(props);
this.getRandomJoke = this.getRandomJoke.bind(this);
}
getRandomJoke(){
return SportsJokesData[(SportsJokesData.length * Math.random()) << 0]
}
render() {
const randomJoke = this.getRandomJoke()
return (
<React.Fragment>
<p> {randomJoke.question}</p>
<p>{randomJoke.answer}</p>
<button onClick={this.getRandomJoke}>
click here
</button>
</React.Fragment>
)
}
}
export default SportsJokesApi;
这是在添加按钮之前最初编写文件脚本的方式。
import React from 'react'
import SportsJokesData from './SportsJokesData';
class SportsJokesApi extends React.Component {
getRandomJoke(){
return SportsJokesData[(SportsJokesData.length * Math.random()) << 0]
}
render() {
const randomJoke = this.getRandomJoke()
return (
<React.Fragment>
<p>{randomJoke.question}</p>
<h1>{randomJoke.answer}</h1>
</React.Fragment>
)
}
}
export default SportsJokesApi;
答案 0 :(得分:0)
您不能仅在return
事件中onClick
使用新组件。您需要先设置一些状态。本指南非常有用:https://flaviocopes.com/react-show-different-component-on-click/
答案 1 :(得分:0)
在出现新的笑话时,您需要 重新渲染 。为此,将randomJoke
存储在React组件的state
中。
调用this.getRandomJoke
时,应同时更新state
,以便触发React组件的重新渲染。发生这种情况时,UI会更新为randomJoke
import React from 'react'
import SportsJokesData from './SportsJokesData';
const initialState = {
randomJoke: null
};
class SportsJokesApi extends React.Component {
constructor(props) {
super(props);
this.getRandomJoke = this.getRandomJoke.bind(this);
this.state = initialState;
}
getRandomJoke() {
this.setState({
randomJoke: SportsJokesData[(SportsJokesData.length * Math.random()) << 0]
});
}
render() {
const { randomJoke } = this.state;
return (
<React.Fragment >
<p> {randomJoke.question} </p>
<p> {randomJoke.answer} </p>
<button onClick = {this.getRandomJoke}>click here </button>
</React.Fragment >
);
}
}
export default SportsJokesApi;