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

React中跨两层组件传递函数作为Props的问题及示例

如何在React中将函数作为Props跨两层组件传递

我来帮你梳理一下正确的实现方式,顺便修正你代码里的小问题:

首先看你的App组件,原来传递onItemRemove的时候写了() => this.onItemRemove,这相当于返回了函数本身,而不是把可用的函数引用传过去。因为你的onItemRemove是用箭头函数定义的,已经自动绑定了组件的this,所以直接传this.onItemRemove就行。

接下来,ToDoList组件需要把这个删除函数继续传递给每个ToDoItem,这里有两种常见的实现方式,下面给你展示完整的修正代码:

1. App 组件(顶层)

interface IState {
  todos: any[];
}

// 假设 TODOS 是预先定义的待办事项数组
const TODOS = [
  { id: 1, name: "学习React" },
  { id: 2, name: "整理代码" }
];

class App extends React.Component<{}, IState> {
  public state: IState = { todos: TODOS };

  // 箭头函数自动绑定this,无需额外处理上下文
  private onItemRemove = (item: any) => {
    // 实现删除逻辑:过滤掉被点击的item
    this.setState(prevState => ({
      todos: prevState.todos.filter(todo => todo.id !== item.id)
    }));
  };

  render() {
    return (
      <div>
        {/* 直接传递函数引用给ToDoList */}
        <ToDoList todos={this.state.todos} onItemRemove={this.onItemRemove} />
      </div>
    );
  }
}

2. ToDoList 组件(中间层)

interface IToDoListProps {
  todos: any[];
  onItemRemove: (item: any) => void;
}

const ToDoList: React.FC<IToDoListProps> = props => {
  return (
    <ul>
      {props.todos.map((todo: any) => {
        return (
          <ToDoItem
            name={todo.name}
            key={todo.id}
            id={todo.id.toString()}
            {/* 方式一:绑定当前todo到删除函数,ToDoItem点击时直接调用 */}
            onItemRemove={() => props.onItemRemove(todo)}
            {/* 方式二:直接传递函数,让ToDoItem自己传参数 */}
            // onItemRemove={props.onItemRemove}
            // todo={todo}
          />
        );
      })}
    </ul>
  );
};

3. ToDoItem 组件(底层)

// 对应方式一的Props定义
interface IToDoItemProps {
  name: string;
  id: string;
  onItemRemove: () => void;
}

// 对应方式二的Props定义
// interface IToDoItemProps {
//   name: string;
//   id: string;
//   todo: any;
//   onItemRemove: (item: any) => void;
// }

const ToDoItem: React.FC<IToDoItemProps> = props => {
  // 方式二的处理逻辑
  // const handleRemove = () => {
  //   props.onItemRemove(props.todo);
  // };

  return (
    <li>
      {props.name}
      {/* 方式一:直接调用传入的绑定好参数的函数 */}
      <button onClick={props.onItemRemove}>删除</button>
      {/* 方式二:调用自己封装的处理函数 */}
      // <button onClick={handleRemove}>删除</button>
    </li>
  );
};

关键要点说明:

  • 函数绑定:类组件中用箭头函数定义事件处理函数,能自动绑定组件实例的this,避免传递时丢失上下文。
  • Props传递:跨层传递函数时,直接传引用即可;如果需要给函数绑定当前循环的参数(比如每个todo),可以用箭头函数包裹,这样ToDoItem调用时无需再传参数。
  • 类型安全:用TypeScript定义每个组件的Props接口,能提前发现类型错误,让代码更健壮。

内容的提问来源于stack exchange,提问作者Tudor Apostol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:20:14