从反应组件进行 REST 调用

Posted

技术标签:

【中文标题】从反应组件进行 REST 调用【英文标题】:Making REST calls from a react component 【发布时间】:2016-09-25 22:58:08 【问题描述】:

我正在尝试从 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?
        );
    

为了将返回的 json 绑定到 DOM 中?

【问题讨论】:

【参考方案1】:

您的代码中有几个错误。 this.setState(items:result.json())

Fetch 的.json() 方法返回一个promise,因此需要作为异步处理。

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/

【讨论】:

fetch() 函数返回一个 Promise,因为它是异步的。 Ir 的结果只有在 http 请求完成后才可用,因此 Promise 是处理它的最佳方案。 @JoachimSchirrmacher 我指的是为什么 result.json() 返回一个承诺。它不需要在当前执行上下文之外执行。 .json() 返回一个 Promise,因为 JSON.parse() 在处理大型结果时非常慢,并且如果失败会抛出异常。 .json() 是否返回一个承诺,因为它正在从可能尚未下载的主体流中读取?【参考方案2】:

你可以试试这个渲染方法:

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

别忘了将.bind(this) 用于你的fetch(...).then(),我认为没有...

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

请改用以下内容。它将起作用: (如果加载到控制台也可以查看数据)


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

然后根据需要使用渲染期间存储在状态中的结果来显示。

【讨论】:

以上是关于从反应组件进行 REST 调用的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在反应功能组件中只进行一次 api 调用?

无法从父反应组件调用子反应组件的属性

从反应组件调用节点模块

从模态对原始组件反应本机调用函数

功能反应:从导入的组件调用函数[重复]

从 redux 更改状态后如何以及何时调用反应组件方法