2017-05-08 78 views
1

什麼是正確的方式來分配值的MobX存儲變量?MobX Store變量賦值

我知道設置數組應該用replace()函數完成,否則常規數組將被分配給變量而不是可觀察數組。

但是對象呢?正確的方法是使用setObject1()或setObject2()?我試過兩種選擇,兩種都可以工作

那麼基元類型和變量如何用null初始化呢?再次定期作業,但它是正確的方式?

class store { 
    @observable array = []; 
    @observable object = {}; 
    @observable primitive = 1; 
    @observable nullObj = null 

    @action setArray = array => { 
    this.array.replace(array) 
    } 

    @action setObject1 = object => { 
    this.object = object 
    } 

    @action setObject2 = object => { 
    this.object = observable(object) 
    } 

    @action setPrimitive = primitive => { 
    this.primitive = primitive 
    } 
} 

回答

2

您應該使用extendObservable,這樣你就不會失去參考原始觀察的對象。

class Store { 
    @observable array = []; 
    @observable object = {}; 
    @observable primitive = 1; 
    @observable nullObj = null 

    @action setObject = object => { 
    extendObservable(this.object, object); 
    } 
} 

如果在新對象的新屬性,這些屬性不會觀察到。如果是這種情況,您可能需要使用observable map。這帶來了在文檔的Common pitfalls & best practices部分:

MobX觀察對象不檢測或反應屬性分配 了未宣佈之前觀察到的。所以MobX可觀察對象 充當預定義鍵的記錄。您可以使用 extendObservable(target, props)向對象引入新的可觀察的 屬性。但是,對象迭代器如for .. inObject.keys()不會對此做出自動反應。如果您需要動態鍵控對象,例如通過ID存儲用戶,請使用 observable.map創建 可觀察_map_s。

+0

我想使用不可變對象並丟失原始可觀察對象,我應該使用this.object = observable(object)還是this.object = object? – Shahaf

+0

@Shahaf我明白了。 MobX本質上是可變的,所以如果你完全替換了引用,那麼觀察對象的所有觀察者將不再工作。 – Tholle