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

useFetch: คอมโพสิเบิลสำหรับข้อมูลแบบอะซิงโครนัส

รีเฟอเรนซ์ data, loading และ error การดึงข้อมูลเมื่อเมาท์ ฟังก์ชันดึงข้อมูลใหม่ และการล้างข้อมูลด้วย AbortController

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

เป้าหมายของ useFetch

การดึงข้อมูลแบบอะซิงโครนัสต้องทำซ้ำอยู่เสมอ ทั้งตัวบ่งชี้การโหลด การจัดการข้อผิดพลาด และคำขอเอง useFetch จึงรวมสิ่งเหล่านี้ไว้ในคอมโพสิเบิลเดียวที่นำกลับมาใช้ใหม่ได้ โดยคืนค่า data, loading และ error

รีฟรีแอคทีฟสามตัว

เริ่มด้วยรีฟสามตัวที่ใช้อธิบายสถานะของคำขอแบบอะซิงโครนัสได้ทุกชนิด

import { ref } from "vue";
function useFetch(url) {
  const data = ref(null);
  const loading = ref(false);
  const error = ref(null);
}

ขั้นตอนการดึงข้อมูล

เขียนฟังก์ชันแบบอะซิงโครนัสที่เปลี่ยนค่า loading ดำเนินการคำขอ และจัดเก็บผลลัพธ์ เราจะปรับปรุงการจัดการข้อผิดพลาดในขั้นถัดไป

async function execute() {
  loading.value = true;
  const res = await fetch(url);
  data.value = await res.json();
  loading.value = false;
}

โครงสร้าง try / catch / finally

ครอบคำขอไว้เพื่อให้ข้อผิดพลาดไปอยู่ใน error และให้ loading กลับสู่ค่าเริ่มต้นเสมอ ไม่ว่าจะสำเร็จหรือล้มเหลว โดยใช้ finally

async function execute() {
  loading.value = true;
  error.value = null;
  try {
    const res = await fetch(url);
    if (!res.ok) throw new Error("HTTP " + res.status);
    data.value = await res.json();
  } catch (e) {
    error.value = e;
  } finally {
    loading.value = false;
  }
}

ดึงข้อมูลใน onMounted

เริ่มคำขอเมื่อคอมโพเนนต์ถูกเมานต์ เพื่อให้ข้อมูลโหลดโดยอัตโนมัติ

import { onMounted } from "vue";
onMounted(execute);

ฟังก์ชันดึงข้อมูลใหม่

เปิดเผย execute ในชื่อ refetch เพื่อให้ผู้เรียกใช้โหลดข้อมูลใหม่ตามต้องการ เช่น หลังการเปลี่ยนแปลงข้อมูลหรือเมื่อกดปุ่มลองใหม่

return { data, loading, error, refetch: execute };

ใช้ AbortController เพื่อล้างงาน

หากคอมโพเนนต์ถูกถอดออกระหว่างที่คำขอยังดำเนินอยู่ ให้ยกเลิกการดึงข้อมูลเพื่อหลีกเลี่ยงการตั้งค่าสถานะให้คอมโพเนนต์ที่ไม่ทำงานแล้ว สร้าง AbortController และส่งสัญญาณของมันไปด้วย

const controller = new AbortController();
const res = await fetch(url, { signal: controller.signal });

ยกเลิกเมื่อถอดคอมโพเนนต์

ยกเลิกคำขอที่กำลังดำเนินอยู่ใน onUnmounted และไม่ต้องสนใจข้อผิดพลาดจากการยกเลิกที่เกิดขึ้นในบล็อกดักจับ

import { onUnmounted } from "vue";
onUnmounted(() => controller.abort());

useFetch ฉบับสมบูรณ์

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

function useFetch(url) {
  const data = ref(null);
  const loading = ref(false);
  const error = ref(null);
  const controller = new AbortController();
  async function execute() {
    loading.value = true; error.value = null;
    try {
      const res = await fetch(url, { signal: controller.signal });
      data.value = await res.json();
    } catch (e) {
      if (e.name !== "AbortError") error.value = e;
    } finally {
      loading.value = false;
    }
  }
  onMounted(execute);
  onUnmounted(() => controller.abort());
  return { data, loading, error, refetch: execute };
}

ใช้งานในคอมโพเนนต์

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

const { data, loading, error } = useFetch("/api/posts");

รูปแบบในแม่แบบ

แยกการแสดงผลตามสถานะในแม่แบบ เพื่อให้ได้ประสบการณ์ผู้ใช้ที่สมบูรณ์

<p v-if="loading">Loading...</p>
<p v-else-if="error">{{ error.message }}</p>
<ul v-else>
  <li v-for="p in data" :key="p.id">{{ p.title }}</li>
</ul>

ตรวจสอบความเข้าใจ

AbortController มีบทบาทอย่างไรใน useFetch

สรุป

คุณได้สร้าง useFetch(url) ที่เปิดเผยรีฟ data, loading และ error ดึงข้อมูลใน onMounted ด้วยรูปแบบ try/catch/finally มีฟังก์ชัน refetch และล้าง AbortController ใน onUnmounted

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

บทเรียน “useFetch: คอมโพสิเบิลสำหรับข้อมูลแบบอะซิงโครนัส” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “useFetch: คอมโพสิเบิลสำหรับข้อมูลแบบอะซิงโครนัส”

รีเฟอเรนซ์ data, loading และ error การดึงข้อมูลเมื่อเมาท์ ฟังก์ชันดึงข้อมูลใหม่ และการล้างข้อมูลด้วย AbortController คุณปฏิบัติ Vue Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “useFetch: คอมโพสิเบิลสำหรับข้อมูลแบบอะซิงโครนัส” ใช้เวลานานแค่ไหน

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

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

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

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

  1. สิ่งที่ทำให้ Composable มีคุณภาพ
  2. useCounter: คอมโพสิเบิลแบบง่าย
  3. useFetch: คอมโพสิเบิลสำหรับข้อมูลแบบอะซิงโครนัส
  4. VueUse: ไลบรารีคอมโพสิเบิล
← กลับไปที่ Vue Academy