You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向子组件分两次传递props时出现map undefined错误求助

问题原因分析及解决办法

你遇到的map undefined错误,核心原因是你渲染了两个独立的<Todo>组件,其中第二个组件没有接收到todo这个必要的props。

咱们一步步拆解:

  • 第一次渲染<Todo todo={this.state.todos} />:这个组件的this.props.todo是你state里的数组,所以map方法能正常执行,没问题。
  • 第二次渲染<Todo deletTodo={this.deletTodo}/>:这个组件的props里只有deletTodo,完全没有todo属性,所以this.props.todo的值是undefined。而undefined是没有map方法的,自然就抛出错误了。

而你把props合并传递的时候,只渲染了一个<Todo>组件,同时把todo和deletTodo都传了过去,这时候组件里的this.props.todo是存在的数组,map就能正常工作了。

正确的写法应该是这样的:

在App.js里只渲染一次<Todo>组件,同时传递所有需要的props:

import React, { Component } from 'react'
import Todo from './Todo';
export default class App extends Component {
 state = {
 todos: [
 {id : 1 , content: "lets sleep"},
 {id: 2, content:"lets eat "}
 ]}
 deletTodo = (id) => {
 console.log(id)
 }
 render() {
 return (
 <div className="App container">
 <h1 className="center blue-text">Todo's</h1>
 {/* 只渲染一次Todo组件,传递所有需要的props */}
 <Todo todo={this.state.todos} deletTodo={this.deletTodo} />
 </div>
 )
 }
}

另外,你的Todo组件目前还没用到deletTodo,之后如果要添加删除功能,直接用this.props.deletTodo(td.id)就行,比如给每个todo项加个删除按钮:

import React, { Component } from 'react'
export default class Todo extends Component {
 render() {
 return (
 <div className= "todos collection">
 { this.props.todo.map((td)=>{
 return (
 <div className="collection-item" key={td.id} >
 <span>{td.content}</span>
 {/* 添加删除按钮,调用props里的deletTodo方法 */}
 <button onClick={() => this.props.deletTodo(td.id)} className="right btn red">Delete</button>
 </div>
 )})}
 </div>
 )
 }
}

内容的提问来源于stack exchange,提问作者mdvenkatesh nuhk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:08:32