2017-02-20 12 views
0

フェッチと呼ばれるJSONオブジェクトからリストコンポーネントをレンダリングすることをテストしようとしていますが、JSONが返される前にレンダリングが呼び出されていると思われます定義されていないエラーdebug alert()は値を取得しますが、レンダリングでは未定義のエラーが発生しています。これをどうすれば処理できますか?データが取得された後にレンダリング関数を呼び出す方法はありますか?私はどのようにデータをレンダリングするのですか?データが到着したら更新しますか?インラインラッパーとして呼び出されたときに、if(!オブジェクト)doesn; tが動作することに注意してください。なぜ、どうしたらいいですか?初心者の質問には申し訳ありません。私は、データフレームワークを使用して反応のデータを表示することを意図していたと考えますが、フレームワークを少なくして学習を開始し、基本を取得したいと考えました。どうもありがとう! - コードは次のとおりです。beginner at react.js - 後で更新される状態からコンポーネントをレンダリングする

import React, { Component } from 'react'; 
import logo from './logo.svg'; 
import './App.css'; 
class ItemLister extends React.Component { 
constructor(props) { 
    super(props); 
    this.state = { items: [] }; 
} 
componentDidMount() { 
    let url = "http://localhost:8888"; 
    let iterator = fetch(url, {method: 'GET'}); 
    iterator 
    .then(response => { 
    //console.log('sss', response) 
     return response.json(); 
    }) 
    .then(post => { 
     //console.log(post) 
     this.state.items = post; 
     alert(this.state.items.users[3].firstname); 
    }); 
} 
output(object){ 
    if (!object){ 
     return '?'; 
    }else{ 
     return object; 
    } 
} 
render() {   
    return(
     <div> 
      <div>Items:</div> 
      <div>{this.output(this.state.items.users[3].firstname)}</div> 
     </div> 
    ); 
} 
}    
export default ItemLister; 
+0

はい、Reactや他のこのようなフレームワークでは基本的なことです。データがないときにはプレースホルダ/ロード/その他をレンダリングし、状態が変わるとコンポーネントが再びレンダリングされ、実際のデータがレンダリングされます。それがうまくいかない理由は、 'this.state.items.users ... 'にアクセスしようとしているからであり、存在しないので関数にも到達しないからです。 –

答えて

1

あなたのレンダリング機能は次のようなものが考えられます。あなたのデータが到着するまで、あなたのデータをフェッチするので、基本的に、あなたが、プレースホルダのコンポーネントをレンダリング

render() { const username = (this.state.items === []) ? placeholder : this.output(this.state.items.users[3].firstname; return( <div> <div>Items:</div> <div>{username}</div> </div>
); }

は非同期とcomponentDidMountでありますので、レンダリングはデータを取得する前に最初に行われます。

このコンポーネントが一般的にどのように構築されているかを再考したいと思いますが、なぜユーザー[3]に具体的にアクセスしていますか?

+0

多くのおかげでConan。私はちょうど現時点でのテストとしてこれをやっています。私は本当に状態で完全なJSONオブジェクトを格納し、次にいくつかのフィールドを使用してリストをレンダリングする必要があります。コードサンプルがすべてのアイテムを格納してから、.mapを使用して多くの文字を出力します

{first_name} blah blah {favourite_food}
。私は今あなたのコードを試してみます。もう一度感謝して、JSONの項目からいくつかの項目のリストを作成する方法を教えてください。 – Andrew

+0

これはまだ動作していません。プレースホルダーの仕組みを説明できますか?私はそれを定義する必要がありますか?他の場所。出力はキーワードですか?申し訳ありませんが、私は非常にこれを新しく、いくつかの新しい/ JSXの構文すなわち?と===。再び多くのありがとう – Andrew

+0

これにこの行を変更してください: const placeholder = "items for waiting ..."; const username =(this.state.items === [])?プレースホルダ:this.output(this.state.items.users [3] .firstname; – Mateusz

関連する問題