React.js: chargement des données JSON avec Fetch API et des accessoires à partir de l'objet array

Totalement nouveau pour react.js et après avoir traversé le tutoriel et la lecture de la documentation, je suis toujours un peu en difficulté avec l'utilisation de js chercher à charger mes données à partir d'un fichier JSON ainsi que la définition des propriétés d'un tableau d'objets. Je ne suis pas certain que je suis accéder à des propriétés DOM correctement dans mon gestionnaire d'événement. Je doit manquer quelque chose d'assez simple.

De référence, voici mon code avec le reste du projet et voici ce qu'il est censé ressembler.

ETA: je n'avais aucune idée de la docs que babel navigateur est obsolète donc décidé de l'utiliser directement en Javascript avec ES5 syntaxe au lieu de JSX. Code de mise à jour ci-dessous, mais il n'est toujours pas rendu le balisage.

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')
); 

  • Vous ne précisez pas dans votre question quel était le problème.
  • On dirait que tu as une erreur de syntaxe ici bien this.setState({data: json, animation()}); Manque une clé ici?
  • Le problème n'est ni l'etat, ni les accessoires semblent être fixés et le balisage n'est pas rendu. Et dites-vous que la touche (data dans ce cas) doit être prédéfini? Je ne vois pas ce que cela soit fait dans les exemples ni référencé dans les docs.
  • Non, je veux dire vous avez la fonction animation() l'intérieur d'un objet sans clé, ce n'est pas légal de code javascript.. tu veux dire { data: json, canvas: animation() }. Après une inspection plus proche de votre animation fonction ne retourne rien
  • N'êtes-vous pas obtenir de toute erreur dans le navigateur de la console?
  • Pouah, merci. Mise à jour de l'extrait. Il n'est pas encore rendu à rien, si. Et très difficile de dire ce que le problème est dû à Babel.
  • Si ce n'était pas clair, Babel est en train de jeter l'erreur donc je ne peux pas dire ce JSX il correspond.
  • Laissez-nous continuer cette discussion dans le chat.
  • Il n'est pas présent.accessoires de jeu.l'animation,mais ce.état.de l'animation.
  • ma compréhension était le deuxième argument de la méthode setState() set accessoires. Il y a clairement quelque chose de plus que je suis absent ici.
  • setState changer cela.état,pas cette.accessoires
  • selon les docs le premier argument définit l'état et une seconde en option définit les accessoires. Sinon, comment procédez-vous des accessoires au lieu d'utiliser setState?
  • setState ne peut que l'effet de cette.de l'état pour autant que je sais.U peut me donner le doc lien u mentionné.
  • setState(function(previousState, currentProps) {...}),je pense que u code mentionné est comme ça.Même si ce style,fonction setState est toujours la ce.état du résultat de la fonction en tant qu'argument.
  • C'est ce que je faisais référence: "Il est aussi possible de passer d'une fonction avec la fonction de signature(état, accessoires)." Vous avez raison, j'ai été très confus ici et il n'aide pas que la seule réponse que j'ai reçu utilise setState de cette façon.
  • Donc...comment pourrais-je aller sur la configuration à la fois le tableau de données pour rendre ma balise avec ET mon tableau d'objets de contrôle de l'animation dans chaque toile, individuellement? À l'heure actuelle, je peux le faire pour que le rendu en codepen (la seule façon dont je peux expliquer ce que c'est qu'il utilise babel-autonome au lieu de babel-core) et ne peut accéder à la méthode de l'objet setFrame() indépendamment du fait que j'utilise this.props.animation ou this.state.animation. J'ai un lien à ce que le résultat doit ressembler à ma question.
  • Me semble que je doit appeler this.setState(data: animation(json)) et puis this.state.data.CanvasSprite.setFrame() et modifier ma fonction d'animation de retourner un tableau de données qui comprend une CanvasSprite objet? Ou va this.setState(data: json, animation: animation(json)) mapper automatiquement le fichier json dans mon tableau de données, puis ajouter un autre élément à l'état appelé l'animation qui se compose d'un CanvasSprite objet? Parce que c'est pas actuellement en train de travailler...
  • Voici un codepen où elle au moins ne le rendu: codepen.io/anon/pen/wWvqrV?les éditeurs=0011. Mais il jette des erreurs que je ne suis pas fournir les clés de mon tableau de données, alors que ma compréhension est que l'utilisation des identifiants uniques pour chaque toile devrait suffire comme une clé. Et toujours pas d'animation...
  • Laissez-nous continuer cette discussion dans le chat.

InformationsquelleAutor Sophia Gold | 2016-05-28