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

Mobx observer包裹的React组件状态变更后未重新渲染问题求助

问题根因及解决方案

1. 响应式属性初始化时机错误(最高概率)

你当前在构造函数中先调用makeAutoObservable(this),之后才完成部分属性的赋值,Mobx的响应式追踪只会对调用makeAutoObservable时实例上已存在的已初始化属性生效,后续赋值的属性不会被自动标记为响应式,所以会出现状态实际更新、但observer组件收不到更新通知的问题。

修复方案:

直接在类属性声明时完成mouseCoordinates的初始化,且将makeAutoObservable放到构造函数所有属性初始化逻辑的最后:

export class WebsocketStore {
  websocketSubject = webSocket('ws://localhost:8080/socket');
  chartSubject;
  priceDataStore;
  tradePlanStore;
  // 直接在类声明阶段初始化默认值,保证属性提前存在
  mouseCoordinates = {
    x: 0,
    y: 0,
  };

  constructor() {
    this.priceDataStore = new PriceDataStore(this);
    this.tradePlanStore = new TradePlanStore(this);
    this.chartSubject = groupByFunction(
      'messageType',
      'getChart',
      this.websocketSubject
    );
    // 所有属性初始化完成后再调用makeAutoObservable
    makeAutoObservable(this);
  }

  // 其余代码保持不变
}

如果不想修改初始化逻辑,也可以调整updateCoordinates的实现,不替换整个mouseCoordinates对象,只修改对象内部的属性值:

updateCoordinates = (coordinates) => {
  this.mouseCoordinates.x = coordinates[0];
  this.mouseCoordinates.y = coordinates[1];
};

2. 排查store实例一致性

请确认ChartCrossHairs组件是WebSocketProvider的后代组件,保证useWebsocketStore拿到的store实例和你更新鼠标坐标时使用的是同一个实例,避免多实例导致状态不同步。

3. 低版本Mobx兼容

如果你使用的是Mobx 6以下的旧版本,makeAutoObservable的支持不完善,可以替换为手动声明响应式属性的方案:

import { makeObservable, observable, action } from 'mobx';

constructor() {
  this.mouseCoordinates = {x: 0, y: 0};
  makeObservable(this, {
    mouseCoordinates: observable,
    updateCoordinates: action
  });
  // 其余初始化逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:06:02