Making REST calls from a react component

前端 未结 4 1801
醉酒成梦
醉酒成梦 2021-01-30 17:30

I am trying to make REST call from a react component and render the returned JSON data into the DOM

Here is my component

import React from \'react\';

ex         


        
相关标签:
4条回答
  • 2021-01-30 17:56

    Use the following instead. It will work: (You can also check the data if loaded in the 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)
                })
        }
    
    

    Then use the result stored in state during render to display as required.

    0 讨论(0)
  • 2021-01-30 17:57

    You can try this for your render method:

    render() {
        var resultNodes = this.state.items.map(function(result, index) {
            return (
                <div>result<div/>
            );
        }.bind(this));
        return (
            <div>
                {resultNodes}
            </div>
        );
    }
    

    and don't forget to use .bind(this) for your fetch(...).then(), I don't think it could work without...

    0 讨论(0)
  • 2021-01-30 18:10

    Fetch methods will return a Promise that makes it straightforward to write code that works in an asynchronous manner:

    In your case:

    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() returns a promise, because this it works on a response stream and we need to process entire response first in order to work.

    0 讨论(0)
  • 2021-01-30 18:15

    There are a couple of errors in your code. The one that's probably tripping you up is the this.setState({items:result.json()})

    Fetch's .json() method returns a promise, so it will need to be dealt with as async.

    fetch(`http://jsonplaceholder.typicode.com/posts`)
    .then(result=>result.json())
    .then(items=>this.setState({items}))
    

    I don't know why .json() returns a promise (if anyone can shed light, I'm interested).

    For the render function, here you go...

    <ul>
       {this.state.items.map(item=><li key={item.id}>{item.body}</li>)}
    </ul>
    

    Don't forget the unique key!

    For the other answer, there's no need to bind map.

    Here it is working...

    http://jsfiddle.net/weqm8q5w/6/

    0 讨论(0)
提交回复
热议问题