React组件中Ant Design <Table>无法随数据更新重新渲染的问题求助
React组件中Ant Design 无法随数据更新重新渲染的问题求助 1. 给
哥们,我仔细看了你贴的代码,发现了几个导致Table不更新和无限循环的关键点,咱们一步步来解决:
首先说为啥会无限循环
你在SalesList里的第一个useEffect如果把updateList放进依赖数组,就会触发无限循环——因为updateList函数在UpdateList hook里每次组件渲染都会重新创建一个新的函数实例,React会认为依赖变了,就会再次触发useEffect,进而调用updateList导致重新渲染,陷入死循环。
然后是Table不更新的可能原因
- rowKey配置问题:你给Table设置了
rowKey="ID",但得确认你的数据项里真的有叫ID的唯一标识字段!如果后端返回的是小写的id或者其他名字,Table没法正确识别行的变化,自然不会重新渲染。 - 状态更新的冗余处理:你在
UpdateList里用setList([...newList])其实没必要,fetchData返回的已经是新数组了,直接赋值就行,但这不是主要问题,不过优化一下更好。
具体修改方案
1. 给updateList加上useCallback保证函数稳定性
修改UpdateList.js,用useCallback包裹updateList,让它只有在依赖变化时才重新创建:
import { useState, useEffect, useCallback } from 'react'; import useFetchData from '../services/api/showData'; const UpdateList = () => { const { data, loading, error, fetchData } = useFetchData(); const [list, setList] = useState([]); // 用useCallback包裹,依赖数组加入fetchData(它已经被useCallback处理过,是稳定的) const updateList = useCallback(async () => { try { const newList = await fetchData(); setList(newList); // 直接赋值新数组,不用展开 console.log('New list obtained:', newList); } catch (error) { console.error('An error occurred while updating your data', error); } }, [fetchData]); useEffect(() => { updateList(); }, [updateList]); // 现在可以安全把updateList放进依赖了 return { list, loading, error, updateList }; }; export default UpdateList;
2. 修正Table的rowKey配置
确认你的数据里的唯一字段名,比如如果是id,就改成:
return <Table dataSource={list} columns={columns} rowKey="id" />;
或者用函数形式更保险(避免字段名大小写问题):
return <Table dataSource={list} columns={columns} rowKey={(record) => record.ID} />;
3. (可选)简化数据流,减少冗余状态
其实你可以去掉UpdateList里的list状态,直接用useFetchData返回的data,这样减少一层状态复制,避免可能的不同步问题:
import { useCallback } from 'react'; import useFetchData from '../services/api/showData'; const UpdateList = () => { const { data: list, loading, error, fetchData } = useFetchData(); const updateList = useCallback(async () => { try { await fetchData(); console.log('List updated'); } catch (error) { console.error('An error occurred while updating your data', error); } }, [fetchData]); // 这里可以去掉初始化的useEffect,因为useFetchData里已经自动调用过fetchData了 return { list, loading, error, updateList }; }; export default UpdateList;
4. 最后修改SalesList的useEffect
现在updateList是稳定的了,你可以放心把它放进依赖数组:
useEffect(() => { updateList(); }, [updateList]);
这样修改后,当你调用updateList更新数据时,list的引用会变化,Table拿到新的dataSource,加上正确的rowKey,就会自动重新渲染了,而且也不会有无限循环的问题啦!
备注:内容来源于stack exchange,提问作者Emmanuel Salazar
相关产品推荐
相关产品推荐

