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

React组件中Ant Design <Table>无法随数据更新重新渲染的问题求助

React组件中Ant Design 无法随数据更新重新渲染的问题求助

哥们,我仔细看了你贴的代码,发现了几个导致Table不更新和无限循环的关键点,咱们一步步来解决:

首先说为啥会无限循环

你在SalesList里的第一个useEffect如果把updateList放进依赖数组,就会触发无限循环——因为updateList函数在UpdateList hook里每次组件渲染都会重新创建一个新的函数实例,React会认为依赖变了,就会再次触发useEffect,进而调用updateList导致重新渲染,陷入死循环。

然后是Table不更新的可能原因

  1. rowKey配置问题:你给Table设置了rowKey="ID",但得确认你的数据项里真的有叫ID的唯一标识字段!如果后端返回的是小写的id或者其他名字,Table没法正确识别行的变化,自然不会重新渲染。
  2. 状态更新的冗余处理:你在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 08:33:01