React-TanStack-Query を Next.js で次のレベルに引き上げる
従来の fetch useState useEffect
アプローチを React-TanStack-Query に置き換えることについての以前の議論を思い出してください。 QueryProvider
の設定、基本的なクエリの作成、突然変異の処理などの基本を使用している場合は、おそらくすでにその利点を経験しているでしょう。 ただし、私たちはその機能の探索を始めたばかりです。
データの取得を大幅に強化し、アプリケーションのパフォーマンスを「良好」から「非常に高速」に変える高度なテクニックをさらに深く掘り下げてみましょう。
より強力な基盤を構築する
前のガイドでは、React-TanStack-Query を使用した基本的な映画リストを示しました。
const { data: movies, error, isLoading } = useQuery(['movies'], fetchMovies);
これは素晴らしい出発点ですが、Netflix レベルの応答性を目指す場合はどうなるでしょうか? 技術を高めていきましょう。
優れたパフォーマンスのための高度なテクニック
1.インテリジェントなプリフェッチ (Netflix のような速度を実現)
最初の映画リストでは、ユーザーはクリック後に待つ必要がありました。これを大幅に改善できます:
// components/MovieList.jsx import { useQueryClient } from '@tanstack/react-query'; export default function MovieList() { const queryClient = useQueryClient(); // Leveraging our existing fetchMovies function const prefetchMovie = async (movieId) => { await queryClient.prefetchQuery({ queryKey: ['movie', movieId], queryFn: () => fetchMovieDetails(movieId), // Maintain freshness for 5 minutes staleTime: 5 * 60 * 1000, }); }; return ( <div className="grid grid-cols-4 gap-4"> {movies.map(movie => ( <div key={movie.id} onMouseEnter={() => prefetchMovie(movie.id)} className="movie-card" > {movie.title} </div> ))} </div> ); }
ユーザーがムービーの上にマウスを移動すると、詳細が事前に読み込まれ、クリックするとすぐにアクセスできるようになりました。 ✨
2.突然変異の強化 (覚えていますか?)
私たちの最初の記事では、基本的な突然変異について説明しました。楽観的な更新でそれらを最適化しましょう:
// hooks/useUpdateMovie.js export function useUpdateMovie() { const queryClient = useQueryClient(); return useMutation({ mutationFn: updateMovie, // The key improvement onMutate: async (newMovie) => { // Halt ongoing refetches await queryClient.cancelQueries(['movie', newMovie.id]); // Store current state (for rollback if needed) const previousMovie = queryClient.getQueryData(['movie', newMovie.id]); // Immediate (optimistic) update queryClient.setQueryData(['movie', newMovie.id], newMovie); return { previousMovie }; }, // Error handling onError: (err, newMovie, context) => { queryClient.setQueryData( ['movie', newMovie.id], context.previousMovie ); }, }); }
3.並列データロード (無駄な待ち時間をなくす)
順次読み込みは過去のものです:
// pages/movie/[id].js export default function MoviePage({ movieId }) { const results = useQueries({ queries: [ { queryKey: ['movie', movieId], queryFn: () => fetchMovie(movieId), }, { queryKey: ['cast', movieId], queryFn: () => fetchCast(movieId), }, { queryKey: ['reviews', movieId], queryFn: () => fetchReviews(movieId), }, ], }); if (results.some(result => result.isLoading)) { return <LoadingSpinner />; } const [movie, cast, reviews] = results.map(r => r.data); return <MovieDetails cast={cast} movie={movie} reviews={reviews} />; }
4.無限スクロールの実装 (効率的な方法)
ページ分割された例をシームレスな無限スクロールにアップグレードしてみましょう:
// components/InfiniteMovieList.jsx import { useInfiniteQuery } from '@tanstack/react-query'; import { useInView } from 'react-intersection-observer'; export default function InfiniteMovieList() { const { ref, inView } = useInView(); const { data, fetchNextPage, hasNextPage, isFetchingNextPage, } = useInfiniteQuery({ queryKey: ['movies'], queryFn: fetchMoviePage, getNextPageParam: (lastPage) => lastPage.nextCursor, }); useEffect(() => { if (inView && hasNextPage) { fetchNextPage(); } }, [inView, hasNextPage]); return ( <div> {data.pages.map((page) => ( page.movies.map((movie) => ( <MovieCard key={movie.id} movie={movie} /> )) ))} <div ref={ref}> {isFetchingNextPage ? <LoadingSpinner /> : null} </div> </div> ); }
5. Next.js 14 サーバー コンポーネントの活用
これは、最初の記事「Next.js 14 サーバー コンポーネントの統合」では利用できない機能です。
const { data: movies, error, isLoading } = useQuery(['movies'], fetchMovies);
プロのヒント (教訓)
- 一貫したクエリ キー: 映画のクエリ キーを調整します:
// components/MovieList.jsx import { useQueryClient } from '@tanstack/react-query'; export default function MovieList() { const queryClient = useQueryClient(); // Leveraging our existing fetchMovies function const prefetchMovie = async (movieId) => { await queryClient.prefetchQuery({ queryKey: ['movie', movieId], queryFn: () => fetchMovieDetails(movieId), // Maintain freshness for 5 minutes staleTime: 5 * 60 * 1000, }); }; return ( <div className="grid grid-cols-4 gap-4"> {movies.map(movie => ( <div key={movie.id} onMouseEnter={() => prefetchMovie(movie.id)} className="movie-card" > {movie.title} </div> ))} </div> ); }
- インテリジェントな再フェッチ: ウィンドウ フォーカスでの基本的な再フェッチを改善します:
// hooks/useUpdateMovie.js export function useUpdateMovie() { const queryClient = useQueryClient(); return useMutation({ mutationFn: updateMovie, // The key improvement onMutate: async (newMovie) => { // Halt ongoing refetches await queryClient.cancelQueries(['movie', newMovie.id]); // Store current state (for rollback if needed) const previousMovie = queryClient.getQueryData(['movie', newMovie.id]); // Immediate (optimistic) update queryClient.setQueryData(['movie', newMovie.id], newMovie); return { previousMovie }; }, // Error handling onError: (err, newMovie, context) => { queryClient.setQueryData( ['movie', newMovie.id], context.previousMovie ); }, }); }
- 堅牢なエラー処理: 基本的なエラー処理を強化します:
// pages/movie/[id].js export default function MoviePage({ movieId }) { const results = useQueries({ queries: [ { queryKey: ['movie', movieId], queryFn: () => fetchMovie(movieId), }, { queryKey: ['cast', movieId], queryFn: () => fetchCast(movieId), }, { queryKey: ['reviews', movieId], queryFn: () => fetchReviews(movieId), }, ], }); if (results.some(result => result.isLoading)) { return <LoadingSpinner />; } const [movie, cast, reviews] = results.map(r => r.data); return <MovieDetails cast={cast} movie={movie} reviews={reviews} />; }
適切なテクニックの選択
- 基本的なクエリ (最初の記事より): 単純なデータの取得に最適です。
- プリフェッチ: ユーザーのアクションが予測可能な場合に最適です。
- 並列クエリ: 複数の独立したデータセットが必要な場合に使用します。
- 無限クエリ: スクロール可能な長いリストに適しています。
- 楽観的なアップデート: 瞬時のユーザー エクスペリエンスを実現します。
結論
初期設定から大幅に進歩しました!これらの機能強化は、真に優れたユーザー エクスペリエンスを作成するために非常に重要です。
すべてを一度に実装する必要はないことに注意してください。基本から始めて、必要に応じてこれらの最適化を段階的に組み込んでいきます。
次回誰かがあなたのアプリケーションの速度についてコメントするとき、あなたはそれがなぜそれほど素晴らしいのかを正確に知ることになるでしょう。 ?
コーディングを楽しんでください! React-TanStack-Query は無限の可能性を提供します。次は何を調べましょう?
以上がReact-TanStack-Query を Next.js で次のレベルに引き上げるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。

この記事では、ブラウザでJavaScriptのパフォーマンスを最適化するための戦略について説明し、実行時間の短縮、ページの負荷速度への影響を最小限に抑えることに焦点を当てています。

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

この記事では、ブラウザ開発者ツールを使用した効果的なJavaScriptデバッグについて説明し、ブレークポイントの設定、コンソールの使用、パフォーマンスの分析に焦点を当てています。

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

この記事では、ソースマップを使用して、元のコードにマッピングすることにより、Minified JavaScriptをデバッグする方法について説明します。ソースマップの有効化、ブレークポイントの設定、Chrome DevtoolsやWebpackなどのツールの使用について説明します。

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...
