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

React中PUT请求后表格刷新异常问题及解决方案咨询

问题描述

我开发了一个提交时切换记录值的表单,需要在数据库数据更新后自动刷新表格,避免用户手动刷新查看更新内容。目前功能存在异常:

  • 首次更新记录时,刷新无法捕获变更;
  • 再次切换值后,每次切换/刷新都能正常反映变更;
  • 选择新记录时问题重复。

我怀疑刷新操作在数据库更新完成前就已触发,后续刷新捕获的是前一次的更新。希望将PUT请求改写为异步命令,确保记录更新成功后再执行refreshTable函数,同时想确认是否是使用refreshKey触发刷新的方式导致了问题。


表单代码

export function DeptStatusSwitch(props) {
    const { closeModal, refreshTable, selectedRecord, ltStatusUrl } = props;

    const { values, setValues } = FormFunctions(true);
    const classes = useStyles();
    const item = values; // used for easier referencing (matches table item)

    React.useEffect(() => {
        if (selectedRecord !== null) {
            setValues({
                ...selectedRecord
        }); }
    }, [selectedRecord, setValues]);


// Edit Record
    function editRecordStatus() {
        axios.put(`${ltStatusUrl + (item.id)}`, {
            title: 'Success',
            body: 'The record had been successfully updated'
        });
    }

    const handleSubmit = e => {
        e.preventDefault();
        editRecordStatus();
        closeModal();
        refreshTable();
    };

    return (
        <Form onSubmit={handleSubmit} >
            <Grid container spacing={0} justifyContent='center'>
               <Typography>
                  Are you sure you want to {item.isArchived === 1 ? 'ACTIVATE' : 'DEACTIVATE'} this department?
               </Typography>
            </Grid>
            <Grid container spacing={0} justifyContent='center'>
            <Typography className={classes.boldItalic} >
                  {item.name}
               </Typography>
            </Grid>
            <Grid>
                <div style={{display: 'flex', justifyContent: 'flex-end'}}>
                    <Controls.Button
                        type='submit'
                        text='Confirm'
                        onClick={editRecordStatus}
                    />
                    <Controls.Button
                        text='Cancel'
                        color='default'
                        onClick={closeModal}
                    />
                </div>
            </Grid>
        </Form>
    );
}

表格刷新实现代码

// Refresh Table
    const [refreshKey, setRefreshKey] = React.useState(1);
    const refreshTable = () => { setRefreshKey(refreshKey + 1); };


// Fetching Data
React.useEffect(() => {
  const fetchData = async () => {
    setLoading(true);
    try {
    const res = await axios.get(ltReadUrl);
    setTableData( res.data );
    } catch (error) {
    console.error(error.message);
    }
    setLoading(false);
  };
  fetchData();
  }, [setTableData, setLoading, refreshKey]); 

解决方案

1. 修复PUT请求的异步执行问题

你的核心问题是editRecordStatus中的PUT请求是异步操作,但你没有等待它完成就直接调用了refreshTable,导致表格刷新时数据库还没完成更新。需要调整代码确保更新完成后再刷新:

修改后的关键代码:

// 将更新函数改为异步
async function editRecordStatus() {
    await axios.put(`${ltStatusUrl + (item.id)}`, {
        title: 'Success',
        body: 'The record had been successfully updated'
    });
}

// 提交函数也改为异步,等待更新完成
const handleSubmit = async e => {
    e.preventDefault();
    await editRecordStatus();
    closeModal();
    refreshTable();
};

同时注意:提交按钮同时绑定了onClick和type='submit',会导致editRecordStatus被重复调用,需要去掉onClick属性:

<Controls.Button
    type='submit'
    text='Confirm'
    // 移除 onClick={editRecordStatus}
/>

2. 关于refreshKey触发刷新的方式

这种方式本身没有问题,是React中常用的强制刷新数据的手段,你的首次刷新失败和该机制无关,完全是因为PUT请求未完成就触发了刷新。

可以优化refreshTable的写法,避免闭包导致的状态更新异常:

const refreshTable = () => { 
    setRefreshKey(prevKey => prevKey + 1); 
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:05:13