2016-06-28 8 views
5

私はmobxのほとんどを得ているように感じますが、何かを明確にしたいと思います。私はのコアは、オブジェクトの配列(typescriptです)で、いくつかの観測で店を持っている: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... 

私の質問は、その最後の関数である - getClientByUrlName。それは観察可能なものからのものなので、その関数を使用している@ observer反応コンポーネントは正しく再レンダリングされます。このようなことのために、この慣用的なmobxですか?それは計算された値でなければならないと感じます。私はそれを使用したいコンポーネントの計算値ですか?

//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 

ここでは、ベストプラクティスと問題点を探しています。どんな助けもありがとうございます。

*原則として@computedで編集固定コードのサンプルエラー

答えて

7

はMobXを伝えるシンプルなディレクティブです:「この値が変更を使用している観測のいずれかまでキャッシュすることができました」。だから、実際にはそれらは常に省略することができます。それはあなたのアプリがもっと再計算されることを意味するだけですが、結果を変更することはありません。

したがって、ほとんどの場合問題にならない機能には@computedが不足しています。そうである場合は、createTransformerを使用して1つの引数の関数を取り、計算値のmemoizationキャッシュ(自己クリーニング)を構築することができます。しかし、それは少し複雑ですので、実際にはClientDetailsViewに計算されたプロパティを導入するあなたのソリューションは良いです。私は確かにあなたがその計算されたプロパティ(この場合にそれを必要とするコンポーネント)を配置するための素晴らしい場所を持っている限り、それを行うことをお勧めします

+0

ああ、ああ!それは私が行方不明だったようなものでした。私がドキュメントを見回すたびに、私はそれが真新しいかのように一部を見ます。面白いことに、コンポーネント自体に計算されたプロパティを貼り付けることは、私が質問を書いているときに私に来ました。 [オフトピック]私は、一般的に(私はreduxから変換している)一般的にMobXに似ています。それがどのように機能するかを知るほど、私はもっと好きです。すべてのハードワークをありがとう! – Jakke

+0

私は実際に最後の日に文書を再構成しました。その印象は正しいです:) – mweststrate

+0

私は、ストアではなくClientDetailsViewに '@ computed'を置くほうが少し戸惑っています。店内に置いても同じ効果がありますか? – Jeff

関連する問題