2016-05-02 9 views
0

Ich möchte einige Werte aus einer JSON-Datei abrufen und sie in mehrere Komponenten rendern. Dieser Code scheint nicht zu funktionieren. Bitte schlagen Sie Änderungen vor. wahrscheinlich gibt es einige Probleme mit dem Umfang.Rendern von JSON-Daten in mehreren Komponenten von react.js

var App = React.createClass({ 

    getInitialState: function(){ 
     return { myData: [] } 

    }, 
    showResults: function(response){ 
     this.setState(
      {myData: response} 
     ) 
    }, 

    loadData: function(URL) { 
     $.ajax({ 
     type: 'GET', 
     dataType: 'jsonp', 
     url: URL, 
     success: function(response){ 
      this.showResults(response) 
     }.bind(this) 
     }) 
    }, 

    render: function(){ 
     this.loadData("fileLocation/sample.json"); 
     return(
     <div> 
     {myData.key1} 
     <Component1 value={myData.key2} /> 
     <Component2 value={myData.array[0].key3}/> 
     </div> 
    ) 
    } 
    }); 

    var Component1 = React.createClass({ 
    render: function() { 
     return(
     <div>{this.props.value}</div> 
    ) 
    } 
    }); 

    var Component2 = React.createClass({ 
    render: function() { 
     return(
     <div>{this.props.value}</div> 
    ) 
    } 
    }); 
    ReactDOM.render(<App/>, document.getElementById('content')); 

Das ist sample.json-Datei, die ich abholen möchte. Auch zeigt dies einen Syntaxfehler

{ 
    key1:"value1", 
    key2:"value2", 
    array: [ 
    {key3:"value3"}, 
    {key4:"value4"} 
    ] 
} 
+2

Sollte nicht 'myData.' sein' this.state.myData.'? – Kujira

+2

Rufen Sie 'this.loadData()' auch in 'componentDidMount' oder' componentWillMount' auf. Sonst wird es aufgrund von Zustandsänderungen unendlich oft aufgerufen. – Kujira

+0

Zusätzlich zu den @Kujira-Tipps bezieht sich das '.bind (this)' auf das xhr-Objekt. Weisen Sie 'this' außerhalb des '$ .ajax' am Anfang der' loadData' -Funktion einen Alias ​​zu und verwenden Sie dann den Alias ​​beim erfolgreichen Callback, um auf das tatsächliche, das Sie wollen, zu verweisen. – falsarella

Antwort

1

Richtig showResults bei loadData[1] nennen:

var App = React.createClass({ 

    getInitialState: function(){ 
     return { myData: [] }; 
    }, 

    showResults: function(response){ 
     this.setState({ 
      myData: response 
     }); 
    }, 

    loadData: function(URL) { 
     var that = this; 
     $.ajax({ 
     type: 'GET', 
     dataType: 'json', 
     url: URL, 
     success: function(response){ 
      that.showResults(response); 
     } 
     }) 
    }, 

Verschieben loadDatarender-componentDidMount[2] und Zugriff richtig myData[3]:

componentDidMount: function() { 
     this.loadData("fileLocation/sample.json"); 
    }, 

    render: function(){ 
     return(
     <div> 
     {this.state.myData.key1} 
     <Component1 value={this.state.myData.key2} /> 
     <Component2 value={this.state.myData.array[0].key3}/> 
     </div> 
    ) 
    } 
}); 

Halten Component1 und Component2 als sie ohnehin schon sind:

var Component1 = React.createClass({ 
    render: function() { 
     return(
     <div>{this.props.value}</div> 
    ) 
    } 
}); 

var Component2 = React.createClass({ 
    render: function() { 
     return(
     <div>{this.props.value}</div> 
    ) 
    } 
}); 
ReactDOM.render(<App/>, document.getElementById('content')); 
+1

@ VishnuPaspunoor Nicht nur kopieren-einfügen: versuchen Sie, die Begründung hinter jeder Änderung zu verstehen! :) – falsarella

+1

Vielen Dank dafür. Ich werde sicherlich verstehen –

+0

wie dies ohne jquery zu tun? Können wir das mit jsx machen? –

Verwandte Themen