【问题标题】:Why does toJS() return an empty object when applied on observable object? - MobX为什么 toJS() 应用于可观察对象时返回一个空对象? - MobX
【发布时间】:2019-06-12 12:10:33
【问题描述】:

当我对一个可观察对象执行 toJS() 时,我得到一个空对象。在使用 Object.assign() 调用 API 后,我将值分配给 observableObject。现在我在不同商店的 computed 方法中使用这个observableObject,如下面的代码所示。

class Store {
    @observable observableObject = {};

    Fetch(){
        .....
        APIcall()
        .then((response) => {
            Object.assign(this.observableObject, response.data);
        }).catch(...)
    }
    .....
}

class Store2 {

    @computed get computedValue(){

        // return an non empty {Symbol(mobx administration): ObservableObjectAdministration$$1} object
        console.log(this.rootStore.store1.observableObject);

        // returns True
        console.log(isObservable(this.rootStore.store1.observableObject));

        // return an empty object
        console.log(toJS(this.rootStore.store1.observableObject));

    }
}

我已经提到了这个issue,但找不到任何帮助。在下面找到observableObject 的日志。谁能解释一下 toJS() 在 mobx 中的意外行为。

编辑:代理 mobx observable 日志中的目标字段包含所有字段,但 toJS() 转换产生空对象。这是沙盒演示

【问题讨论】:

  • 我写了一个答案,然后意识到它依赖于版本(如果您不使用 v4 或更低版本,则无关紧要)。您能否分享一个完整的最小示例来演示该问题?也许使用codesandbox.io 或类似的。
  • 更新问题请看

标签: reactjs mobx mobx-react jsobject


【解决方案1】:

这只是等待 API 响应足够长的问题。在您的 CodeSandbox 中,一旦 API 调用返回,脚本几乎立即退出,无需等待 MobX 更新任何内容。如果幸运的话,它可能会以足够快的速度完成,让您看到一些控制台输出,但可能不会。

诀窍是等待 API,然后更新存储,然后从中读取计算值:

import { observable, toJS, runInAction, computed } from "mobx";
import axios from "axios";

class Store {
  @observable observableObject = {};
}

const store = new Store();

class Store2 {
  @computed get computedVar() {
    return toJS(store.observableObject);
  }
}

const store2 = new Store2();
console.log("Object before API call:", store2.computedVar);

axios
  .get("https://jsonplaceholder.typicode.com/todos/1")
  .then(response => {
    runInAction(() => {
      Object.assign(store.observableObject, response.data);
    });
  })
  .then(() => {
    console.log("Object after API call:", store2.computedVar);
  })
  .catch(console.error);

【讨论】:

  • 但是为什么目标字段在代理对象中仍然显示正确的输出?
  • 当我在沙箱中运行您的示例时,所有输出都是空的 ({})。如果您看到不同的东西,可能是 API 请求有时返回得足够快以及时更新商店?很难说。
猜你喜欢
  • 2017-07-12
  • 2019-02-18
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 2018-04-11
  • 2019-06-25
  • 1970-01-01
相关资源
最近更新 更多