2017-08-16 8 views
1

こんにちは私は反応して反応チャートを表示する反応コンポーネントを作成しようとしていますが、これを行うには融合チャートを使用しています。そして、私はそれをグラフにフィードするAPIを介して動的にデータを取得する必要があります。しかし、チャートはデータなしでレンダリングされ、ajaxリクエストはチャートがロードされた後にのみ開始されます。 thisがここにトリッキーであるポインタとしてReact DOMはajaxリクエストの前にレンダリングされます

import React from 'react'; 
import ReactDOM from 'react-dom'; 
import $ from 'jquery' 
import FusionCharts from 'fusioncharts'; 
import ReactFC from 'react-fusioncharts'; 
import chart from 'fusioncharts/fusioncharts.charts'; 
class MyApp extends React.Component { 
     render() { 
      var chartData; 
       $.ajax({ 
       type: "GET", 
       url: 'someurl', 
       dataType: "json", 
       success: function (data) {  
       chartData =data; 
       alert(chartData); 
} 
      }); 

      var chartConfigs = { 
    type: "Column2D", 
    className: "fc-column2d", // ReactJS attribute-name for DOM classes 
    dataFormat: "JSON", 
    dataSource: { 
     chart:{}, 
     data: chartData 
    } 
}; 
     return (
      <div>< ReactFC {...chartConfigs }/></div> 

     ); 
    } 
} 

ReactDOM.render(
    <MyApp />, 
    document.getElementById('chart-container') 
); 
+1

ライフサイクルメソッドを使用して...レンダリングにおけるAjaxコードを追加しない - https://facebook.github.io/react/docs/react-component.html これが属します'componentWillMount(){}'の中で、 '読み込み'のようなプレースホルダーをレンダリングし、データが到着したときに状態を変更する必要があります。 –

+0

@DimitarChristoff Depends-didMountは、サーバーサイドレンダリングの回避策を使用していない限り、公式の推奨事項です。 –

+0

おそらく真ですが、レンダリングの前に設定状態のような他のコンポジションを実行できるので、私は 'willMount/willUnmount'を好むでしょう。私の基準は:操作がDOMに触れる/作業する必要がない場合、レンダリングする前に熱心に/早く実行し、そうでなければ、マウントを待つ。真実は言いますが、私は小道具としてデータを取得するだけではなく、バックエンドに関するドメイン知識を持つUIコンポーネントを作成して以来、しばらくしています。これは、あなたがreduxやmobxのようなモデルを考慮する前に、物事を動かすための素早いハックです。 –

答えて

1

EDIT

:また、私は、データが

マイコードスニペット利用可能になるとReactDOMを再レンダリングする方法を知りたいです。したがって、ajaxコールの前に、that = thisを割り当てることによって、「現在の」オブジェクトを指す何かが必要です。

もう1つの方法は、ajax関数をバインドすることです。

$.ajax({...}).bind(this)


私はstateであなたのchartDataを格納します。 @Dimitar Christoffが述べたように、componentWillMountにajaxを実行します。 ajax呼び出しが終了したら、setStateを使用してrenderをトリガーします。

import React from 'react'; 
 
import ReactDOM from 'react-dom'; 
 
import $ from 'jquery' 
 
import FusionCharts from 'fusioncharts'; 
 
import ReactFC from 'react-fusioncharts'; 
 
import chart from 'fusioncharts/fusioncharts.charts'; 
 
class MyApp extends React.Component { 
 
    constructor(props) { 
 
    super(props); 
 
    this.state = { 
 
     chartData: null; // OR whatever type to fit your data 
 
    } 
 
    } 
 
    
 
    componentWillMount() { 
 
    let that = this 
 
    $.ajax({ 
 
     type: "GET", 
 
     url: 'someurl', 
 
     dataType: "json", 
 
     success: function (data) { 
 
     console.log(data); 
 
     that.setState({chartData: data}); 
 
     } 
 
    }); 
 
    } 
 
    
 
    render() { 
 
    let chartConfigs = { 
 
     type: "Column2D", 
 
     className: "fc-column2d", // ReactJS attribute-name for DOM classes 
 
     dataFormat: "JSON", 
 
     dataSource: { 
 
      chart:{}, 
 
      data: chartData 
 
     } 
 
    }; 
 
    
 
    return (
 
     <div><ReactFC {...chartConfigs }/></div> 
 
    ); 
 
    } 
 
} 
 

 
ReactDOM.render(
 
    <MyApp />, 
 
    document.getElementById('chart-container') 
 
);

+0

<3私たちが必要とする英雄 –

+0

私はこれに似たものを試しましたが、以前のcomponentDidMount()ではそれが私を助けませんでした。コードを実行しようとすると、this.setStateが関数ではなく、グラフがレンダリングされていないことを示すエラーが発生します。何か不足していますか?この反応は全く新しいもので、私はちょうど – JDP

+0

@ JDPを学習しようとしています。申し訳ありませんが、一歩足りません。回答が更新されました –

関連する問題