2016-08-22 4 views
0

webserviceを呼び出し、いくつかのデータを約束して非同期で返すコンポーネントを記述しようとしています。この約束が解決されたら、その結果をコンポーネントのrenderメソッドに含めることにします。理想的には、私は、約束の結果が別のコンポーネントに渡されることを望むと思います。 IE;約束の結果は、項目のリストです。React、Typescript、Promises

もう1つ - 私はTypescriptを使ってこのReactコンポーネントを書いています。

現在、私は次のコードを持っている:

componentWillMount() { 
    let fooProps = listGetter.returnListData().then((response) => { 
     return response; 
    }); 
} 

public render(): JSX.Element { 
    <div> 
     <Foo ElementProperties={this.fooProps} /> 
    </div> 
} 

しかし、このコードのエラーアウトして表示が「プロパティにnull値を割り当てることはできません」。

私は間違っていますか?約束事を処理し、それをREACTのコンポーネントに解決する最良の方法は何ですか?

ありがとうございます!

+0

チェックあなた返されたリストには、あなたの、コールバックにNULL /空の場合に渡された関数の最初の引数になります。また、あなたのfooPropsはブロックスコープであるため、レンダリング関数はそれを見ることができません。 – Jecoms

答えて

1

コンポーネントのthe stateを使用する必要があります。
状態を変更すると、コンポーネントの再レンダリングが行われます。コンポーネントが子のプロパティを変更した場合と同様に、子が再レンダリングされます。以下のような

何か:

componentWillMount() { 
    listGetter.returnListData().then((response) => { 
     this.setState({ 
      fooProps: response.fooProps 
     }); 
    }); 
} 

public render(): JSX.Element { 
    <div> 
     <Foo ElementProperties={ this.state.fooProps } /> 
    </div> 
} 
+0

ありがとうNitzan。これはまさに私が探していたものです。私はnullをチェックしていませんでした。応答が返される前に、renderメソッドはFooコントロールにnullを渡して、null以外の参照をレンダリングする実行を開始しました。私はそれを修正し、状態を関数とその作業に結びつけました。 – MrDoNotBreak

0

約束はそれらの値を返すことはありません、彼らはあなたがそれらをチェーンすることができThenableを返します。あなたが探しているの戻り値はthen

componentWillMount() { 
    // bind the function to `this` so even if you don't use an 
    // anonymous arrow function this call will work in the right context 
    let updateComponent = this.updateComponent.bind(this); 
    listGetter.returnListData().then((res) => { 
     updateComponent(res); 
    }) 
} 

updateComponent(res) { 
    this.setState({fooProps: res.fooProps}) 
} 
+1

矢印関数が 'this'のスコープを保持するので、ここで' bind'を使う必要はありません。 –

+0

@NitzanTomer私はちょうどコメントを追加しました。もちろん、それは必要ではありませんが、特に異なる関数構文を使用する場合は、慣れるのが良いことです。私はコンストラクタで 'this.updateComponent = this.updateComponent.bind(this)'をお勧めします。 – Gant

+1

これは冗長で、何の理由もなく新しい機能を作成します –

関連する問題