Mobxのほとんどを手に入れているような気がしますが、何かを明確にしたいと思います。いくつかのオブザーバブルを含むストアがあり、そのコアはオブジェクトの配列(TypeScript)です。
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です。これはobservableからの検出であるため、その関数を使用している@observerreactコンポーネントは正しく再レンダリングされます。この慣用的な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
は、MobXに次のように指示する単純なディレクティブです。「この値could使用されるオブザーバブルのいずれかが変更されるまでキャッシュされます」。したがって、実際には、いつでも省略できます。つまり、アプリがより多く再計算することを意味しますが、結果は変わりません。
したがって、不足している場合は@computed
原則としてほとんどの場合問題にならない機能について。そうである場合は、createTransformer
を使用できます。これは、1つの引数の関数を取り、計算値の(セルフクリーニング)メモ化キャッシュを構築します。しかし、それはもう少し複雑なので、実際には、ClientDetailsView
に計算されたプロパティを導入するソリューションの方が優れています。計算されたプロパティ(この場合はそれを必要とするコンポーネント)を配置するのに適した場所がある限り、これを行うことをお勧めします。