J'ai un composant React et je souhaite charger mes données JSON à partir d'un fichier. Le journal de la console ne fonctionne pas actuellement, même si je crée la variable data en tant que variable globale.
'use strict';
var React = require('react/addons');
// load in JSON data from file
var data;
var oReq = new XMLHttpRequest();
oReq.onload = reqListener;
oReq.open("get", "data.json", true);
oReq.send();
function reqListener(e) {
data = JSON.parse(this.responseText);
}
console.log(data);
var List = React.createClass({
getInitialState: function() {
return {data: this.props.data};
},
render: function() {
var listItems = this.state.data.map(function(item) {
var eachItem = item.works.work;
var photo = eachItem.map(function(url) {
return (
<td>{url.urls}</td>
)
});
});
return <ul>{listItems}</ul>
}
});
var redBubble = React.createClass({
render: function() {
return (
<div>
<List data={data}/>
</div>
);
}
});
module.exports = redBubble;
Idéalement, je préférerais faire quelque chose comme ceci, mais cela ne fonctionne pas - il essaie d'ajouter ". Js" à la fin du nom du fichier.
var data = require('./data.json');
Tout conseil sur la meilleure façon, de préférence la méthode "React", serait grandement apprécié!
Vous ouvrez un connexion asynchrone , mais vous avez écrit votre code comme s'il était synchrone. La fonction de rappel reqListener
ne sera pas exécutée de manière synchrone avec votre code (c'est-à-dire avant le React.createClass
), mais uniquement une fois que votre extrait de code aura été exécuté et que la réponse aura été reçue de votre emplacement distant.
À moins que vous ne soyez sur une connexion à enchevêtrement quantique à latence nulle, c'est bien une fois que toutes vos instructions ont été exécutées. Par exemple, pour enregistrer les données reçues, vous devez:
function reqListener(e) {
data = JSON.parse(this.responseText);
console.log(data);
}
Je ne vois pas l'utilisation de data
dans le composant React, je ne peux donc que suggérer ceci théoriquement: pourquoi pas pdate votre composant dans le rappel?
J'essayais de faire la même chose et voici ce qui a fonctionné pour moi (ES6/ES2015):
import myData from './data.json';
J'ai eu la solution de cette réponse sur un thread réactif natif demandant la même chose: https://stackoverflow.com/a/37781882/176002
Le moyen le plus simple et le plus efficace de mettre un fichier à la disposition de votre composant est le suivant:
var data = require('json!./data.json');
Notez le json!
avant le chemin
installer json-loader
:
npm i json-loader --save
créer le dossier data
dans src
:
mkdir data
mettre votre/vos fichier (s) ici
charger votre fichier
var data = require('json!../data/yourfile.json');
Vous pouvez ajouter votre fichier JSON en tant qu'externe à l'aide de webpack config. Ensuite, vous pouvez charger ce JSON dans l’un de vos modules de réaction.
Jetez un oeil à cette réponse