OnClick无法正常工作,但控制台中没有出现错误

时间:2020-04-15 01:05:56

标签: javascript reactjs

由于我目前正在学习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;

2 个答案:

答案 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;