React.js: laden von JSON-Daten mit Fetch API und Requisiten aus object-array

Völlig neue react.js und nachdem Sie durch das tutorial und Lesen in der Dokumentation nach, ich bin immer noch am kämpfen ein bisschen mit js abrufen zu laden meine Daten aus einer JSON-Datei sowie das festlegen von Eigenschaften aus einem array von Objekten. Ich bin mir auch nicht sicher, ich bin Zugriff auf DOM-Eigenschaften korrekt in meinem event-handler. Ich muss fehlt etwas eher unkompliziert.

Referenz, hier mein code mit dem rest des Projekts und hier ist, was es Aussehen soll.

ETA: ich hatte keine Ahnung von den docs, dass babel browser veraltet, so beschlossen Sie, nur mit geraden Javascript mit ES5-syntax anstelle von JSX. Code aktualisiert unter, aber es ist immer noch nicht das Rendern des Markups.

JS:

var CanvasAnimation = React.createClass({
    getInitialState: function() {
        return {data: []};
    },                            
    loadData: function() {
        /*
        fetch("data.json")
            .then(function(response) {
                return response.json    
                    .then(function(json){
                        this.setState({data: json});
                    }.bind(this))
            }.bind(this));
        */
        const data = [
            { id: "stalkerOne", width: 225, height: 434, spriteSheetURL: 'spriteSheets/stalkerone.jpg', rows: 5, columns: 5, totalFrames: 24 },
            { id: "stalkerTwo", width: 175, height: 432, spriteSheetURL: 'spriteSheets/stalkertwo.jpg', rows: 6, columns: 5, totalFrames: 26 },
            { id: "stalkerThree", width: 251, height: 432, spriteSheetURL: 'spriteSheets/stalkerthree.jpg', rows: 6, columns: 5, totalFrames: 28 }
        ];
    },
    componentDidMount: function() {
        this.loadData();
    },
    componentDidUpdate: function() {
        function animation(json) {
            return json.map(function(data) {
                return(
                    new CanvasSprite(
                        document.getElementById(data.id),
                        data.width,
                        data.height,
                        data.spriteSheetURL,
                        data.rows,
                        data.columns,
                        data.totalFrames)
                );
            });
        };
        this.setState({animaton: animation(this.state.data)});  
    },
    handleInteraction: function(event, index) {
        var offsetY = event.clientY - event.node.getBoundingClientRect().top;
        var relY = offsetY/this.state.data.height;
        this.props.animation[index].setFrame(relY);
    },
    render: function() {
        var canvases = this.state.data.map(function(data, index) {
            return (
                React.createElement('canvas', 
                                    id = data.id,
                                    width = data.width,
                                    height = data.height,
                                    style = 'border:5px solid white',
                                    onMouseOver= this.handleInteraction(event, index))
            );
        });
        return(
            React.createElement('div', canvases)
        );
    }
});
  
    
ReactDOM.render(
    React.createElement(CanvasAnimation, null),
    document.getElementById('content')
); 

  • Sie nicht angegeben haben, in Ihre Frage, was das problem war.
  • Sieht aus wie Sie einen syntax Fehler hier aber this.setState({data: json, animation()}); Fehlt ein Schlüssel hier?
  • Das problem ist weder der Staat noch die Requisiten scheinen tatsächlich eingestellt werden, und das markup ist nicht Rendern. Und Sie sagen, der Schlüssel (data in diesem Fall) muss vorgegeben werden? Ich sehe das nicht getan wird, in der Beispiele noch auf die in der Dokumentation.
  • Nein, ich meine, Sie haben die Funktion animation() in einem Objekt ohne Schlüssel das ist nicht legal javascript-code.. meinst du { data: json, canvas: animation() }. Bei näherer Betrachtung Ihre animation Funktion nichts zurückgibt
  • Sind Sie nicht immer alle Fehler in der browser-Konsole?
  • Ugh, danke. Aktualisiert im snippet. Es ist noch nicht gerendert alles, obwohl. Und sehr schwierig zu sagen, was das Problem ist aufgrund von Babel.
  • Wenn das war nicht klar, Babel wirft den Fehler also ich kann nicht sagen, was JSX entspricht.
  • Lassen Sie uns weiter, diese Diskussion im chat.
  • Es gibt keine dieser.Requisiten.animation,aber das.Zustand.animation.
  • mein Verständnis war das zweite argument von setState() setzt den Requisiten. Es ist eindeutig etwas mehr, das fehlt mir hier.
  • setState ändern.Staat,nicht diese.Requisiten
  • laut der docs das erste argument setzt den Zustand und eine optionale zweite stellt die Requisiten. Alternativ, wie gehen Sie Requisiten statt mit setState?
  • setState können nur die Wirkung dieser.Staat soweit ich weiß.Kann u geben Sie mir die doc-link u erwähnt.
  • setState(function(previousState, currentProps) {...}),ich denke, u erwähnt-code ist wie folgt.Auch wenn dieser Stil,Funktion setState wird sich noch ändern die das.Zustand mit dem Ergebnis der Funktion als argument.
  • Dies ist, was ich meinte: "Es ist auch möglich, übergeben eine Funktion mit der Signatur function(Staat, Requisiten)." Du hast Recht, ich war eindeutig verwirrt hier und es hilft dabei nicht, dass die einzige Antwort, die ich erhalten habe verwendet, setState auf diese Weise.
  • Also...wie würde ich mich über die Einstellung sowohl die Daten als array zu Rendern mein markup mit UND meine object-array zum Steuern der animation in der jede Leinwand einzeln? Derzeit kann ich es Rendern nur in codepen (die einzige Art, wie ich erklären kann, ist, dass es verwendet babel-standalone statt babel-core) und nicht auf die Objekt-Methode setFrame() unabhängig davon, ob ich this.props.animation oder this.state.animation. Ich habe einen link zu dem, was das Ergebnis sollte Aussehen wie in meiner Frage.
  • Scheint, wie ich sein sollte ruft this.setState(data: animation(json)) und dann this.state.data.CanvasSprite.setFrame() und ändern meine animation-Funktion zur Rückgabe eines Daten-array enthält eine CanvasSprite Objekt? Oder wird this.setState(data: json, animation: animation(json)) automatisch anzeigen die json-Datei in mein data-array und fügen Sie dann ein weiteres element, um den Staat als animation, die aus einem CanvasSprite Objekt? Denn das ist zurzeit nicht funktioniert...
  • Hier ist ein codepen, wo es zumindest nicht Rendern: codepen.io/anon/pen/wWvqrV?Redakteure=0011. Aber es wirft Fehler, ich bin nicht die Schlüssel für meine Daten-array in der Erwägung, dass mein Verständnis ist, dass mithilfe von eindeutigen ids für jede Leinwand muss ausreichen, als ein-Taste. Und immer noch keine animation...
  • Lassen Sie uns weiter, diese Diskussion im chat.

InformationsquelleAutor Sophia Gold | 2016-05-28
Schreibe einen Kommentar