Pass values to child component on click submit button - ReactJS, click twice

这一生的挚爱 提交于 2019-12-12 04:41:40

问题


I want to pass values from SearchInput (parent) to FetchData (child) component. It does not work properly, because I have to click twice to fetch data and this.props.loaded should be true after click on submit button. I know, that I should use callback function, but I dont know, which function and where. I'm started to learn ReactJS a week ago.

import React, {Component} from "react";

import FetchData from "./FetchData";

export default class SearchInput extends Component {
  constructor(props) {
    super(props);
    this.state = {
      cityName: "",
      loaded: false
    }
    this.handleCityNameChange = this
      .handleCityNameChange
      .bind(this);
    this.handleSubmitButton = this
      .handleSubmitButton
      .bind(this);
  }
  handleCityNameChange = (e) => {
    const val = e.target.value;
    this.setState({cityName: val});
    e.preventDefault();
  }
  handleSubmitButton = (e) => {
    //const val = document.getElementById("search").value;
    this.setState({cityName: this.state.cityName, loaded: true});
    e.preventDefault();
  }
  render() {
    const {cityName, loaded} = this.state;
    return (
      <div>
        <form>
          <label htmlFor="search">Search city:</label>
          <input
            type="text"
            name="search"
            id="search"
            value={this.state.cityName}
            onChange={this.handleCityNameChange}/>
          <input type="submit" onClick={this.handleSubmitButton}/>
        </form>
        <FetchData
          cityName={cityName}
          loaded={loaded}
          handleSubmitButton={this.handleSubmitButton}/>
      </div>
    )
  }
}


import React, {Component} from "react";
import axios from "axios";

import DisplayWeather from "./DisplayWeather";

export default class FetchData extends Component {
    constructor(props) {
        super(props);
        this.state = {
            descriptionMain: "",
            description: "",
            temperature: null,
            weatherIcon: ""
        }
        
    }
    // otherFunc() {
    //     this.props.handleSubmitButton();
    //   }
    fetchData = () => {
        if (this.props.loaded) {
            const apiURL = `https://api.openweathermap.org/data/2.5/weather?q=${this.props.cityName}&units=metric&APPID=e6f4d816d3ade705ec1d8d9701b61e14`;
            console.log(apiURL)
            axios
                .get(apiURL)
                .then(res => {
                    this.setState({descriptionMain: res.data.weather[0].main, description: res.data.weather[0].description, temperature: res.data.main.temp, weatherIcon: res.data.weather[0].icon});
                })
        }
    }
    componentWillReceiveProps() {
        this.fetchData();
    }
    render() {
        return (
            <div>
                <DisplayWeather {...this.state} cityName={this.props.cityName}/>
            </div>
        )
    }
}


export default class DisplayWeather extends Component {
  render() {
    const {descriptionMain, description, temperature, weatherIcon, cityName} = this.props;
    return (
      <div>
        <h3>{cityName}</h3>
        <h4>Sky: {description}</h4>
        <h5>Description: {descriptionMain}</h5>
        <span className="temperature">{temperature}
          °C</span>
        <img
          src={`http://openweathermap.org/img/w/${weatherIcon}.png`}
          alt={`${description}`}/>
      </div>
    )
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

回答1:


You have to enclose the submit attribute in an arrow function:

onClick{()=>this.handleSubmutButton()}

Do the same for on change as well



来源:https://stackoverflow.com/questions/46595130/pass-values-to-child-component-on-click-submit-button-reactjs-click-twice

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!