更新自身中可观察的mobx存储会导致“无法读取未定义<observable>的属性”

瓦特

我知道类似的问题已经存在。但是,在检查了许多问题之后,我无法找到解决问题的方法。情况如下:

我希望ReportStore以数组的形式从服务器获取数据并将其存储在可观察的映射中。提取部分正常,数据正确发送。当我尝试将值写入requestNewReports方法内部的可观察映射时,会发生问题这是商店代码:

ReportStore.ts

import api from "../api";
import { observable, action, ObservableMap } from "mobx";
import { IReportMetaData } from "../pages/ManagerView/TicketSales";
import { notificationStore } from "./NotificationStore";

export class ReportStore {
  fetchedReports: ObservableMap<number, IReportMetaData>;

  constructor() {
    this.fetchedReports = observable.map({});
  }

  async requestNewReports(fromDate: string = '', toDate: string = '') {
    try {
      const res = await api.get("reports/filtered", {
        params: {
          fromDate: from,
          toDate: to
        }
      });
      res.data.forEach((row: IReportMetaData, index: number) => {
        if (!this.fetchedReports.has(index)) {
          this.fetchedReports.set(index, row);
        }
      });
    } catch (err) {
      return notificationStore.showError(err.message);
    }
  }
}

export const reportStore = new ReportStore();

该商店在被提供app.tsx经由<Provider reportStore={reportStore}>....</Provider>与注入在这样的组件:

export interface ITicketSalesProps {
  reportStore?: ReportStore;
}


export const TicketSales = inject('reportStore')(observer((props: ITicketSalesProps) => {
   // Component logic
}

被这样称呼:

// inside TicketSales
useEffect(() => {
  const { fetchedReports, requestNewReports } = props.reportStore!;
    if (fetchedReports.size === 0) {
      requestNewReports();
    }
  }, []);

我的设置: create-react-app通过npxTypeScript

"mobx": "^5.15.3",
"mobx-react": "^6.1.4",

根据某些问题,问题出在传统装饰器上。但是,根据官方mobx 文件

仅当在create-react-app@^2.1.1中使用TypeScript时才支持装饰器。在较旧的版本中或使用香草JavaScript时,请使用decorate实用程序,弹出或custom-cra软件包。

这似乎正是我的情况。

因此,我不知道为什么会被破坏...我什至试图弹出并尝试babel插件,如在某些问题中所建议的:

{
  "plugins": [
    ["@babel/plugin-proposal-decorators", { "legacy": true }],
    ["@babel/plugin-proposal-class-properties", { "loose" : true }]
  ]
}

但是没有成功。

任何帮助,将不胜感激。

提前致谢!

凯夫

我认为此问题通常来自您的JavaScript代码,而不是来自mobx。

从这里我可以读到的requestNewReports()不是绑定方法在您的组件中,您可以对商店进行解构,然后将requestNewReports分配给新变量,因此"this"不再是您的商店。因此,您将遇到“未定义”错误。

您可以将其更改为:

// inside TicketSales
useEffect(() => {
  const {reportStore} = props
  if (reportStore.fetchedReports.size === 0) {
    reportStore.requestNewReports();
  }
}, []);

或者,您可以将方法绑定到实例,例如:

...
  constructor() {
    this.fetchedReports = observable.map({});
    this.requestNewReports = this.requestNewReports.bind(this)
  }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

类型错误:无法读取 Redux-Observable 中未定义的属性“管道”

使用 Angular Observable:无法读取未定义的属性(读取“foo”)

页面刷新时无法读取mergeMap Observable 上未定义的属性“订阅”

使用类验证器中的 @MinDate 会导致 TypeError:无法读取未定义的属性“getTime”?

导致无法读取未定义的属性

角5-可观察到的返回错误无法读取未定义的属性

可观察到的类型错误:无法读取未定义的属性

Angular2可观察到的问题,无法读取未定义的属性“订阅”

无法读取Javascript类中未定义的属性“存储”

无法读取未定义的属性“更新”

在Angular模板中渲染Observable对象属性

引用data-bind属性中的observable

类型“ Observable <IProduct []>”中缺少属性“ includes”

类型“ Observable <any []>”中缺少属性“ map”

从 Observable 中获取对象属性的值

MobX React TypeError:无法读取未定义的属性

mobx-react-lite:无法读取未定义的属性

mobX:TypeError:无法读取未定义的属性

使用Highcharts格式化程序会导致无法读取未定义的属性“ length”

使用 getInitialProps 会导致 TypeError:无法读取未定义的属性“地图”

调用组件会导致无法读取未定义的属性“ map”

Angular2-单元测试可观察到的错误“无法读取未定义的属性'subscribe'”

$ httpprovider导致“无法读取未定义的属性'headers'”错误

将 redux-observable 集成到现有项目中 - 未捕获的类型错误:无法读取未定义的属性“应用”

更新到 Angular 9 后构建项目导致错误“无法读取未定义的属性‘长度’

可观察变量的Angular2 Observable.forkJoin-ReferenceError:未定义可观察

Redux存储中的“无法读取未定义的属性'类型'的未定义”,用于外部包中定义的操作

Angular observable 订阅属性

无法读取未定义的属性(读取 *)