0Pricing
Frontend Academy · บทเรียน

SWR และ React Query สำหรับแคชข้อมูล

ใช้ SWR หรือ TanStack Query เพื่อดึงข้อมูล แคชข้อมูล กำจัดการดึงข้อมูลซ้ำ และตรวจสอบข้อมูลเซิร์ฟเวอร์ใหม่ แทนรูปแบบการดึงข้อมูลด้วย useEffect แบบทำเอง

SWR และ React Query สำหรับแคชข้อมูล เป็นบทเรียน Frontend Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Frontend Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Frontend Academy มีบทเรียนทั้งหมด 4 บทเรียน

สถานะจากเซิร์ฟเวอร์แตกต่างออกไป

ข้อมูลจากเครือข่ายไม่ใช่เพียงสถานะทั่วไป แต่ต้องมีการแคช การตัดคำขอซ้ำ การรีเฟรชเบื้องหลัง การติดตามสถานะกำลังโหลดหรือข้อผิดพลาด และการลองใหม่ รูปแบบการดึงข้อมูลด้วย useEffect + useState แบบทำเองมักนำสิ่งเหล่านี้มาเขียนใหม่ได้ไม่ดี

SWR เทียบกับ TanStack Query

SWR (Vercel): ขนาดเล็ก เรียบง่าย และใช้ฮุกเท่านั้น TanStack Query (เดิมชื่อ React Query): ขนาดใหญ่กว่าและมีฟีเจอร์มากกว่า (การเปลี่ยนแปลงข้อมูล การโหลดแบบไม่สิ้นสุด การดึงข้อมูลล่วงหน้า และเครื่องมือสำหรับนักพัฒนา) ทั้งสองตัวมีคุณภาพยอดเยี่ยม

SWR — การใช้งานพื้นฐาน

useSWR(key, fetcher) ส่งคืนข้อมูล ข้อผิดพลาด และสถานะกำลังโหลด โดยแคชตามคีย์และตัดคำขอซ้ำระหว่างคอมโพเนนต์

import useSWR from 'swr';

const fetcher = (url) => fetch(url).then(r => r.json());

function Profile() {
  const { data, error, isLoading } = useSWR('/api/me', fetcher);

  if (error) return <ErrorMessage error={error} />;
  if (isLoading) return <Spinner />;
  return <h1>{data.name}</h1>;
}

SWR — ลักษณะการตรวจสอบข้อมูลใหม่

โดยค่าเริ่มต้น SWR จะตรวจสอบข้อมูลใหม่เมื่อกลับมาอยู่ในโฟกัส (แท็บกลับมาอยู่ในโฟกัส) และเมื่อเชื่อมต่อใหม่ ระบบจะส่งค่าที่แคชไว้กลับมาทันที ('เก่า') แล้วอัปเดตข้อมูลเบื้องหลัง ('ขณะตรวจสอบใหม่')

SWR — การเปลี่ยนแปลงข้อมูล

mutate(key) จะตรวจสอบคิวรีที่แคชไว้อีกครั้ง ส่งข้อมูลใหม่เป็นอาร์กิวเมนต์ที่สองเพื่ออัปเดตข้อมูลในเชิงคาดการณ์ได้

import useSWR, { mutate } from 'swr';

async function updateProfile(updates) {
  // Optimistic update — UI reflects change immediately
  mutate('/api/me', { ...currentData, ...updates }, false);
  await fetch('/api/me', { method: 'PUT', body: JSON.stringify(updates) });
  // Revalidate to get the server's canonical state
  mutate('/api/me');
}

TanStack Query — การตั้งค่า

ครอบแอปของคุณด้วย QueryClientProvider ที่ใช้ QueryClient ซึ่งกำหนดค่าไว้แล้ว

import { QueryClient, QueryClientProvider } from '@tanstack/react-query';

const client = new QueryClient({
  defaultOptions: {
    queries: { staleTime: 30000, retry: 2 }
  }
});

function App() {
  return (
    <QueryClientProvider client={client}>
      <Routes />
    </QueryClientProvider>
  );
}

useQuery

useQuery({ queryKey, queryFn }) จะดึงข้อมูลและแคชข้อมูลนั้นไว้

import { useQuery } from '@tanstack/react-query';

function UserList() {
  const { data, isLoading, error } = useQuery({
    queryKey: ['users'],
    queryFn: () => fetch('/api/users').then(r => r.json()),
    staleTime: 60_000 // fresh for 1 minute
  });

  if (isLoading) return <Spinner />;
  if (error) return <ErrorMessage error={error} />;
  return <ul>{data.map(u => <li key={u.id}>{u.name}</li>)}</ul>;
}

useMutation สำหรับการเขียนข้อมูล

