ReactJS - setState Axios POST 响应

Posted

技术标签:

【中文标题】ReactJS - setState Axios POST 响应【英文标题】:ReactJS - setState Axios POST response 【发布时间】:2018-09-06 01:33:04 【问题描述】:

我正在尝试为我的 Axios POST 响应设置一个状态,但我映射数据的数组仍然是空的。数据获取工作良好,但我只需将所有带有“主题”关键字的数据移动到我的 Todos 数组并打印出来。

到目前为止,这是我的代码;

App.js

import React,  Component  from 'react';
import axios from 'axios';
import Todos from "./Components/Todos"

class App extends Component 
  constructor()
    super();
    this.state = 
      todos:[]
    
  

  // AXIOS request
  getTodos()
    var postData = 
      "startDate": "startDate",
      "endDate": "endDate",
      "studentGroup": ["ID"]
    ;
    let axiosConfig = 
      headers: 
        'Content-Type': 'application/json',
        'Authorization': "Basic " + btoa("username" + ":" + "password")
      
    ;
    axios.post('url', postData, axiosConfig)
    .then((data) => 
      console.log(data);
      this.setState(todos: data.reservations ? data.reservations : [], function()
        console.log(this.state);
      )
    )
    .catch((err) => 
      console.log("Error: ", err);
    )
  

  componentWillMount()
    this.getTodos();
  
  componentDidMount()
    this.getTodos();
  

  render() 
    return (
      <div className="App">
        <Todos todos=this.state.todos/>
      </div>
    );
  

export default App;

Todos.js

import React,  Component  from 'react';
import TodoItem from './TodoItem';

class Todos extends Component 
  render() 
    let todoItems;
    if(this.props.todos)
      todoItems = this.props.todos.map(todo => 
        return (
          <TodoItem key=todo.subject todo=todo />
        );
      );
    
    return (
      <div className="Todos">
        <h3>Results:</h3>
          todoItems
      </div>
    );
  

export default Todos;

TodoItem.js

import React,  Component  from 'react';

class TodoItem extends Component 
  render() 
    return (
      <li className="Todo">
        <strong>this.props.todo.subject</strong>
      </li>
    );
  

export default TodoItem;

setState 之前来自控制台的片段:

我应该使用其他函数而不是箭头函数吗?

【问题讨论】:

【参考方案1】:

如果您没有收到this.setState is undefined 错误,那就有点奇怪了。您能否修复/复制下面的代码并验证是否有帮助:

import React,  Component  from 'react';
import axios from 'axios';
import Todos from "./Components/Todos"

class App extends Component 
  constructor(props)
    super(props);    // pass props to "father" constructor
    this.state = 
      todos:[]
    
    this.getTodos = this.getTodos.bind(this);
  

// AXIOS request
getTodos()
  var postData = 
    "startDate": "startDate",
    "endDate": "endDate",
    "studentGroup": ["ID"]
  ;
  let axiosConfig = 
    headers: 
      'Content-Type': 'application/json',
      'Authorization': "Basic " + btoa("username" + ":" + "password")
    
  ;
  axios.post('url', postData, axiosConfig)
  .then((response) => 
    if(response.data.reservations) 
      this.setState(todos: response.data.reservations)
    
  )
  .catch((err) => 
    console.log("Error: ", err);
  )


  componentDidMount()
    this.getTodos();
  

  render() 
    console.log(this.state.todos);
    return (
      <div className="App">
        <Todos todos=this.state.todos/>
      </div>
    );
  

export default App;

现在观察在请求完成后是否调用了console.log(this.state.todos);。如果是,请验证它是一个空数组。

【讨论】:

是的,它被调用并且它是一个空数组。 你能再验证一次if(data.reservations) console.log(data.reservations) 不会记录一个空数组吗? 是的,控制台日志中没有任何内容。 @IlariM 你的意思是它记录一个空数组或者它不记录任何东西? 它不记录任何东西。【参考方案2】:

在函数中创建自引用

getTodos()
    var self = this; // create a this reference
    var postData =  .. ;
    let axiosConfig = ... ;
    axios.post(..)
        .then((data) => 
             self.setState('your updated state')
           ) 
        .catch((err) => );

【讨论】:

【参考方案3】:

我很难处理未定义的“this”。我是这样解决的(调用函数应该是箭头函数):

 handleGenerateCharge =(event) => 
        const header = new Headers();
        header.append('Access-Control-Allow-Origin', '*');  

        var charge = 
            name: "ABC",
            createDate: Moment(Date.now()).format()
        

        axios.post("http://url", charge, header)
            .then((res) => 
                if (res.status === 200) 
                    this.update();
                
            ).catch((error) => 
                this.setState( errorMessage: error );
            )
        event.preventDefault();
    

【讨论】:

以上是关于ReactJS - setState Axios POST 响应的主要内容,如果未能解决你的问题,请参考以下文章

ReactJs:获取无法读取未定义错误的属性“setState”[重复]

消失的值this.state.array ReactJS

reactjs——解决setState异步问题

ReactJS , setState 发出 onChange 事件

ReactJS - setState 到多个元素

setState ReactJS 中的 this.state