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

MobX与React中fetch请求获取数据返回undefined问题求助

问题原因与解决方法

问题原因

  • 异步执行时序问题:组件首次渲染时,useEffect中的fetchUsers是异步函数,网络请求还未完成,data.users尚未被赋值,所以组件顶层的console.log(data.users)会输出undefined。
  • 浏览器控制台的引用特性:控制台打印的对象是引用类型,当你展开查看时,浏览器会读取该对象的最新状态——此时网络请求已完成,users已被赋值,所以能看到数据,但首次打印的undefined是当时的真实值。
  • 非响应式日志位置:尽管组件用observer包裹,但顶层的console.log不会在users更新时重新执行,只有组件的渲染内容会响应users变化重新渲染。

解决方法

方法1:利用组件响应式渲染打印

保留组件顶层的console.log,当users更新时,observer会触发组件重新渲染,此时日志会打印最新的data.users:

const MyTable = observer( () => {
    useEffect(() => {
        data.fetchUsers()
    }, [])
    
    // 每次组件渲染(含users更新时)都会打印最新值
    console.log(data.users)

    return ( 
        <div></div>
     );
})

方法2:等待异步请求完成后打印

修改useEffect,等待fetchUsers执行完毕后再打印,确保拿到已赋值的users:

useEffect(() => {
    const getUsers = async () => {
        await data.fetchUsers();
        console.log(data.users); // 请求完成后打印最新数据
    };
    getUsers();
}, []);

方法3:用MobX的autorun追踪数据变化

使用MobX的autorun监听users的变化,每次users更新时自动执行日志:

import { autorun } from 'mobx';
import { observer } from 'mobx-react-lite';
import React, { useEffect } from 'react';
import data from '../store/data.js';

const MyTable = observer( () => {
    useEffect(() => {
        data.fetchUsers();
        // 监听users变化,更新时自动打印
        const dispose = autorun(() => {
            console.log(data.users);
        });
        // 组件卸载时清理监听
        return dispose;
    }, [])

    return ( 
        <div></div>
     );
})

export default MyTable;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 03:03:34