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

React-Table接收Props传参报错:Cannot read properties of undefined (reading 'map')

问题:React-Table传递Props时出现Cannot read properties of undefined (reading 'map')错误

在使用React-Table时,从页面组件向BasicTable组件传递columns和data作为props时触发错误:Cannot read properties of undefined (reading 'map'),但直接在BasicTable组件内导入数据和列配置就能正常渲染,需解决如何正确传递props完成渲染。

问题根源

核心问题是组件接收的props名称与父组件传递的不匹配:

  • 父组件传递的props是columns和data
  • BasicTable组件里解构的却是COLUMNS和MOCK_DATA,导致这两个变量始终为undefined,React-Table无法获取有效配置,最终执行map操作时抛出错误

修复步骤

1. 修正组件的Props解构名称

将BasicTable组件的props解构改为和父组件传递一致的名称:

// 原错误写法
export const BasicTable = ({COLUMNS, MOCK_DATA}) => { ... }

// 修正后写法
export const BasicTable = ({columns, data}) => { ... }

2. 更新useMemo的依赖与返回值

同步修改useMemo中引用的变量,确保使用正确的props值:

// 原错误写法
const columns = useMemo(() => COLUMNS, []);
const data  = useMemo(() => MOCK_DATA, []);

// 修正后写法
const tableColumns = useMemo(() => columns, [columns]);
const tableData  = useMemo(() => data, [data]);

注:将变量名改为tableColumns和tableData是为了避免与props重名,也可直接沿用原名称,确保逻辑清晰即可

3. (可选)添加默认Props

为避免父组件未传递props时再次报错,可给组件设置默认props:

BasicTable.defaultProps = {
  columns: [],
  data: []
};

修正后的完整BasicTable组件代码

import React, { useMemo } from "react";
import { useTable } from "react-table";

export const BasicTable = ({columns, data}) => {
    // 用useMemo缓存列和数据,依赖项设为传入的props
    const tableColumns = useMemo(() => columns, [columns]);
    const tableData  = useMemo(() => data, [data]);

    const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow } =
        useTable({
          columns: tableColumns,
          data: tableData,
        });

    return (
        <table
            {...getTableProps()}
            className="table table-hover table-bordered"
        >
            <thead>
                {headerGroups.map((headerGroup) => (
                    <tr
                        {...headerGroup.getHeaderGroupProps()}
                        className="text-center"
                    >
                        {headerGroup.headers.map((col) => (
                            <th {...col.getHeaderProps()}>
                                {col.render("Header")}
                            </th>
                        ))}
                    </tr>
                ))}
            </thead>
            <tbody {...getTableBodyProps()}>
                {rows.map((row) => {
                    prepareRow(row);
                    return (
                        <tr {...row.getRowProps()} className="text-center">
                            {row.cells.map((cell) => {
                                return (
                                    <td {...cell.getCellProps()}>
                                        {cell.render("Cell")}
                                    </td>
                                );
                            })}
                        </tr>
                    );
                })}
            </tbody>
        </table>
    );
};

// 添加默认props,增强鲁棒性
BasicTable.defaultProps = {
  columns: [],
  data: []
};

父组件页面代码(无需修改)

import MOCK_DATA from "../Components/Tables/ExpensesIndexTable/Mock data/MOCK_DATA.json";
import { COLUMNS } from "../Components/Tables/ExpensesIndexTable/Columns/expenses_index_columns.js";
import { BasicTable } from '../路径/BasicTable'; // 确保导入路径正确

export const Index = () => {
    return (
        <div className="table-responsive-md">
           <BasicTable columns={COLUMNS} data={MOCK_DATA}/>
        </div>
    );
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:01:24