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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สิ่งที่ทำให้ Composable มีคุณภาพ
- useCounter: คอมโพสิเบิลแบบง่าย
- useFetch: คอมโพสิเบิลสำหรับข้อมูลแบบอะซิงโครนัส
- VueUse: ไลบรารีคอมโพสิเบิล