Faire des appels REST à partir d'un composant react

J'essaie de faire un appel REST à partir d'un composant react et de rendre les données JSON retourné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?

23
demandé sur user_mda 2016-05-27 17:38:38

3 réponses

, Il y a quelques erreurs dans votre code. Celui qui vous fait probablement trébucher est le 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 faire la lumière, je suis intéressé).

Pour la fonction de rendu, voilà...

<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'y a pas besoin de lier la carte.

Le voici travailler...

Http://jsfiddle.net/weqm8q5w/6/

35
répondu D. Walsh 2017-03-30 15:35:51

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) votre fetch(...).then(), je ne pense pas que ça puisse fonctionner sans...

3
répondu Mickaël R. 2016-05-27 14:55:35

Les méthodes Fetch renverront une promesse qui facilite l'écriture de code qui fonctionne de manière asynchrone:

Dans votre 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}));
}

Résultat.json () renvoie une promesse, car cela fonctionne sur un flux de réponse et nous devons d'abord traiter la réponse entière pour fonctionner.

0
répondu Ashif Ali 2017-08-14 13:37:36