事象
現在、Next.jsで商品管理のCMSを作成しています。
next/linkを使って、TOPページから、商品一覧や、商品詳細に遷移した時、ブラウザからフォーカスを当てると毎回APIを叩いてしまう事象が発生しています。
直パスや、遷移後にリロードした場合には、起きません。
故に、なにか依存配列の変更があるなどの、基本的な問題ではないと断定
推察
原因を探ったところ、おそらく、next/linkを使用して、マウント・アンマウントを自動的に行っているので、それが全体の変更とみなされ実行されてるのではないかと推察しています。
質問
上記の問題を解決する方法はないでしょうか?
個人的に考えている解決方法としては、useStateを使用し、マウント時にuseStateに取得したデータを格納
useEffectでuseStateがnullのときのみ、APIでデータを取得するように変更が妥当な解決方法なのかなと考えていますが、API毎に、useEffectとuseStateの記述が必要なので、もっと簡単な解決方法があれば知りたいです。
該当のソースコード
js
1// API 2export const getProductListApi =async (authParam: authInterface, page: number) => { 3 4 // apiClientはaxiosのWrapper 5 const response = await apiClient.get(API_PRODUCT, { 6 headers: { 7 'access-token': authParam.accessToken, 8 'uid': authParam.uid, 9 'client': authParam.client, 10 }, 11 params: { 12 page 13 } 14 }) 15 16 return response 17} 18 19// API Hooks 20export const useProductList = (page: number) => { 21 const [auth] = useRecoilState(authState); 22 // ここでuseStateにデータを格納 23 // authに変更があった場合にのみ、refetchするようにuseEffectを書くのが正解? 24 return useQuery<any, Error>(['productList'], () => getProductListApi(auth as authInterface, page), {retry: 0}); 25}; 26 27// レンダリング 28const ProductList = memo(function ProductListContents() { 29 const { data, isLoading, isError, error, refetch } = useProductList(productListPageNumber); 30 31 return( 32 {data & data.map((item, index) => { 33 <li key={index}>data.name</li> 34 })} 35 ) 36)};
補足情報(FW/ツールのバージョンなど)
package | version |
---|---|
Next.js | v13(TypeScript) |
Recoil.js | v0.7.6 |
react-query | v3.3 |

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。