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

在map函数中执行创建并更新数据操作的问题排查

问题分析与解决方案

核心问题

你遇到的情况本质是异步操作冲突+Hook使用错误,导致只有最后一条leads记录被更新:

  1. 直接在map里并行调用create时,所有create的onSuccess会共享同一个record状态变量,后续的setRecord会覆盖之前的值,最终只有最后一次创建的leads_statusID和对应的lead ID被保留,自然只能更新一条记录。
  2. 把update放进onSuccess的写法,违反了React Hook的调用规则——useUpdate是Hook,只能在组件顶层或其他Hook内部调用,不能放在回调函数里。强行调用会导致状态上下文混乱,同样只会生效最后一次操作。

正确解决方案

改用dataProvider直接执行更新操作(绕过useUpdate Hook),并通过Promise链式调用确保每个leads_status创建成功后再执行对应的leads更新,同时用Promise.all管理批量操作:

import { useCreate, useDataProvider, useNotify } from 'react-admin';
import React from 'react';

const YourComponent = ({ leadsIDS }) => {
    const dataProvider = useDataProvider();
    const notify = useNotify();
    const [create, { isLoading: isLoadingCreate }] = useCreate();

    // 封装批量处理函数,避免组件渲染时重复执行
    const handleBatchProcess = () => {
        const batchPromises = leadsIDS.map(leadId => {
            // 先创建leads_status记录
            return create('leads_status', {
                data: {
                    id_lead: leadId,
                    id_status: 5
                }
            })
            .then(({ data: newStatus }) => {
                // 创建成功后,用dataProvider更新对应的leads记录
                return dataProvider.update('leads', {
                    id: leadId,
                    data: {
                        id_ls: newStatus.id
                    }
                });
            })
            .catch(error => {
                notify(`处理ID ${leadId} 失败`, { type: 'warning' });
                console.error(error);
            });
        });

        // 等待所有操作完成后提示结果
        Promise.all(batchPromises).then(() => {
            notify('批量操作全部完成', { type: 'success' });
        });
    };

    return (
        <button 
            onClick={handleBatchProcess} 
            disabled={isLoadingCreate}
        >
            批量更新线索状态
        </button>
    );
};

export default YourComponent;

关键改进点

  • 避免Hook回调违规:用dataProvider.update替代useUpdate Hook,直接在Promise回调中执行更新,绕开Hook的调用限制。
  • 独立操作链:每个lead的创建和更新是链式Promise,确保顺序执行且互不干扰,不会出现状态覆盖问题。
  • 批量管理:用Promise.all统一管理所有异步操作,方便后续处理成功/失败的全局提示。
  • 避免重复执行:把批量操作封装在点击事件函数中,而不是组件顶层的map里,防止组件每次渲染都重复触发请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:31:39