从react组件进行REST调用

时间:2016-05-27 14:38:38

标签: json rest dom reactjs fetch

我正在尝试从react组件进行REST调用,并将返回的JSON数据呈现到DOM

这是我的组件

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?
        );
    }

为了在DOM中绑定返回的json?

4 个答案:

答案 0 :(得分:43)

您的代码中存在一些错误。可能绊倒你的那个是this.setState({items:result.json()})

Fetch' .json()方法返回一个promise,因此需要将其作为async处理。

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

我不知道为什么.json()会回复一个承诺(如果有人能说清楚,我很感兴趣)。

对于渲染功能,这里你去...

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

别忘了这把钥匙!

对于另一个答案,没有必要绑定地图。

这是工作......

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

答案 1 :(得分:3)

您可以尝试使用此方法:

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

并且不要忘记.bind(this)使用fetch(...).then(),我认为没有...... {/ p>

答案 2 :(得分:0)

Fetch方法将返回一个Promise,可以直接编写以异步方式工作的代码:

在你的情况下:

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()会返回一个承诺,因为它适用于响应流,我们需要先处理整个响应才能正常工作。

答案 3 :(得分:0)

使用以下内容代替。它将起作用: (您也可以检查数据是否已加载到控制台中)


 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)
            })
    }

然后使用渲染期间存储在状态中的结果按要求显示。