監視可能なオブジェクトでtoJS()を実行すると、空のオブジェクトが取得されます。Object.assign()observableObject
を使用してAPI呼び出しの後に値を割り当てています。今、私はこれを使用していますで計算され、次のコードに示すように、異なる店舗の方法。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));
}
}
この問題について言及しましたが、助けが見つかりませんでした。observableObject
以下のログを見つけてください。誰もが予想外のbheviour説明できtoJS()
mobxでは。
編集:プロキシmobx observableのログのターゲットフィールドにはすべてのフィールドが含まれていますが、toJS()変換では空のオブジェクトが生成されます。これがサンドボックスのデモです
これは、APIの応答を十分に待つという問題です。CodeSandboxでは、MobXが何かを更新するのを待たずに、API呼び出しが戻るとすぐにスクリプトが終了します。運が良ければ、コンソール出力を見るのに十分な速さで終了するかもしれませんが、おそらくそうではありません。
秘訣は、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);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加