検索

ホームページ  >  に質問  >  本文

セレクターで RTK クエリを使用する方法

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

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

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

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

リーリー

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

リーリー

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

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

P粉729198207P粉729198207452日前876

全員に返信(1)返信します

  • P粉779565855

    P粉7795658552023-12-29 00:13:52

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

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

    リーリー

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

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

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

    リーリー

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

    リーリー

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

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

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

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

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

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

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

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

    返事
    0
  • キャンセル返事