2016-06-28 18 views
5

Ich fühle mich wie ich bekomme die meisten Mobx, aber ich möchte etwas klären. Ich habe ein Geschäft mit einigen Observablen bekam, dessen Kern ein Array von Objekten (Typoskript):Wann ich berechnen/Observables in Mobx

class ClientStore { 
    constructor() { 
     this.loadClients(); 
    } 

    @observable private _clients: IClient[] = []; 
    @computed get clients() { 
     return this._clients; 
    } 
    @observable isFetching: boolean = false; 
    @observable sortField: 'title' | 'modified' = 'modified'; 
    @observable sortDescending: boolean = true; 

    getClientByUrlName(urlName: string): IClient { 
     return this._clients.find(c => c.urlName === urlName); 
    } 
etc... 

Meine Frage ist die letzte Funktion - getClientByUrlName. Da dies von einem beobachtbaren Objekt aus erfolgt, wird jede @observer-Reaktionskomponente, die diese Funktion verwendet, korrekt neu gerendert. Ist das idiomatische Mobx für so etwas? Es fühlt sich an, als ob das ein berechneter Wert sein sollte. Soll ich einen berechneten Wert in der Komponente angeben, die ihn verwenden möchte?

//import singletone ClientStore 
class ClientDetailsView extends React.Component<{params:{urlName:string}}, void> { 

    @computed get client() { 
     return ClientSotre.clients.find(c => c.urlName === this.props.params.urlName); 
    } 

...rest of react component 

Ich bin auf der Suche nach Best Practices und Gotchas hier. Jede Hilfe wird geschätzt.

* edit festes Codebeispiel Fehler

Antwort

7

Grundsätzlich @computed einfach ist eine Richtlinie, die MobX sagt: „Dieser Wert konnte bis einer der beobachtbaren zwischengespeichert werden, die Änderungen verwendet wird“. In der Tat können sie immer weggelassen werden, es bedeutet nur, dass Ihre App mehr berechnet, aber es ändert nichts an den Ergebnissen.

Also, wenn Sie fehlen @computed auf die Funktion, die in den meisten Fällen im Prinzip kein Problem ist. Wenn dies der Fall ist, können Sie createTransformer verwenden, das eine Einargumentfunktion verwendet und einen (selbstreinigenden) Memo-Cache von berechneten Werten erstellt. Aber es ist ein bisschen mehr beteiligt, also ist Ihre Lösung, eine berechnete Eigenschaft in Ihrem ClientDetailsView einzuführen, netter. Ich würde in der Tat empfehlen, das zu tun, solange Sie einen schönen Platz haben, um diese berechnete Eigenschaft zu setzen (die Komponente, die es in diesem Fall braucht)

+0

Ah hah! Das schien wie ein Stück, das ich vermisste. Jedes Mal, wenn ich die Dokumente durchgehe, sehe ich ein Teil, als wäre es ganz neu. Komisch, dass das Verfolgen der berechneten Eigenschaft in der Komponente selbst zu mir kam, als ich die Frage schrieb. [Off Topic] Ich bin wirklich wie MobX im Allgemeinen (ich konvertiere von Redux). Je mehr ich lerne, wie es funktioniert, desto mehr mag ich es. Danke für die harte Arbeit! – Jakke

+0

Ich habe die Dokumente in den letzten Tagen tatsächlich ein wenig umstrukturiert, so dass der Eindruck stimmt :) – mweststrate

+0

Ich bin etwas verwirrt, warum es besser wäre, das '@ calculated' in die ClientDetailsView anstatt in den Speicher zu legen. Würde es den gleichen Effekt haben, wenn man es in den Laden legt? – Jeff