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 votreanimation
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'utilisethis.props.animation
outhis.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 puisthis.state.data.CanvasSprite.setFrame()
et modifier ma fonction d'animation de retourner un tableau de données qui comprend une CanvasSprite objet? Ou vathis.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.
Vous devez vous connecter pour publier un commentaire.
Vous avez des tonnes d'erreurs de syntaxe dans ton code, j'ai réglé pour vous.
Je ne sais pas la réponse de votre API, donc je ne sais pas si il y a d'autres à corriger.
Certains des problèmes que j'ai remarqué:
Probablement votre indentation est faux, parce que vous avez eu des fonctions avec double
return
consolidés. Je vous suggère de permettre ESLint dans votre IDE pour rattraper ces erreurs.Vous n'avez pas compris comment
setState
fonctionne, vous ne pouvez pas tout:Sinon,
this.state.foo
à l'intérieur demyFn
fera référence à l'ancienne valeur, et non pas à la nouvelle que vous êtes réglage de la droite maintenant.Que vous avez à faire
this.setState({foo: 'bar'}, () => this.setState({baa: myFn(this.state.foo)})
, mais alors, il est mieux de le faire comme je l'ai fait dans le code j'ai fixé ci-dessus.function animation(){ this.state.data.map() }
au lieu defunction animation(json){ json.map() }
, ce qui fait beaucoup plus de sens. Mais qui ne devrait effet d'accessoires, pas l'état. J'ai mis des bordures autour de l'toiles afin que je puisse dire si elles ont au moins le rendu, quel que soit le accessoires en cours de définition, et ils ne sont pas. Il n'est pas rendu.setFrame()
. Quelqu'un a dit que je devrais être à l'aide de ce.état.animation au lieu de cela.les accessoires, mais cela ne semble pas juste pour moi et n'est pas de faire une différence. Babel problèmes mis à part, voici une fourchette de votre codepen qui doit démontrer le comportement lié à ma question, mais n'est-ce pas: codepen.io/anon/pen/wWvqrV?les éditeurs=0011Ok... Voici le travail de projet. Obtenu de l'aide de @gumingfeng et @hkal.
Leçons apprises:
setState()
à l'intérieur decomponentDidUpdate()
déclenche une boucle infinie donc dû mettre le tableau d'objet, directement et indépendamment de l'état.Ouf, je pense que c'est ça. Espérons que cela aide les autres.
Et je voudrais juste conclure en disant: donnez-Réagir un essai sans JSX. C'est vraiment pas mal 🙂
JS:
this
frustration