セレクターで RTK クエリを使用する方法
P粉729198207
P粉729198207 2023-12-28 11:46:38
0
1
828

Redux ToolkitRTK Query を使用してプロジェクトを構築し、API からいくつかのエントリを取得しようとしています。 createEntityAdapter のデータの正規化メソッドを使用しています。特定のコンポーネントではデータを配列として必要とするため、最終的にセレクターを使用することになりました。ここで私の問題は、フィルターをクエリのパラメーターとして追加したため、セレクターが機能しなくなったことです。

「パラメーターを指定して RTK クエリ セレクターを使用する方法は?」などの同様の質問をここで調べましたが、私は愚かすぎて何を変更すればよいのか理解できませんでした。 RTK クエリのドキュメントを理解しようとしていますが、理解できません。

上記の質問から、何を選択するかを正確に知るためにセレクターにもパラメーターが必要であること、およびこれが推奨されるパターンではないことはわかっていますが、それを機能させる方法が理解できません。

私のエントリースライス:

リーリー

これを Entries コンポーネントで次のように使用します

リーリー

注: get クエリから「フィルター」を削除すると、すべてが以前と同じように機能します (もちろん、予想どおり)。

免責事項: 一体何をしているのか全く分かりません。ドキュメントを読んで理解しようとしているところですので、フィードバックをいただければ幸いです。 ありがとう!

P粉729198207
P粉729198207

全員に返信(1)
P粉779565855

はい、これはややデリケートなトピックです。RTKQ のドキュメントでは最も単純な例、つまりパラメーターをまったく使用しないクエリが示される傾向があるためです。私自身もたくさんの問題を抱えてきました。

とにかく、selectEntryResult を 2 つのパラメーター (state と params) を持つ関数として宣言しました。次に、その下にアダプター セレクターを作成するときに、state という 1 つのパラメーターのみを使用してそれを呼び出します。また、コンポーネント内で次のように最後のセレクターを使用する場合:

リーリー

パラメータはどこにも見つかりません。デフォルトでは 未定義です し、そのようなクエリ パラメータに関連付けられたデータも見つかりません。

ここで理解すべき重要なことは、実際には何らかの方法でセレクターの各レベル (各ラッパー) にクエリ パラメーターを渡す必要があるということです。

ここでの 1 つの方法は、セレクターを通じてパラメーターを「転送」することです:

リーリー

ここでは、RTK からエクスポートされた createSelector 関数を使用します。次に、コンポーネントで次のようなことを行います:

リーリー

これは、エンティティ アダプターによって作成された selectAll セレクターを使用する場合は機能しますが、selectById を使用する場合、そのセレクターもパラメーター化されているため、問題が発生します。つまり、selectById セレクターは、取得するエンティティ ID の 2 番目の引数を取るように内部で定義されていますが、私が示したメソッドでは 2 番目の引数を使用してクエリ パラメーター ( のフィルター フィルター) を渡します。場合)。

私の知る限り、完璧に機能し、次のすべてをカバーするソリューションはこれまでのところありません。

    エンティティ正規化を使用する
  • セレクターを使用してデータを取得する
  • パラメータ化されたクエリを使用する
別のアプローチとしては、クエリ パラメーターの特定の組み合わせに対してベース セレクターを動的に作成するいくつかのセレクター ファクトリを作成することも考えられます。

私はかつて、あらゆる状況で使用できるこのようなラッパーを作成したことがあります。残念ながらプライベート パッケージなので共有できませんが、基本的な考え方は、

selectByIdselectAll (および他のすべてのセレクター) の両方が正しく動作するようにパラメーターを変更することです。クエリ パラメーターを 3 番目のパラメーターとしてセレクターに渡し、各エンティティ アダプター セレクターをさらにラップします: リーリー

これは複雑に聞こえると思いますし、私もほとんど機能させたことがないので、この方向には進まないようにしてください :)

途中で見つけた役立つ記事は

こちら また、コンポーネント レベルでセレクターを作成し、それを記憶するいくつかの方法についても説明されていますが、まだすべてを試したわけではありません。ご覧ください。特定の問題を解決する簡単な方法が見つかるかもしれません。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート