Javascript ReactJS-Can';t打印TODO,this.props.todos.map不是函数

Javascript ReactJS-Can';t打印TODO,this.props.todos.map不是函数,javascript,reactjs,typeerror,Javascript,Reactjs,Typeerror,我是一个新手,我试图从GET请求打印出一些数据并打印出来,但是我得到了未捕获的TypeError:this.props.todos.map不是函数错误 如果我在success函数上更改this.setState({data:data}),我可以在控制台中获取数据,但是有没有快速简单的方法来修复这个问题以打印数据 App.js import React, { Component } from 'react'; import $ from 'jquery'; import Todos from "

我是一个新手,我试图从GET请求打印出一些数据并打印出来,但是我得到了未捕获的TypeError:this.props.todos.map不是函数错误

如果我在success函数上更改
this.setState({data:data})
,我可以在控制台中获取数据,但是有没有快速简单的方法来修复这个问题以打印数据

App.js

import React, { Component } from 'react';

import $ from 'jquery';
import Todos from "./Components/Todos"


class App extends Component {
  constructor(){
    super();
    this.state = {
      todos:[]
    }
  }
  getTodos(){
    $.ajax({
      type: "GET",
      url: 'url',
      dataType:'json',
      headers: {
        Authorization: "Basic " + btoa("username" + ":" + "password")
      },
      cache: false,
      success: function(data){
        this.setState({todos: data}, function(){
          console.log(this.state);
        });
      }.bind(this),
      error: function(xhr, status, err){
        console.log(err);
      }
    });
  }
  componentWillMount(){
    this.getTodos();
  }
  componentDidMount(){
    this.getTodos();
  }

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

export default App;
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.code} todo={todo} />
        );
      });
    }
    return (
      <div className="Todos">
        <h3>Results:</h3>
        {todoItems}
      </div>
    );
  }
}

export default Todos;
import React, { Component } from 'react';

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


export default TodoItem;
import React,{Component}来自'React';
从“jquery”导入美元;
从“/Components/TODO”导入TODO
类应用程序扩展组件{
构造函数(){
超级();
此.state={
待办事项:[]
}
}
getTodos(){
$.ajax({
键入:“获取”,
url:'url',
数据类型:'json',
标题:{
授权:“基本”+btoa(“用户名”+:“+”密码”)
},
cache:false,
成功:功能(数据){
this.setState({todos:data},function()){
console.log(this.state);
});
}.绑定(此),
错误:函数(xhr、状态、错误){
控制台日志(err);
}
});
}
组件willmount(){
这个。getTodos();
}
componentDidMount(){
这个。getTodos();
}
render(){
返回(
);
}
}
导出默认应用程序;
Todos.js

import React, { Component } from 'react';

import $ from 'jquery';
import Todos from "./Components/Todos"


class App extends Component {
  constructor(){
    super();
    this.state = {
      todos:[]
    }
  }
  getTodos(){
    $.ajax({
      type: "GET",
      url: 'url',
      dataType:'json',
      headers: {
        Authorization: "Basic " + btoa("username" + ":" + "password")
      },
      cache: false,
      success: function(data){
        this.setState({todos: data}, function(){
          console.log(this.state);
        });
      }.bind(this),
      error: function(xhr, status, err){
        console.log(err);
      }
    });
  }
  componentWillMount(){
    this.getTodos();
  }
  componentDidMount(){
    this.getTodos();
  }

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

export default App;
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.code} todo={todo} />
        );
      });
    }
    return (
      <div className="Todos">
        <h3>Results:</h3>
        {todoItems}
      </div>
    );
  }
}

export default Todos;
import React, { Component } from 'react';

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


export default TodoItem;
import React,{Component}来自'React';
从“/TodoItem”导入TodoItem;
类Todos扩展组件{
render(){
让我们去做一些事情;
if(this.props.todos){
todoItems=this.props.todos.map(todo=>{
返回(
);
});
}
返回(
结果:
{todoItems}
);
}
}
导出默认TODO;
TodoItem.js

import React, { Component } from 'react';

import $ from 'jquery';
import Todos from "./Components/Todos"


class App extends Component {
  constructor(){
    super();
    this.state = {
      todos:[]
    }
  }
  getTodos(){
    $.ajax({
      type: "GET",
      url: 'url',
      dataType:'json',
      headers: {
        Authorization: "Basic " + btoa("username" + ":" + "password")
      },
      cache: false,
      success: function(data){
        this.setState({todos: data}, function(){
          console.log(this.state);
        });
      }.bind(this),
      error: function(xhr, status, err){
        console.log(err);
      }
    });
  }
  componentWillMount(){
    this.getTodos();
  }
  componentDidMount(){
    this.getTodos();
  }

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

export default App;
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.code} todo={todo} />
        );
      });
    }
    return (
      <div className="Todos">
        <h3>Results:</h3>
        {todoItems}
      </div>
    );
  }
}

export default Todos;
import React, { Component } from 'react';

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


export default TodoItem;
import React,{Component}来自'React';
类TodoItem扩展了组件{
render(){
返回(
  • {this.props.todo.code}
  • ); } } 将默认值导出到doitem;
    控制台日志中的代码段:


    首先,调用
    this.gettoos()
    两次是没有用的,只需在
    componentDidMount()
    方法中调用它,还有一件事需要注意,组件
    TodoItem.js
    将不匹配
    this.props.todo.code
    的值,以避免您需要将其添加到
    TodoItem.js
    中的问题

    class TodoItem extends Component {
      render() {
        if(!this.props.todo){
           <div>Loading</div>
          }
        return (
          <li className="Todo">
            <strong>{this.props.todo.code}</strong>
          </li>
        );
      }
    }
    
    类TodoItem扩展组件{
    render(){
    如果(!this.props.todo){
    加载
    }
    返回(
    
  • {this.props.todo.code}
  • ); } }
    Array.prototype.map()
    需要一个数组,因此如果你试图向它传递一个未定义的值,它会自动抛出一个错误,我相信你的应用程序就是这样


    在尝试我的解决方案之前,
    this.state.todo
    还需要绑定
    gettoos
    函数以引用其中类的范围。所以在构造函数中绑定它:

    this.getTodos = this.getTodos.bind(this)
    

    TODO必须始终是一个数组。因此,在成功函数中更改setState,如下所示

    this.setState({todos: (data.resources ? data.resources : [])}, function(){
              console.log(this.state);
            });
    

    当您执行console.log(this.state)时,发布您正在获取的控制台日志;你可以
    console.log(this.state.todos)
    in-App。js@Andythis.props.todos在包装器组件中使用空数组初始化
    this.state={todos:[]}
    不需要nullcheck@Andy我已经多次遇到这个问题,以至于我能够在几英里之外发现它。很明显,服务器没有返回数组,它必须返回一个对象,这就是原因。map不是函数错误。请求的数据在{}内而不是在数组中,所以这就是我得到错误的原因?它也可能是未定义的,因为您试图在获得响应之前进行渲染,还将此
    this.getTodos=this.getTodos.bind(this)
    添加到您的构造函数中,这不会有什么区别,因为此.gettoos是从componentDidMount()调用的,它不是作为onClick或onChange传递的。getTodos中的回调也绑定到这个函数。