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

React跨组件更新时Material-UI DataGrid不刷新问题

问题分析与解决方案

问题原因

UploadButton组件初始化时通过闭包捕获了rows的初始值(空数组),当通过UI添加新行后,组件未更新对rows的引用。上传完成执行setRows(rows.map(...))时,使用的仍是旧的rows数组(不包含新添加的行),导致新行的document字段无法被更新,因此表格UI无变化。而未拆分组件时,所有逻辑处于同一作用域,rows始终是最新状态,所以功能正常。

修复方案

修改Upload_Button.js中的setRows调用,使用函数式更新获取最新的rows状态,而非依赖闭包中的旧值:

// 替换原setRows行
setRows(prevRows => prevRows.map((row) => (row.id === params.id ? {...row, document: fileUrl} : row)));

完整修改后的handleChange函数

function handleChange(event) {
    setLoading(true)
    const request = new XMLHttpRequest();
    const url = process.env.REACT_APP_SERVER_HOST + USER_GOOGLE_TOKEN_URI
    request.open("GET", url, false); // `false` makes the request synchronous
    request.withCredentials = true;
    request.send();
    const res = JSON.parse(request.responseText)
    const file = event.target.files[0]
    const formData = new FormData();
    const metadata = {
        name: userEmail + "_" + Date.now() + "_" + file.name,
        mimeType: file.type,
        parents: [EXPENSES_FOLDER_ID],
        response: 'file.id'
    }
    formData.append('metadata', new Blob([JSON.stringify(metadata)], {
        type: "application/json"
    }))
    formData.append("file", file)

    fetch(GOOGLE_DRIVE_UPLOAD_FILE_URI, {
        method: 'POST',
        headers: new Headers({ 'Authorization': 'Bearer ' + res.accessToken }),
        body: formData
    }).then((res) => {
        return res.json();
    }).then(function (val) {
        const fileUrl = DRIVE_FILE_URI + val.id
        console.log("Params")
        console.log(params)
        setRowModesModel((oldModel) => ({
            ...oldModel,
            [params.id]: { mode: GridRowModes.Edit, fieldToFocus: 'document' },
        }));
        // 使用函数式更新获取最新rows
        setRows(prevRows => prevRows.map((row) => (row.id === params.id ? {...row, document: fileUrl} : row)));
        setLoading(false);
    });
}

额外优化建议

  • 替换同步XMLHttpRequest为异步方式(配合async/await),避免阻塞页面主线程,提升响应性。
  • 增加上传过程的错误捕获逻辑,避免因网络或API异常导致Loading状态无法关闭。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:27:10