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

React组件传参报错:this.props.userId不是函数的解决方法

问题解决方案

我帮你排查了代码里的问题,导致this.props.userId不是函数报错的核心原因加上几个潜在的代码问题,我整理了修复步骤和优化方案:

1. 子组件导出方式错误

你当前子组件用的是具名导出:export UsersTable;,但父组件里应该是用默认导入的方式(比如import UsersTable from './UsersTable'),这会导致父组件中拿到的UsersTable不是你定义的组件,自然无法正确传递userId这个回调props,最终触发报错。

修复方式:把子组件的导出改为默认导出:

// 替换原来的 export UsersTable;
export default UsersTable;

2. 子组件中data变量未定义

你的子组件直接使用了data变量,但代码里没有任何定义或来源,这会导致另一个“data is not defined”的报错。你需要从props中接收父组件传递过来的数据。

3. 可选优化:简化函数绑定

子组件中你在constructor里手动绑定了editUser函数,其实可以直接用类字段箭头函数来自动绑定this,省去bind的步骤,代码更简洁。


修改后的完整代码

子组件 UsersTable

class UsersTable extends React.Component {
  constructor(props) {
    super(props);
    this.state = { };
    // 用箭头函数的话可以删掉这行 bind 代码
    // this.editUser = this.editUser.bind(this);
  }

  // 改用箭头函数自动绑定this
  editUser = (id) => {
    // 可以加个判断,避免props未传递时的报错
    if (typeof this.props.userId === 'function') {
      this.props.userId(id);
    }
  }

  render() {
    // 从props中解构需要的变量,避免直接使用未定义的data
    const { data, page, rowsPerPage } = this.props;
    
    return (
      <TableBody>
        {/* 用可选链操作符?,避免data为undefined时调用slice报错 */}
        {data
          ?.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)
          .map(n => (
            <TableRow key={n.id}>
              <TableCell className={classes.fixedTd}>
                <BorderColorIcon 
                  onClick={() => this.editUser(n.userId)} 
                  className="action margin-r" 
                />
              </TableCell>
            </TableRow>
          ))}
      </TableBody>
    );
  }
}

// 改为默认导出
export default UsersTable;

父组件 CompanyUserMgt

class CompanyUserMgt extends Component {
  constructor(props) {
    super(props);
    this.state = { 
      tableKey: 1,
      page: 0,
      rowsPerPage: 10,
      // 假设你的用户数据存在这里,根据实际情况替换
      usersData: []
    }
  }

  editUser = (id) => {
    console.log("user", id)
  }

  render() {
    const { page, rowsPerPage, usersData, tableKey } = this.state;
    
    return (
      <div className="">
        <UsersTable 
          userId={this.editUser} 
          key={tableKey}
          // 把数据和分页参数传递给子组件
          data={usersData}
          page={page}
          rowsPerPage={rowsPerPage}
        />
      </div>
    )
  }
}

export default CompanyUserMgt;

这样修改后,点击按钮就能正确把userId传递给父组件的editUser函数,控制台也不会再报错了。

内容的提问来源于stack exchange,提问作者David Johns

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:22:32