反应TypeError:this.state.projects.map不是函数

时间:2019-03-20 14:38:45

标签: javascript reactjs

export default class Timeline extends Component{
state = {
    projects : [],
};

async componentDidMount(){
    const response = await api.get("/projects");

    this.setState({projects: response.data});
}

render(){
    return (
        <div className="timeline-wrapper">
           { this.state.projects.map(project => <h1>{project.name}</h1> )}
         </div>

    );       
}


}

此代码返回

  

TypeError:this.state.projects.map不是函数

为什么?这是什么问题?

赞赏!

3 个答案:

答案 0 :(得分:0)

如果您是我故意使用axios。

const res = await axios.get(queryString);
  const arrayOfObjects = await res.data; // << what you use for map

答案 1 :(得分:0)

昨天我遇到了类似的问题,今天又解决了。我想在这里分享它,希望它可以帮助您或其他希望解决此问题的人。

我当时正在使用全栈应用程序,问题出在我的后端。

我返回响应的方式是错误的,因为它作为一个对象返回,并且必须是一个数组,我想通过它进行映射。

Project.find({})
.then(projects=> {

//This is wrong:

res.json({projects: projects})

}
Project.find({})
.then(projects=> {

//This is correct:

res.json(projects)
}

这就是我要做的一切。祝好运。

答案 2 :(得分:0)

这里的问题是您的诺言返回了空结果,这意味着 response.data 未定义。

调用set state之后,将默认数组更改为undefined,这意味着 this.state.projects 无法映射,因为它不再是数组。

对我来说,这还可以,因为您可能应该将默认状态设置为undefined并处理这种情况。

您可以尝试更改代码,如下所示:

export default class Timeline extends Component {
  state = {
    projectsLoading: false,
    projects: undefined
  };

  componentDidMount() {
    this.setState({ projectsLoading: true }, async () => {
      const response = await api.get('/projects');
      this.setState({ projects: response.data, projectsLoading: false });
    });
  }

  renderProjects() {
    const { projects } = this.state;

    projects
      ? projects.map(project => <h1>{project.name}</h1>)
      : 'There are currently no projects to show';
  }

  render() {
    const { projectsLoading } = this.state;

    return (
      <div className="timeline-wrapper">
        {projectsLoading ? <Loader /> : this.renderProjects()}
      </div>
    );
  }
}

这将增加从api提取数据时的加载支持,如果返回的数据为空,则会显示一条错误消息,并处理未定义的情况。