2017-07-21 3 views
1

レンダリングのために外部Webサービスを使用するReactコンポーネントがあります。 レンダリングの前にデータをロードしたいのですが、検索エンジンでインデックスを作成したいからです。ここでReact.jsでレンダリングする前にRESTリソースを消費する

は私のコンポーネントです:

class AboutPage extends React.Component { 

    async componentWillMount() { 
     let response = await EventWS.doSearch(); 

     this.setState({ 
      eventList : response.data 
     }) 
    } 

    render() { 
     /* ... */ 
    } 
} 

(私はそれを助けることができると思ったので、非同期/のawaitを使用しようとしたが、ありません)。 componentWillMountが終了した後にSETSTATEが行われていることを示す

Warning: setState(...): Can only update a mounting component. This usually means you called setState() outside componentWillMount() on the server. This is a no-op. Please check the code for the FluxContainer(AboutPage) component. 

:サーバー側レンダリングでページをロードしようとすると

私は警告を受けました。

私の具体的なケースでは、これを克服する最良の方法は何ですか?同期的にajaxコールを行う簡単な方法はありますか?そうすることをお勧めしますか?

ありがとうございます。

編集:私は同期呼び出しを行うことができ、ライブラリを発見した : https://github.com/ForbesLindesay/sync-request

をしかし、それは、それは生産に適していないと述べています。だから私は少しdisapointed。

+1

このチケットでは、async componentWillMount https:// githubについて議論しています。 .com/facebook/react/issues/1739おそらくあなたはそこにsomポインタを見つけることができます – jontro

答えて

0

Fluxについて多くの経験はありませんが、componentDidMountメソッドでこれを行う必要があるようです。

+0

私はcomponentDidMountは常にクライアント側で実行されると思います。 ComponentWillMountはサーバー側で実行されるため、サーバー側のレンダリングに使用する必要があります。 –

+0

マウントされたコンポーネントがないと、状態を設定できないため、データをコンポーネントに渡すための別の方法を見つける必要があります。おそらく、非同期が完了したときに呼び出すための関数propを渡すコンテナコンポーネントですか? –

+0

問題はコンポーネントがマウントされていないことです。問題は、componentWillMount関数が終了した後にajax呼び出しが解決されることです。 コンテナを使用する場合、私は同じ問題を抱えています:コンテナをレンダリングする前に応答をロードする方法? –

-1

あなたはそれを実装するcomponentDidMountgetをベースAxios約束、たとえばあなたがHandling Events In Reactとサンプルコードの下を参照することができます使用することができます。

constructor(props) { 
    super(props); 
    this.state = {eventList: []}; 
    this.Axios = axios.create(); 
} 

componentDidMount() { 
     let _this = this; 
     this.Axios.get('/your/rest/url') 
      .then(function (response) { 
       console.log(response); 
       _this.setState({eventList: response.data}); 
      }).catch(function (error) { 
       console.log(error); 
      }); 
} 

それとも、すでにEventWS.doSearch()リターンPromiseに確認して、その後Axiosを使用している場合をあなたはで次のように呼んでください:

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

componentDidMount() { 
     let _this = this; 
     EventWS.doSearch().then(function (response) { 
      console.log(response); 
      _this.setState({eventList: response.data}); 
     }).catch(function (error) { 
      console.log(error); 
     }); 
} 
+0

ありがとうございますが、私はあなたが質問を間違って読んだと思います。実際に私はすでにAxiosを使用していますが、EventWSクラスによって隠されています。 –

+0

次に、 'EventWS.doSearch();'があなたに約束を返して、それを 'componentDidMount' – Arpit

+0

で呼び出すことを確認します。これは問題ではありません。 –

関連する問題