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

Mutation ด้วย useMutation

ส่งข้อมูลไปยัง API ด้วย useMutation จัดการสถานะกำลังโหลดและข้อผิดพลาด แล้วทำให้ query เป็นโมฆะเมื่อสำเร็จ

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

ยินดีต้อนรับ

ในบทเรียนนี้ คุณจะใช้ useMutation เพื่อส่งข้อมูลไปยัง API จัดการสถานะกำลังโหลดและข้อผิดพลาด และทำให้คำขอเก่าไม่ถูกต้องหลังการเปลี่ยนแปลงข้อมูลสำเร็จ

พื้นฐานของ useMutation

เรียกใช้ useMutation พร้อม mutationFn ฟังก์ชันนี้จะส่งคืนฟังก์ชัน mutate และพร็อพเพอร์ตีสถานะต่าง ๆ ให้เรียก mutate() เพื่อเริ่มการดำเนินการ
import { useMutation } from '@tanstack/react-query';

const { mutate, isLoading, isError } = useMutation({
  mutationFn: (newPost) => fetch('/api/posts', {
    method: 'POST',
    body: JSON.stringify(newPost),
  }).then(r => r.json()),
});

การเรียกใช้ mutate

เรียก `mutate(variables)` จากตัวจัดการเหตุการณ์ โดย variables จะถูกส่งให้ mutationFn เป็นอาร์กิวเมนต์แรก
<button onClick={() => mutate({ title: 'New Post' })}>
  Create Post
</button>

การเรียกกลับ: onSuccess, onError, onSettled

เพิ่มตัวเลือกการเรียกกลับให้กับ useMutation โดย onSuccess จะทำงานหลังการเปลี่ยนแปลงข้อมูลสำเร็จ onError จะทำงานเมื่อล้มเหลว และ onSettled จะทำงานในทั้งสองกรณี (คล้าย finally)
useMutation({
  mutationFn: createPost,
  onSuccess: (data) => {
    console.log('Created:', data);
    navigate('/posts/' + data.id);
  },
  onError: (error) => {
    toast.error(error.message);
  },
})

การทำให้คำขอไม่ถูกต้องหลังการเปลี่ยนแปลงข้อมูล

หลังการเปลี่ยนแปลงข้อมูลสำเร็จ ให้ทำให้คำขอที่เกี่ยวข้องไม่ถูกต้อง เพื่อให้ React Query ดึงข้อมูลใหม่ที่เป็นปัจจุบัน ใช้ queryClient.invalidateQueries ใน onSuccess
import { useQueryClient } from '@tanstack/react-query';

const queryClient = useQueryClient();

const { mutate } = useMutation({
  mutationFn: createPost,
  onSuccess: () => {
    queryClient.invalidateQueries({ queryKey: ['posts'] });
  },
});

mutateAsync สำหรับไวยากรณ์ await

ใช้ `mutateAsync` แทน `mutate` เพื่อรอการเปลี่ยนแปลงข้อมูล และจัดการด้วย try/catch
const { mutateAsync } = useMutation({ mutationFn: createPost });

async function handleSubmit() {
  try {
    const post = await mutateAsync({ title: 'Draft' });
    navigate('/posts/' + post.id);
  } catch (err) {
    setError(err.message);
  }
}

การปิดใช้งานการส่งระหว่างการเปลี่ยนแปลงข้อมูล

ใช้ `isPending` (หรือ `isLoading`) เพื่อปิดใช้งานปุ่มส่งขณะที่การเปลี่ยนแปลงข้อมูลกำลังดำเนินการ
const { mutate, isPending } = useMutation({ mutationFn: saveItem });

<button onClick={() => mutate(item)} disabled={isPending}>
  {isPending ? 'Saving...' : 'Save'}
</button>

การอัปเดตแบบมองโลกในแง่ดีด้วย onMutate

ใช้ onMutate เพื่ออัปเดตแคชแบบมองโลกในแง่ดีก่อนที่เซิร์ฟเวอร์จะตอบกลับ และย้อนกลับใน onError โดยใช้บริบทที่ onMutate ส่งคืนมา
useMutation({
  mutationFn: likePost,
  onMutate: async (id) => {
    await queryClient.cancelQueries({ queryKey: ['posts'] });
    const prev = queryClient.getQueryData(['posts']);
    queryClient.setQueryData(['posts'], old => old.map(p =>
      p.id === id ? { ...p, likes: p.likes + 1 } : p));
    return { prev };
  },
  onError: (err, id, ctx) => queryClient.setQueryData(['posts'], ctx.prev),
  onSettled: () => queryClient.invalidateQueries({ queryKey: ['posts'] }),
})

การรีเซ็ตสถานะการเปลี่ยนแปลงข้อมูล

เรียก `reset()` จาก useMutation เพื่อล้างสถานะการเปลี่ยนแปลงข้อมูล (ข้อมูล ข้อผิดพลาด และสถานะ) ซึ่งมีประโยชน์หลังจากนำทางออกจากหน้านี้หรือล้างแบบฟอร์ม
const { mutate, isError, reset } = useMutation({ /* ... */ });

{isError && (
  <>
    <p>Error!</p>
    <button onClick={reset}>Try Again</button>
  </>
)}

การเปลี่ยนแปลงข้อมูลหลายรายการพร้อมกัน

เรียก mutate หลายครั้งพร้อมกันได้ โดยแต่ละการเรียกจะถูกติดตามแยกจากกัน ใช้ mutateAsync ร่วมกับ Promise.all สำหรับการเปลี่ยนแปลงข้อมูลแบบขนาน
await Promise.all([
  mutateAsync({ id: 1, title: 'First' }),
  mutateAsync({ id: 2, title: 'Second' }),
]);

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

หลังการเปลี่ยนแปลงข้อมูลสำเร็จ วิธีที่แนะนำเพื่อให้แน่ใจว่าส่วนติดต่อผู้ใช้แสดงข้อมูลล่าสุดคืออะไร

สรุปทบทวน

useMutation มี mutate, isPending และการเรียกกลับตามวงจรการทำงาน ใช้ onSuccess เพื่อทำให้คำขอที่เกี่ยวข้องไม่ถูกต้อง ใช้ mutateAsync สำหรับกระบวนการที่อาศัย await และใช้ onMutate/onError สำหรับการอัปเดตแบบมองโลกในแง่ดีพร้อมการย้อนกลับ

ถัดไป

บทเรียนถัดไป: **การเลื่อนแบบไม่สิ้นสุดและการแบ่งหน้าด้วย useInfiniteQuery** — คุณจะดึงข้อมูลที่แบ่งหน้าและโหลดหน้าเพิ่มเติมได้อย่างต่อเนื่อง

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

บทเรียน “Mutation ด้วย useMutation” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “Mutation ด้วย useMutation”

ส่งข้อมูลไปยัง API ด้วย useMutation จัดการสถานะกำลังโหลดและข้อผิดพลาด แล้วทำให้ query เป็นโมฆะเมื่อสำเร็จ คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “Mutation ด้วย useMutation” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การตั้งค่า React Query และ QueryClient
  2. การแคช อายุข้อมูล และการดึงข้อมูลเบื้องหลัง
  3. Mutation ด้วย useMutation
  4. การเลื่อนแบบไม่สิ้นสุดและการแบ่งหน้า ด้วย useInfiniteQuery
← กลับไปที่ React Academy