Javascript ReactJS-Can';t打印TODO,this.props.todos.map不是函数
我是一个新手,我试图从GET请求打印出一些数据并打印出来,但是我得到了未捕获的TypeError:this.props.todos.map不是函数错误 如果我在success函数上更改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 "
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中的回调也绑定到这个函数。