2017-07-25 131 views
1

我正在嘗試創建React天氣應用程序。在這個應用程序,你可以鍵入城市的名稱,它顯示當前的溫度。 但caloing API後,我的狀態不想更改爲其他城市對象(在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只被調用一次 - 組件掛載時。狀態更改不會再次觸發該代碼,因此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

我認爲問題出在變量「city」beacuse函數getWeather僅觸發一次,所以這個變量不能改變。 – Mac

相關問題