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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Fetch API: GET, POST, PUT และ DELETE
- Axios: Interceptors และ Base URL
- การจัดการข้อผิดพลาด: รหัสสถานะ HTTP
- SWR และ React Query สำหรับแคชข้อมูล