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

使用useEffect结合Mobx时组件无法渲染数据的问题求助

问题修复方案

你的核心问题是组件没有订阅Mobx状态变化,导致testStore.list更新后React不会触发组件重渲染。热重载后能显示是因为重载时组件重新挂载,直接读取了已更新的状态,但正常流程下状态变更无法驱动视图更新。下面是具体修复步骤:


1. 给组件添加Mobx观察者包装

Mobx需要通过observer装饰器来让React组件订阅它使用的状态,状态变化时自动触发重渲染。你需要从mobx-react-lite(适配函数组件)导入observer并包裹你的组件。

2. 移除多余的autorun

你当前在useEffect里嵌套autorun完全没必要——autorun是用来监听状态变化自动执行逻辑的,但你只需要在组件挂载时执行一次初始化请求,直接在useEffect里写异步逻辑即可,避免不必要的重复执行。

修改后的完整代码

TestPage.tsx

import { observer } from "mobx-react-lite";
import React, { useEffect, useRef } from "react";
import { useStore } from "./store";

const TestPage: React.FC = observer(() => {
    const { testStore } = useStore();
    const isCancelled = useRef(false);

    useEffect(() => {
        const fetchData = async () => {
            try {
                const data = await fetch('/api/dictionaries/sources?subject=MATH');
                const json = await data.json();

                if (!isCancelled.current) {
                    testStore.setList(json);
                }
            } catch (err) {
                console.error('请求失败:', err);
            }
        };

        fetchData();
        
        return () => {
            isCancelled.current = true;
        };
    }, [testStore]);

    return (
        <div>
            <h1>This is test list</h1>
            {testStore.list.map((i) => (
                <div key={i.id}>{i.id}: {i.name}</div>
            ))}
        </div>
    );
});

export default TestPage;

可选优化:修复test-store.ts的类型问题

把setList的参数类型从any改成Item[],避免类型不安全:

import { makeAutoObservable } from "mobx";

export interface Item {
    id: string;
    name: string;
}

export default class TestStore {
    list: Item[];
 
    constructor() {
        this.list = [];
        makeAutoObservable(this);
    }

    setList = (list: Item[]) => {
        this.list = list; 
        console.log("In setList: ", this.list);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:35:54