Redux Toolkit と RTK Query を使用してプロジェクトを構築し、API からいくつかのエントリを取得しようとしています。 createEntityAdapter のデータの正規化メソッドを使用しています。特定のコンポーネントではデータを配列として必要とするため、最終的にセレクターを使用することになりました。ここで私の問題は、フィルターをクエリのパラメーターとして追加したため、セレクターが機能しなくなったことです。
「パラメーターを指定して RTK クエリ セレクターを使用する方法は?」などの同様の質問をここで調べましたが、私は愚かすぎて何を変更すればよいのか理解できませんでした。 RTK クエリのドキュメントを理解しようとしていますが、理解できません。上記の質問から、何を選択するかを正確に知るためにセレクターにもパラメーターが必要であること、およびこれが推奨されるパターンではないことはわかっていますが、それを機能させる方法が理解できません。
私のエントリースライス:
リーリー
これを Entries コンポーネントで次のように使用しますリーリー
注: get クエリから「フィルター」を削除すると、すべてが以前と同じように機能します (もちろん、予想どおり)。免責事項: 一体何をしているのか全く分かりません。ドキュメントを読んで理解しようとしているところですので、フィードバックをいただければ幸いです。 ありがとう!
はい、これはややデリケートなトピックです。RTKQ のドキュメントでは最も単純な例、つまりパラメーターをまったく使用しないクエリが示される傾向があるためです。私自身もたくさんの問題を抱えてきました。
とにかく、
リーリーselectEntryResult
を 2 つのパラメーター (state と params) を持つ関数として宣言しました。次に、その下にアダプター セレクターを作成するときに、state という 1 つのパラメーターのみを使用してそれを呼び出します。また、コンポーネント内で次のように最後のセレクターを使用する場合:パラメータはどこにも見つかりません。デフォルトでは
未定義です
し、そのようなクエリ パラメータに関連付けられたデータも見つかりません。ここで理解すべき重要なことは、実際には何らかの方法でセレクターの各レベル (各ラッパー) にクエリ パラメーターを渡す必要があるということです。
ここでの 1 つの方法は、セレクターを通じてパラメーターを「転送」することです:
リーリーここでは、RTK からエクスポートされた
リーリーcreateSelector
関数を使用します。次に、コンポーネントで次のようなことを行います:これは、エンティティ アダプターによって作成された
selectAll
セレクターを使用する場合は機能しますが、selectById
を使用する場合、そのセレクターもパラメーター化されているため、問題が発生します。つまり、selectById
セレクターは、取得するエンティティ ID の 2 番目の引数を取るように内部で定義されていますが、私が示したメソッドでは 2 番目の引数を使用してクエリ パラメーター ( のフィルター フィルター) を渡します。場合)。私の知る限り、完璧に機能し、次のすべてをカバーするソリューションはこれまでのところありません。
エンティティ正規化を使用する-
セレクターを使用してデータを取得する-
パラメータ化されたクエリを使用する-
別のアプローチとしては、クエリ パラメーターの特定の組み合わせに対してベース セレクターを動的に作成するいくつかのセレクター ファクトリを作成することも考えられます。selectById
これは複雑に聞こえると思いますし、私もほとんど機能させたことがないので、この方向には進まないようにしてください :)と
selectAll(および他のすべてのセレクター) の両方が正しく動作するようにパラメーターを変更することです。クエリ パラメーターを 3 番目のパラメーターとしてセレクターに渡し、各エンティティ アダプター セレクターをさらにラップします:
リーリーこちら また、コンポーネント レベルでセレクターを作成し、それを記憶するいくつかの方法についても説明されていますが、まだすべてを試したわけではありません。ご覧ください。特定の問題を解決する簡単な方法が見つかるかもしれません。