J'essaie d'appeler REST à partir d'un composant de réaction et de restituer les données JSON renvoyées dans le DOM
Voici mon composant
import React from 'react';
export default class ItemLister extends React.Component {
constructor() {
super();
this.state = { items: [] };
}
componentDidMount() {
fetch(`http://api/call`)
.then(result=> {
this.setState({items:result.json()});
});
}
render() {
return(
WHAT SHOULD THIS RETURN?
);
}
Afin de lier le JSON retourné dans un DOM?
Il y a quelques erreurs dans votre code. Celui qui vous a probablement fait trébucher est la this.setState({items:result.json()})
La méthode .json()
de Fetch renvoie une promesse, elle devra donc être traitée comme asynchrone.
fetch(`http://jsonplaceholder.typicode.com/posts`)
.then(result=>result.json())
.then(items=>this.setState({items}))
Je ne sais pas pourquoi .json()
renvoie une promesse (si quelqu'un peut nous éclairer, je suis intéressé).
Pour la fonction de rendu, c'est parti ...
<ul>
{this.state.items.map(item=><li key={item.id}>{item.body}</li>)}
</ul>
N'oubliez pas la clé unique!
Pour l'autre réponse, il n'est pas nécessaire de lier la carte.
Ici ça marche ...
Vous pouvez essayer ceci pour votre méthode de rendu:
render() {
var resultNodes = this.state.items.map(function(result, index) {
return (
<div>result<div/>
);
}.bind(this));
return (
<div>
{resultNodes}
</div>
);
}
et n'oubliez pas d'utiliser .bind(this)
pour votre fetch(...).then()
, je ne pense pas que cela pourrait fonctionner sans ...
Les méthodes de récupération renverront une promesse qui simplifie l'écriture de code fonctionnant de manière asynchrone:
Dans ton cas:
componentDidMount(){
fetch('http://api/call') // returns a promise object
.then( result => result.json()) // still returns a promise object, U need to chain it again
.then( items => this.setState({items}));
}
result.json () renvoie une promesse, car cela fonctionne sur un flux response et nous devons d'abord traiter l'intégralité de la réponse pour fonctionner.
Utilisez ce qui suit à la place. Cela fonctionnera: (Vous pouvez également vérifier les données si elles sont chargées dans la console)
constructor(props) {
super(props);
this.state = {
items: []
}
}
componentDidMount() {
fetch('http://api/call')
.then(Response => Response.json())
.then(res => {
console.log(res);
this.setState({
items: res,
});
})
.catch(error => {
console.log(error)
})
}
Utilisez ensuite le résultat stocké à l'état pendant le rendu pour l'afficher selon vos besoins.