2016-08-24 5 views
0

Ich lerne React. Ich verfolge ein Kapitel in Buch, in dem sie die Daten von API unter componentDidMount laden und aktualisieren Sie den Status der Komponente alsReact Wurf Fehler: Kann nicht lesen Eigenschaft 'Karte' von undefined

getInitialState: function() { 
     return {changeSets: []}; 
    }, 
    mapOpenLibraryDataToChangeSet : function (data) { 
    return data.map(function (change, index) { 
     return { 
     "when":jQuery.timeago(change.timestamp), 
     "who": change.author.key, 
     "description": change.comment 
     } 
    }); 
    }, 
    componentDidMount: function() { 
     $.ajax({ 
      url: 'http://openlibrary.org/recentchanges.json?limit=10', 
      context: this, 
      dataType: 'json', 
      type: 'GET' 
     }).done(function (data) { 
//    console.log(data); 
      var changeSets = this.mapOpenLibraryDataToChangeSet(data); 
      console.log("changeSets:" + JSON.stringify(changeSets)); 
      this.setState({changeSets: changeSets}); 
     }); 
    }, 

Als ich das laufen, ich sehe Fehler auf der Konsole als

"TypeError: Cannot read property 'map' of undefined 
    at t.render (mikobuf.js:55:41) 
    at _renderValidatedComponentWithoutOwnerOrContext (https://npmcdn.com/[email protected]/dist/react.min.js:13:17508) 
    at _renderValidatedComponent (https://npmcdn.com/[email protected]/dist/react.min.js:13:17644) 
    at performInitialMount (https://npmcdn.com/[email protected]/dist/react.min.js:13:13421) 
    at mountComponent (https://npmcdn.com/[email protected]/dist/react.min.js:13:12467) 
    at Object.mountComponent (https://npmcdn.com/[email protected]/dist/react.min.js:15:2892) 
    at h.mountChildren (https://npmcdn.com/[email protected]/dist/react.min.js:14:26368) 
    at h._createInitialChildren (https://npmcdn.com/[email protected]/dist/react.min.js:13:26619) 
    at h.mountComponent (https://npmcdn.com/[email protected]/dist/react.min.js:13:24771) 
    at Object.mountComponent (https://npmcdn.com/[email protected]/dist/react.min.js:15:2892)" 

Die laufender Link ist http://jsbin.com/mikobuf/edit?js,console,output

Was mache ich falsch?

UPDATE

Als ich die changeSets={data} hinzugefügt, während die App-Rendering, ich sehe Daten in der Konsole

ReactDOM.render(<App headings = {headings} changeSets={data}/>, document.getElementById("container")) 

Aber ich möchte die Daten von API gezogen werden. Also, sobald ich die changeSets={data} entfernen beim Rendern, versagt es

ReactDOM.render(<App headings = {headings}/>, document.getElementById("container")) 
+0

Ihre Ajax-Aufruf wirft einen Fehler: ' "error"'. 'map' ist nur für Arrays definiert. –

+0

Gemäß den von Ihnen angegebenen Informationen sind 'Daten' nicht definiert. –

+0

Bitte sehen Sie mein Update – daydreamer

Antwort

1

Sie versuchen, die Requisiten changeSets zu verwenden, wenn es tatsächlich Teil App s Zustand ist. Diese

:

<RecentChangesTable.Rows changeSets={this.props.changeSets} />

sollte sein:

<RecentChangesTable.Rows changeSets={this.state.changeSets} />

http://jsbin.com/tuqeciyere/1/edit?js,console,output

+0

Interessanterweise werden die Daten mit dem Status 'changeSets = {this.state.changeSets}' übergeben, aber untergeordnete Komponenten verwenden sie als 'this.props' als' {this.props.changeset.when} '. Dies scheint in erster Linie verwirrend – daydreamer

+0

State ist innerhalb einer Komponente. Requisiten sind das, was Sie weitergeben. Wenn Sie Daten an die Komponente übergeben, müssen Sie "Requisiten" verwenden. Wenn Sie den internen Zustand ändern, verwenden Sie 'state'. Das war ein 10-Sekunden-Überblick und ich bin nicht der beste Erklärer. Sie verwenden "Requisiten" in einer Kindkomponente, die Daten von ihrem Elternteil erhält (selbst wenn dieses Elternteil diese Daten in "Staat" festhält). –

+0

Ich denke, dass Ihr Korb von dem geändert wurde, was Sie zuerst gepostet haben. Ich bin mir also nicht sicher, was das Problem ist. –

Verwandte Themen