ReactJS无法通过onClick重新渲染组件

3

我使用React.js制作了一个简单的应用程序,每次点击按钮都会建议随机地点。 问题是:点击一次后无法重新呈现组件。 如何在每次点击按钮时获取新的地点

place.js 用于获取数据的Fetch API。

state = { loading: true, person: null };
  async componentDidMount() {
    let Xyurl = "https://cors-anywhere.herokuapp.com/";
    let url =
      "https://wainnakel.com/api/v1/GenerateFS.php?uid=26.2716025,50.2017993&g et_param=value";

    let response = await fetch(Xyurl + url);
    let data = await response.json();
    this.setState({ place: data, loading: false });

  }
  render() {
    return (
      <div>
        <div>
          {this.state.loading || !this.state.place ? (
            <div>loading......</div>
          ) : (
            <div className="PlcseContiner">
              <img alt="description" src= . 
              {this.state.place.image[0]} />
                {this.state.place.name}

        </div>
      </div>
    );

建议将按钮定位在哪里以呈现地点。
class Suggestion extends Component {
  constructor(props) {
    super(props);
    this.state = {
      visible: false
    };
    this.handleClicked = this.handleClicked.bind(this);
  }
  handleClicked(event) {
    event.preventDefault();
    this.setState({
      visible: true
    });
  }

  generateplace() {
    if (this.state.visible) {
      return <Place />;
    }
    return null;
  }

  render() {
    return (
      <div className="main-button">
        <Button onClick={this.handleClicked} color="warning" className="Btn">
          suggestion
        </Button>
        {this.generateplace()}
      </div>
    );
  }

}

1个回答

1

您可以通过componentWillUpdate从父组件对其进行控制, 因此您需要向Place组件添加props。

建议:

class Suggestion extends Component {
  constructor(props) {
    super(props);
    this.state = {
      visible: false,
      refresh: 1
    };
    this.handleClicked = this.handleClicked.bind(this);
  }
  handleClicked(event) {
    event.preventDefault();
    this.setState({
      visible: true,
      refresh: this.state.refresh + 1
    });
  }

  generateplace() {
    if (this.state.visible) {
      return <Place refresh={this.state.refresh} />;
    }
    return null;
  }

  render() {
    return (
      <div className="main-button">
        <Button onClick={this.handleClicked} color="warning" className="Btn">
          suggestion
        </Button>
        {this.generateplace()}
      </div>
    );
  }

你需要将操作分离为类似于以下这样的函数:
位置:
componentDidMount() {
    this.getPlace()
}

componentWillUpdate(nextProps, nextState) {
    this.getPlace();
}

getPlace = async() => {
    let Xyurl = "https://cors-anywhere.herokuapp.com/";
    let url =
          "https://wainnakel.com/api/v1/GenerateFS.php?uid=26.2716025,50.2017993&g et_param=value";

    let response = await fetch(Xyurl + url);
    let data = await response.json();
    this.setState({ place: data, loading: false });
}

如何将getPlace传递给不在同一组件中的按钮 - wafa.A
你能展示一下这些组件之间的关系吗? - Idan
我在Suggestion组件中导入了Place组件。 - wafa.A
如果你在Place组件内部呈现Suggestion组件,那么你可以将getPlace函数传递给Suggestion组件,并在onPress按钮上调用getPlace函数。 - Idan
我编辑了我的回答以适应你的情况,希望它能够起作用。如果不行,请告诉我。 - Idan
它能够正常工作,但是它默认生成位置而无需点击。 - wafa.A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接