2017-05-05 11 views
0

Listコンポーネントfrom http://www.material-ui.com/#/components/listは非同期受信要素を表示しません。非同期で取得されたListItemコンポーネントをMaterial-UI ListのReactコンポーネントの状態から使用する

私はコンポーネントのrender()メソッドでは私のリストを使用する方法:私の状態を充填

<List children={this.state.elements} /> 

constructor(props) { 
    super(props); 
    this.state = {elements: []}; 
} 

async componentDidMount() { 
    this.setState({elements: this.getInitialState()}); 
} 

async getInitialState() { 
     var elements = []; 
     const response = await fetch('api/endpoint/elements'); 
     const result = await response.json(); 
     if (result.status = "success") { 
      elements.push(<ListItem primaryText="Dummy Data" />); 
     } 
     return elements; 
    } 
+1

カップルの事を状態使用SETSTATEのこの非同期ラッパーを設定した後に何かをしたいと、それを待っていた場合、私はcomponentDidMount'は非同期関数とに応じて、ある 'とは思いませんあなたがヒットしているエンドポイントの数は、あなたの状態を処理するために、reduxとredux-sagaのようなものを使用する方が理にかなっているかもしれません。 – cssko

+1

私のアプリケーションはエンドポイントに重く依存し、実際にはツリー構造をナビゲートできるようにして、データベースの内容をユーザーに永久に示します。 – optional

+0

申し訳ありませんが、より完全な作業例を提供できる場合は、何をしたいのかを示すのに役立ちます。 – cssko

答えて

1

componentDidMountのgetInitialStateを待つ必要があります。

async componentDidMount() { 
    const state = await this.getInitialState(); 
    this.setState({elements: state}); 
} 

あなたは

setStateAsync(state) { 
    return new Promise((resolve) => { 
     this.setState(state, resolve) 
    }); 
    } 
1

コンセプトは大丈夫ですと動作するはずです。

componentDidMountは、小さなアプリケーション用の非同期ロジックを追加する場所です(大きなアプリケーションの場合は、sagas、reduxなどを参照してください)。

問題は、setStateは非同期関数ではないため、コンポーネントの状態を正しく設定できないということです。

単純にすべてのajaxロジックコンポーネントを移動します.DadMountは、ajaxが解決すると状態を変更します。

私は待っていて、それを試したことがないので、私はそれはそれで動作することを確認したが、約束と、それは100%の作品ができない(例えばフェッチ)

小さな擬似コード:

​​
+0

componentDidMountは非同期関数です。あなたは '.then'連鎖の代わりに約束を待つことができます。 –

関連する問題