redux-orm
を使用してチャットアプリケーション用の次のモデルを用意しました。各Conversation
は多くのMessages
含まれていますが、一つのメッセージは、単一のConversation
に属することができます:私は、それぞれのメッセージとの会話のリストを取得するには、次のセレクタを使用していredux-ormの配列として1対多のフィールドを取得する方法
export class Message extends Model {
static modelName = 'Message';
static fields = {
id: attr(),
text: attr(),
created: attr(),
from: fk('User'),
conversation: fk('Conversation', 'messages')
};
}
export class Conversation extends Model {
static modelName = 'Conversation';
static fields = {
id: attr(),
created: attr(),
};
}
。
export const getConversations = createSelector(
getOrm,
createOrmSelector(orm, session => {
return session.Conversation
.all()
.toModelArray()
})
);
問題がありますか?各Conversation
インスタンスのmessages
プロパティは、Array
ではなく、QuerySet
であり、tiコンポーネントを渡すときに対処することが困難です。
を
messages.all().toModelArray()
とMessages
の配列に戻されたすべてのConversation
モデルのmessages
プロパティのマッピング:は、ここで私が試したソリューションです。これにより、オブジェクトをクローンしたときでも、エラー
Can't mutate a reverse many-to-one relation
が返されました。完全に新しいプレーンな古いJavaScriptオブジェクトを作成し、すべてのプロパティをコピーしてから、
messages
の正しい値を設定します。これはうまくいきましたが、これらの新しいオブジェクトをすべて作成することは、頻繁な状態変更を伴うアプリケーションでは、大きなパフォーマンスのように思えます。
ここで目標を達成するにはどうすればよいですか?
私はすべて時期尚早な最適化に反対していますが、私のセレクタでこれらの新しいオブジェクトをすべてビルドしないと、パフォーマンスが大幅に低下しますか?特に 'Conversation'に複数の外部キーを追加した場合(特定の' sender'オブジェクトと 'attachment'' one-to-many配列を追加した場合) –
Redux-ORMには、再選択の 'createSelector'のカスタマイズされたバージョンが組み込まれています。 READMEには、その使用例があります:https://github.com/tommikaikkonen/redux-orm#use-with-react。そうすれば、あなたの「出力セレクタ」は、それらの「データベーステーブル」が更新されたときにのみ再計算されます。 – markerikson
@markeriksonはもちろん正しいですが、私はあなたがすでにそれを使用しているのを見ています。しかし、私はパフォーマンスをより詳しく説明する答えを広げます。短い答え:それはまだセレクターのパフォーマンスを心配しないでください。 –