useMutation จัดการ POST/PUT/DELETE พร้อมสถานะรอดำเนินการและข้อผิดพลาดในตัว รวมถึงฮุก onSuccess เพื่อทำให้แคชไม่เป็นปัจจุบัน

import { useMutation, useQueryClient } from '@tanstack/react-query';

function CreateUserForm() {
  const qc = useQueryClient();
  const m = useMutation({
    mutationFn: (user) => fetch('/api/users', { method: 'POST', body: JSON.stringify(user) }),
    onSuccess: () => qc.invalidateQueries({ queryKey: ['users'] })
  });

  return <button onClick={() => m.mutate({ name: 'Alice' })} disabled={m.isPending}>Create</button>;
}

การทำให้คิวรีไม่เป็นปัจจุบัน

หลังการเปลี่ยนแปลงข้อมูล ให้ทำให้คิวรีที่เกี่ยวข้องไม่เป็นปัจจุบันเพื่อเรียกข้อมูลใหม่ queryClient.invalidateQueries({ queryKey: ['users'] }) จะทำเครื่องหมายว่าคิวรีเหล่านั้นเก่าและเรียกข้อมูลใหม่หากมีการเมานต์อยู่

การอัปเดตในเชิงคาดการณ์

TanStack Query รองรับการอัปเดตในเชิงคาดการณ์โดยตรงผ่าน onMutate, onError และ onSettled

useMutation({
  mutationFn: updateUser,
  onMutate: async (newUser) => {
    await qc.cancelQueries({ queryKey: ['user', newUser.id] });
    const previous = qc.getQueryData(['user', newUser.id]);
    qc.setQueryData(['user', newUser.id], newUser);
    return { previous };
  },
  onError: (_, newUser, ctx) => {
    qc.setQueryData(['user', newUser.id], ctx.previous); // rollback
  },
  onSettled: (_, __, newUser) => {
    qc.invalidateQueries({ queryKey: ['user', newUser.id] });
  }
});

คิวรีแบบไม่สิ้นสุด

useInfiniteQuery จัดการรายการที่แบ่งหน้าและเลื่อนดูไม่สิ้นสุด โดยมี fetchNextPage ให้ใช้และติดตามหน้าที่โหลดทั้งหมด

เครื่องมือสำหรับนักพัฒนา React Query

เพิ่ม @tanstack/react-query-devtools เพื่อสร้างแผงลอยที่แสดงคิวรีที่แคชไว้ทั้งหมด สถานะของแต่ละคิวรี และให้คุณทำให้คิวรีไม่เป็นปัจจุบันด้วยตนเอง

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ประโยชน์หลักของการใช้ SWR หรือ TanStack Query เหนือการใช้ useEffect + fetch ด้วยตนเองคืออะไร

สรุป: SWR และ React Query

สถานะจากเซิร์ฟเวอร์ต้องมีการแคช การตัดข้อมูลซ้ำ และการตรวจสอบข้อมูลใหม่ SWR มีขนาดเล็กและเรียบง่าย ส่วน TanStack Query มีฟีเจอร์มากกว่า (การเปลี่ยนแปลงข้อมูล การโหลดแบบไม่สิ้นสุด และเครื่องมือสำหรับนักพัฒนา) ใช้ useQuery สำหรับการอ่านข้อมูล และใช้ useMutation สำหรับการเขียนข้อมูล เรียก invalidateQueries หลังการเปลี่ยนแปลงข้อมูล ใช้การอัปเดตในเชิงคาดการณ์ร่วมกับ onMutate/onError ทั้งสองตัวช่วยให้ไม่ต้องใช้ useEffect+fetch แบบทำเองในแอปที่ใช้งานจริง

คำถามที่พบบ่อย

บทเรียน “SWR และ React Query สำหรับแคชข้อมูล” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “SWR และ React Query สำหรับแคชข้อมูล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Frontend Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Frontend Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “SWR และ React Query สำหรับแคชข้อมูล”

ใช้ SWR หรือ TanStack Query เพื่อดึงข้อมูล แคชข้อมูล กำจัดการดึงข้อมูลซ้ำ และตรวจสอบข้อมูลเซิร์ฟเวอร์ใหม่ แทนรูปแบบการดึงข้อมูลด้วย useEffect แบบทำเอง คุณปฏิบัติ Frontend Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Frontend Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Frontend Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “SWR และ React Query สำหรับแคชข้อมูล” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Frontend Academy นี้ได้ไหม

ได้ บทเรียน Frontend Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Fetch API: GET, POST, PUT และ DELETE
  2. Axios: Interceptors และ Base URL
  3. การจัดการข้อผิดพลาด: รหัสสถานะ HTTP
  4. SWR และ React Query สำหรับแคชข้อมูล
← กลับไปที่ Frontend Academy