React Table渲染报错+不更新求助:Cannot read properties of undefined
问题1:"Cannot read properties of undefined (reading 'forEach')" 报错修复
这个错误是因为React Table尝试遍历undefined类型的数据源,根源是tableData函数可能返回undefined,以及父组件的数据判断逻辑有误。
修复步骤:
- 确保
tableData始终返回数组
在SharedTable3.jsx中修改tableData函数,增加空值兜底:
const tableData = (data) => { if (!data) return []; // 数据源为空时返回空数组 switch (getLastPathName(location.pathname)) { case "status": return data.statusMessages || []; // 属性不存在时返回空数组 case "activexml": return data.statusMessages || []; case "catalogues": return data.catalogueInformation || []; default: return data.statusMessages || []; } };
- 修正
SharedTable2.jsx中的数据加载判断逻辑
原判断中dataApi.length === 0不适用于对象类型的数据源(API返回的是包含数组属性的对象,而非直接数组),修改为:
if (isLoading || dataApi === null || dataApi === undefined) { return <div>Loading.......</div>; }
问题源于useMemo依赖缺失、数据源未正确监听,以及React Table状态未重置。
修复步骤:
- 更新
columns的useMemo依赖
在SharedTable3.jsx中,让columns依赖传入的COLUMNS,确保列配置变化时重新计算:
const columns = useMemo(() => COLUMNS, [COLUMNS]);
- 用
useMemo缓存处理后的数据源
确保数据源变化时触发useTable重新计算:
const data = useMemo(() => tableData(DATA), [DATA, location.pathname]);
- 监听数据源变化,重置分页状态
当新数据加载时,重置React Table的页码到第一页,避免旧分页状态导致的显示异常:
import { useTable, usePagination } from 'react-table'; // ... 其他代码 const { getTableProps, getTableBodyProps, headerGroups, page, prepareRow, setPageSize, state: { pageSize, pageIndex }, setPageIndex, // 获取页码修改方法 } = useTable( { columns, data, initialState: { pageIndex: 0, pageSize: 25 }, }, usePagination ); // 监听数据源变化,重置页码 useEffect(() => { setPageIndex(0); }, [data, setPageIndex]);
- 移除
SharedTable2.jsx中错误的数据比较逻辑
原代码中用对象引用比较newData !== prevData不可靠,直接更新状态即可,React会自动处理浅比较:
axios.post(url, formData1) .then((response) => { const newData = response.data; setDataApi(newData); // 移除prevData相关代码 setIsLoading(false); })
额外补充:完善状态定义
在SharedTable2.jsx中补充缺失的状态定义:
const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(false); const [formData, setFormData] = useState({});
内容的提问来源于stack exchange,提问作者Philomath
相关产品推荐
相关产品推荐

