質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

1回答

392閲覧

Next.jsでページ遷移した際、APIが無駄に叩かれる

Nero1129

総合スコア130

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2023/04/12 07:44

事象

現在、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/ツールのバージョンなど)

packageversion
Next.jsv13(TypeScript)
Recoil.jsv0.7.6
react-queryv3.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

こちらに記載のあるprefetchで解決する可能性があります。

js

1<Link href="/example" prefetch={false}> 2 <a>リンク</a> 3</Link>

投稿2023/04/12 14:31

pippi19

総合スコア679

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問