2016-07-19 13 views
0

天気予報アプリケーションを構築しようとしています。子コンポーネントから状態にアクセスできない

getInitialState: function() { 
    return {text: '', weather: null}; 
    }, 
    handleClick: function() { 
    WeatherApi.get('q=' + this.state.text).then(function(data) { 
     this.setState({weather: data}) 
    }.bind(this)); 
    }, 

は私がやりたいことは、それに一度の子componenetに天候プロップの状態を渡すことです:私は、APIを介してデータを取得し、最初はnullです天候プロップの状態を設定し、検索バーのコンポーネントを持っていますユーザーによって設定されます:

<TodaysWeatherContainer weatherData={this.state.weather} /> 

次に、このようなコンポーネントからアクセスされることを:今、私は街を検索したとき、私は次のエラーを取得する

var TodaysWeatherContainer = React.createClass({ 
    render: function() { 
    return (
     <div> 
     <p>{this.props.weatherData}</p> 
     </div> 
    ); 
    } 
}); 

未知(未定)エラー:オブジェクトはリアクションの子として有効ではありません(見つかったキー:{city、cod、message、cnt、list}のオブジェクト)。子コレクションをレンダリングする場合は、代わりに配列を使用するか、ReactアドオンのcreateFragment(オブジェクト)を使用してオブジェクトをラップします。レンダリング方法がTodaysWeatherContainerであることを確認します。

キャッチされない例外TypeError::私が追加した場合

は{this.props.weatherData.cityは}私はこのエラーを取得するヌル

のプロパティ「都市」を読み取ることができません私は混乱しそうだところです。 this.props.weatherDataでオブジェクトが返されている場合、どのようにnullになるのですか?

+0

オブジェクトリテラルをどのようにレンダリングする必要がありますか? "オブジェクトはリアクションの子としては有効ではありません" –

+0

何が起こったのかは、データを取得できないことです。おそらく天気予報は機能していないかもしれません。約束事の中でデータを記録できますか?あなたは天気が「null」になるので、これはObject型として表示されます。私はstate.weatherが決して更新されないと思う。 – JordanHendrix

+0

handle.getState linkeをhandleclick関数の後に追加したconsole.log行は、Object {city:Object、cod: "200"、message:0.008、cnt:40、list:Array [40]} – Banner

答えて

3

AJAXリクエストによって返されるデータは、テキスト(それらの間の有効な子ノードである)だけでなく、無効な子オブジェクトです。

状態のweatherプロパティを、オブジェクト全体ではなくAPIレスポンスによって返されるオブジェクトのプロパティに設定します。

最新のコメントに応じて、weatherData.city自体が解析する必要があるオブジェクトです。おそらく、私たちが知り得ないAPIをよりよく研究することで、この問題を自分で解決することができます。

コメントで@deowkが指摘したように、2番目のエラーは親コンポーネントの初期状態である{weather: null}に起因しています。子コンポーネントが最初にレンダリングされたときに、nullオブジェクトのcityプロパティを検索しようとしました。子コンポーネント自体ではなく、APIコールバックでルックアップを実行しているため、エラーは表示されなくなりました。

+0

私が{this.props.weatherData.city}を追加した場合、私はこのエラーを受け取ります: キャッチしたタイプエラー: 'city' null 'のプロパティを読み取れません。' – JordanHendrix

+0

'this.setState({weather :data.city.name}) 'これで動作します! – Banner

+0

ありがとうございますthis-vidor – Banner

関連する問題