2017-07-25 26 views
1

React weather appを作成しようとしています。このアプリでは都市名を入力することができ、現在の気温を表示します。 しかし、私の状態は他の都市オブジェクト(coponentDidMountメソッド - "obje"状態)に変更したくありません。React API呼び出しは状態を変更しません。

import React, { Component } from 'react'; 
import Api from './api.js'; 

class App extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     obje: {}, 
     inputValue: 'Paris' 
    } 
    } 
    componentDidMount() { 
    var rootUrl = "http://api.openweathermap.org/data/2.5/weather?q="; 
    var city = this.state.inputValue 
    var key = "&appid=aa32ecd15ac774a079352bfb8586336a"; 
     fetch(rootUrl + city + key) 
     .then(function(response) { 
      return response.json(); 
     }).then(d => { 
      this.setState({obje:d}) 
     }); 

    } 

    handleChange(event) { 
    event.preventDefault(); 

    this.setState({inputValue: this.refs.inputVal.value}); 
    console.log(this.refs.inputVal.value); 
    } 
    render() { 
    return (
     <div> 
     {this.state.obje.name} 
     <form action="" method="" onSubmit={this.handleChange.bind(this)}> 
     <input ref="inputVal" type="text" /> 
     <input type="submit" /> 
    </form> 
     </div> 
    ); 
    } 
} 

export default App; 
+0

コンソールにエラーがありますか? –

+0

エラーは発生しません – Mac

答えて

1

componentDidMountは、コンポーネントがマウントされたときに1回だけ呼び出されます。状態の変更によってそのコードは再びトリガされないため、XHR要求は再び行われません。 XHRロジックを独自のメソッドに分割し、両方の場所で呼び出します。

import React, { Component } from 'react'; 
import Api from './api.js'; 

class App extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     obje: {}, 
     inputValue: 'Paris' 
    } 
    } 
    getWeather() { 
     var rootUrl = "http://api.openweathermap.org/data/2.5/weather?q="; 
     var city = this.state.inputValue; 
     var key = "&appid=aa32ecd15ac774a079352bfb8586336a"; 
     fetch(rootUrl + city + key) 
      .then(function(response) { 
       return response.json(); 
      }).then(d => { 
      this.setState({obje:d}) 
      }); 
    } 
    componentDidMount() { 
    this.getWeather(); 
    } 

    handleChange(event) { 
    event.preventDefault(); 

    this.setState({inputValue: this.refs.inputVal.value},() => { 
     this.getWeather(); 
    }); 
    console.log(this.refs.inputVal.value); 
    } 
    render() { 
    return (
     <div> 
     {this.state.obje.name} 
     <form action="" method="" onSubmit={this.handleChange.bind(this)}> 
     <input ref="inputVal" type="text" /> 
     <input type="submit" /> 
    </form> 
     </div> 
    ); 
    } 
} 

export default App; 
+0

あなたの考えは私の問題を解決しません。その同じ効果:( – Mac

+0

私は自分のコードをテストしませんでしたが、あなたの目標は、ユーザーが提出をクリックしたときにAPI呼び出しを行うことだと仮定します - これまたはいくつかのバリエーションが解決策です。新しい値は?ログに記録されているエラーがありますか?あなたはそれが正しく呼び出されることを保証するために ')' getWeather(からログインしてみましたか? –

+0

私は機能getWeather beacuse変数「都市」のように、一度だけトリガーされると、問題があると思いますこの変数は変更できません。 – Mac

関連する問題