如何在React中处理获取API AJAX响应

时间:2016-09-30 19:31:17

标签: javascript json reactjs response fetch-api

我正在使用React中的fetch API创建一个简单的AJAX请求,特别是在componentDidMount()函数中。

它正常工作,因为控制台似乎正在记录结果。但是,我不知道如何访问响应...

componentDidMount = () => {

      let URL = 'https://jsonplaceholder.typicode.com/users'

         fetch(URL)
         .then(function(response) {
            let myData = response.json()
            return myData;
         })
         .then(function(json) {
            console.log('parsed json', json)
         })
         .catch(function(ex) {
            console.log('parsing failed', ex)
         })

   } // end componentDidMount

我尝试在fetch方法之外访问myData,但这会抛出一个错误,说明它是未定义的。所以它只能在函数范围内访问。

然后我尝试了这个:

     .then(function(response) {
        let myData = response.json()
        // return myData;
        this.setState({
           data: myData
        })
     })

这一次,我得到Cannot read property 'setState' of undefined(…)

如何将获取响应传递给状态,甚至只传递一个全局变量?

更新

import React, { Component } from 'react';
import './App.css';

class App extends Component {

   constructor(props) {
      super(props);
      this.state = {
         data: null
      }
   }

   componentDidMount() {
      let URL = 'https://jsonplaceholder.typicode.com/users'  
         fetch(URL)
         .then( (response) => {
            let myData = response.json()
            // return myData;
            this.setState({
               data: myData
            })
         })
         .then( (json) => {
            console.log('parsed json', json)
         })
         .catch( (ex) => {
            console.log('parsing failed', ex)
         })
         console.log(this.state.data)
   } // end componentDidMount

  render() {
    return (
      <div className="App">
         {this.state.data}
      </div>
    );
  }
}

export default App;

6 个答案:

答案 0 :(得分:12)

就我所见,你有两个问题,response.json()会返回一个承诺,所以你不想将myData设置为承诺,而是首先解决承诺然后你可以访问你的数据

其次,this与您的获取请求中的范围不同,因此您未定义的原因,您可以尝试将this范围保存在提取之外:

var component = this;

fetch(URL)
 .then( (response) => {
    return response.json()    
 })
 .then( (json) => {
    component.setState({
       data: json
    })
    console.log('parsed json', json)
 })
 .catch( (ex) => {
    console.log('parsing failed', ex)
 })
 console.log(this.state.data)

答案 1 :(得分:7)

setState未定义,因为您使用经典函数语法而不是箭头函数。箭头功能需要这个&#39;来自&#39; parent&#39;的关键字功能,一个经典的功能(){}创造它自己的&#39;这个&#39;关键词。 试试这个

.then(response => {
    let myData = response.json()
    // return myData;
    this.setState({
       data: myData
    })
 })

答案 2 :(得分:3)

您使用this.setState走在正确的轨道上但是当您在处理响应的函数中调用它时,this不再位于组件的上下文中。使用=>函数可以维护this

的上下文
fetch(URL)
    .then((res) => res.json())
    .then((json) => this.setState({data: json}));

答案 3 :(得分:1)

REACT NATIVE

import React, { Component } from 'react';

import {
AppRegistry,
StyleSheet,
Text,
View,
} from 'react-native';

export default class SampleApp extends Component {
constructor(props) {
super(props);
this.state = {
    data:  'Request '
    }
}

componentDidMount = () => {
fetch('http://localhost/replymsg.json', {
                      mode: "no-cors",
                      method: "GET",
                      headers: {
                        "Accept": "application/json"
                      },} )
                      .then(response => {
                      if (response.ok) {

                          response.json().then(json => {

                            console.warn( JSON.stringify(json.msg ));
                              this.setState({
                                 data: JSON.stringify(json)
                            })

                        });
                      }
                    }); 

}



render() { 
return (
    <Text>  {this.state.data}</Text>
    );
    }
}

AppRegistry.registerComponent('SampleApp', () => SampleApp);

JSON文件 创建一个文件replymsg.json并放在内容之下,它应该托管到本地主机,如:http://localhost/replymsg.json

{"status":"200ok","CurrentID":28,"msg":"msg successfully reply"}

答案 4 :(得分:1)

使用&#39; =&gt;&#39>更改您访问响应数据的方式而不是函数在同一个上下文中。

[0,0] [300,220]. # Reading as [x, y] and [x1, y1]. 

答案 5 :(得分:0)

您需要将当前上下文绑定到目标函数

fetch(URL)
         .then(function(response) {
            return response.json();
         })
         .then(function(json) {
            this.setState({data: json})
         }.bind(this))
         .catch(function(ex) {
            console.log('parsing failed', ex)
         })