当此查询错误时,MobX将显示先前查询的结果

当从API检索数据以在启用MobX的React页面上呈现时发生超时错误时,我看到的是显示上一次成功查询的结果,而不是所需的数据(或空数据)。具体来说,这些步骤是:

  1. 输入需要一个项目ID才能从数据库检索结果并将查询结果置于显示状态的页面
  2. 返回,进入带有新ID的同一页面,此请求超时。我没有看到任何错误或错误,而是看到了步骤1的结果,即错误的项目数据。

这是在整个网站范围内发生的,我需要可以在任何地方实施的修复程序。以下是我为解决此问题而在一页上编写的一些代码,但是此模式需要复制到应用程序的每个商店中。我不确定这是否是正确的解决方案,因为它可以通过跟踪项ID并在发生更改时清空所有可观察对象来工作-感觉就像MobX应该做的一样,所以我担心我的解决方案是反模式。 / p>

是否有比我在下面介绍的解决方案更好的解决方案?

class SupplierUtilizationStore {
    @observable key = 0; //supplierId
    utilizationSearchStore = new SearchStateStore();
    @observable utilizationSearchResults = [];
    @observable selectedChartType = 'ByMonth';
    @observable supplierUsageForChart = {};
    @observable utilizationSummaryData = {};

    constructor(rootStore,dataLayer) {
        this.rootStore = rootStore;
        rootStore.supplierStore = this;
        this.db = dataLayer;

        this.initUtilizationSearchStore();
    }

    initUtilizationSearchStore() {
        this.utilizationSearchStore.searchResultsTotalUnitCost = observable({});
        this.utilizationSearchStore.searchResultsTotalCost = observable({});
        this.utilizationSearchStore.searchResultsTotalQty = observable({});
        this.utilizationSearchStore.supplierId = observable({});
    }

    //Call this in componentDidmount()
    @action
    initStore(key) {
        if (key !== this.key) {
            this.utilizationSearchStore = new SearchStateStore();
            this.initUtilizationSearchStore();
            this.utilizationSearchResults = [];
            this.selectedChartType = 'ByMonth';
            this.supplierUsageForChart = {};
            this.utilizationSummaryData = {};
            this.utilizationSearchStore.supplierId = key;
            this.key = key;
        }
    }

...
}
nhzjc 回答:当此查询错误时,MobX将显示先前查询的结果

  1. 据我了解,“键”是id,该值取决于用户操作。因此,您可以在打开页面时进行更改,并观察更改以重置所有值。

  2. 对我来说,重置/初始化另一个对象的每个单个值似乎不正确。而是在确切的对象中创建用于执行此操作的方法(SearchStateStore应该具有自己的init方法)。

  3. 我没有更改那部分,但是我不确定将根存储传递给子存储并将子存储分配给自身内部的父存储也是正确的体系结构行为(这不是主信息)问题。只是您可以想到的东西)

毕竟代码如下:

class SupplierUtilizationStore {
    @observable key = 0; //supplierId
    utilizationSearchStore;
    @observable utilizationSearchResults;
    @observable selectedChartType = 'ByMonth';
    @observable supplierUsageForChart;
    @observable utilizationSummaryData;

    constructor(rootStore: any,dataLayer:any) {
        this.rootStore = rootStore;
        rootStore.supplierStore = this;
        this.db = dataLayer;

        this.initStore();

        observe(this.key,()=>{ this.initStore() });
    }

    @action
    initStore() {
            this.utilizationSearchStore = new SearchStateStore();
            this.utilizationSearchStore.init(); // all logic for initialization should be in the concrete store
            this.utilizationSearchResults = [];
            this.selectedChartType = 'ByMonth';
            this.supplierUsageForChart = {};
            this.utilizationSummaryData = {};
            this.utilizationSearchStore.supplierId = this.key; 
        }
    }
 ...
}

通过这种方式,您不必与商店互动,也不必告诉它何时进行初始化/重置。只需从react组件更改可观察到的“键”值,商店就会知道该怎么做。

本文链接:https://www.f2er.com/3137465.html

大家都在问