Mobx可观察的深层物体

Mobx observable deep object

本文关键字:观察 Mobx      更新时间:2023-09-26

我在寻找如何在深度json对象结构(例如树)上实现@observable的最佳解决方案,数据树可能会非常深入。每个节点有许多属性,但我只需要观察树节点中的一个属性。只要我做

@observable questionnaire = {}

它工作,但我认为那是腰部。我只需要观察"选定"属性。这是json结构。如果我错了,请指正,这里是问卷对象的简化。

[
  {
    "id": "1",
    "title": "level 1",
    "description": "text",
    "type": "Question",
    "selected": false,
    "childNodes": [
      {
        "title": "level 2",
        "description": "text",
        "type": "Question",
        "selected": false,
        "childNodes": [
          {
            "title": "level 3",
            "description": null,
            "type": "Question",
            "selected": false,
            "childNodes": [
              {
                "title": "level 4 1",
                "childNodes": [],
                "description": null,
                "type": "Checkbox",
                "selected": false
              },
              {
                "title": "level 4 2",
                "childNodes": [],
                "description": null,
                "type": "Checkbox",
                "selected": false
              },
              {
                "title": "level 4 3",
                "childNodes": [],
                "description": null,
                "type": "Checkbox",
                "selected": false
              },
              ...
            ]
          }, ...

一种方法是有一个Node类实现如下:

class Node {
  @observable selected = false;
  @observable childNodes = asFlat([]);
  constructor(data) {
    // Recursively create `Node` objects for all children.
    data.childNodes = data.childNodes.map(child => new Node(child));
    Object.assign(this, data);
  }
}

然后从你的顶级json对象中创建一个Node对象:new Node(json) .

此溶液将只观察selectedchildNodes。这并不理想,因为您需要将json对象包装在Node对象中。但是我想不出别的办法来。