私は、next.js アプリケーションで react-query を使用して、データの取得と更新の基本的な実装を実装しました。 私の目標は、突然変異後にデータを更新することです。 現在、データはタブが更新された場合にのみ更新されます。しかし、ユーザーの介入がなければそれは変わりません。
タブの更新時に発生するデータ更新は、refetchOnWindowFocus
のデフォルト動作によるものであることがわかりました。
しかし、サーバー側でデータが更新された後、どのようにして無効になるのでしょうか? 関連するコードスニペットは次のとおりです。
注: react-query SSR 機能を使用するために Hydration を使用しています。書類###
_app.jsxリーリー
ホーム.jsxリーリー
記事.jsxリーリー
どんな助けでも大歓迎です
Update: refetchInterval:20002 秒ごとに更新しますが、これにより 2 秒ごとにネットワーク リクエストがトリガーされるため、これが再検証のベスト プラクティスであるかどうかはわかりません。
UPDATE: onSuccess メソッド内のコンソールにミューテーションが表示されています。これは、キーが異なっていても機能するはずなので、ロジックに問題があることを意味します。
queryClient .invalidateQueries() ここではキーを指定しませんでしたが、すべてのクエリをトリガーしました。
しかし、それでも更新されません。なぜ?
ミューテーションを実装する方法では、ミューテーションが成功した後にクエリを再フェッチする必要があります:
リーリーこれが機能しない場合は、突然変異は失敗しています。
onSuccess
コールバックが呼び出されているかどうかを確認します。
リーリーonSuccess
コールバックが呼び出されても、クエリが再フェッチされない場合は、queryKey
が一致しないことを意味している可能性があります。テスト目的で、フィルターを次のように拡張してみてください:すべての クエリを再フェッチする必要があります。機能する場合は、queryKey
注意して見てください、あなたは失敗しています:フィルターが一致しないことがわかります。
リーリー
ただし、カスタムフックでは次のように使用しています:リーリー
つまり、これらは実際には異なっているため、一致していないようです。また、キャッシュ内のクエリとキーをよりよく理解するために、@tanstack/react-query-devtools
を必ず使用してください。
問題は、コンポーネント
Article.jsx
でレンダリングのたびに新しい QueryClient を作成するため、新しいキャッシュが取得され、更新されないことです。代わりに、現在のインスタンスを返す
useQueryClient
フックを使用する必要があります。const queryClient = useQueryClient();