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

React组件结合MobX Store实现时重复加载问题排查与解决

问题根源与解决方案

问题原因

React StrictMode在开发环境下会双重执行组件的副作用逻辑(比如useEffect的回调函数),导致loadActivities被调用两次。而你的loadActivities方法是通过push向数组追加数据,没有先清空已有内容,最终造成活动数据重复。重复的id会让findIndex在删除/编辑时只匹配第一个重复项,引发操作异常。

解决方案

1. 修改loadActivities方法:替换数组而非追加数据

在加载活动前直接替换整个activities数组,而非逐个push,确保每次调用都会覆盖旧数据,避免重复。同时简化日期处理逻辑:

// activityStore.ts
loadActivities = async () => {
    this.loadingInitial = true;

    try {
        const activitiesResponse = await axios.get('http://localhost:5000/activities');
        // 统一处理日期并生成新数组
        const activities: Activity[] = activitiesResponse.data.map(activity => ({
            ...activity,
            date: activity.date.split('T')[0]
        }));

        runInAction(() => {
            this.activities = activities; // 直接替换数组,而非push
            this.loadingInitial = false;
        });
    } catch (error) {
        console.log(error);
        runInAction(() => {
            this.loadingInitial = false;
        });
    }
}

2. 优化useEffect依赖(可选)

ActivityDashboard中的useEffect依赖activityStore是多余的,因为store是单例,引用不会变化。将依赖改为空数组,明确只在组件挂载时加载一次数据:

// ActivityDashboard.tsx
useEffect(() => {
    activityStore.loadActivities();
}, []); // 空数组表示仅挂载时执行

为什么之前重置长度无效?

你尝试的activities.length = 0虽然能清空数组,但MobX对数组的响应式追踪更推荐直接赋值新数组,而非修改length属性。另外如果重置操作的时机不对(比如在接口请求之后),仍会导致两次调用时重复追加数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:22:36