Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗jsrxPmATTRC 55 of 57 menu
◀ ▶

การแสดงผลการทำงานของ thunk ในคอมโพเนนต์ใน Redux

ในบทเรียนที่แล้วเราได้ส่งคำขอ POST โดยใช้ thunk addProduct ทีนี้มาลอง แสดงผลการทำงานของมันในคอมโพเนนต์กัน

เปิดแอปพลิเคชันสินค้าของเราขึ้นมา และเปิด ไฟล์ NewProductForm.jsx เนื่องจากคอมโพเนนต์นี้ มีหน้าที่รับผิดชอบในการเพิ่มสินค้าใหม่ ลองดูที่บรรทัดการ import แทนที่การ import action productAdded ด้วย การ import thunk addProduct:

import { addProduct } from './productsSlice'

ทีนี้ เนื่องจากเราไม่ได้ติดตามสถานะ 'pending' ของคำขอใน slice ลองมาทำให้ ผู้ใช้สามารถกดปุ่มบันทึกสินค้าได้เพียงครั้งเดียว เพราะ เราไม่ต้องการคำขอที่ซ้ำกันแบบเดิม สำหรับสิ่งนี้ เราจะสร้าง local state เพิ่มอีกหนึ่ง:

const [requestStatus, setRequestStatus] = useState('idle')

ต่อไป หลังจากตัวจัดการเหตุการณ์และก่อนฟังก์ชัน onSaveProductClick ให้เขียนโค้ดที่ ตรวจสอบว่าฟิลด์แบบฟอร์มทั้งหมดของเราถูกกรอกครบหรือไม่ และสถานะคำขออยู่ที่ 'idle' หรือไม่:

const canBeSaved = [name, desc, price, amount, sellerId].every(Boolean) && requestStatus === 'idle'

จากนั้นเราจะเปลี่ยนโค้ดสำหรับ onSaveProductClick ประการแรก นี่จะเป็นฟังก์ชันแบบอะซิงโครนัสและมันจะทำงาน, หากเงื่อนไขข้างต้นเป็นจริง:

const onSaveProductClick = async () => { if (canBeSaved) {} }

แม้ว่าเราไม่ได้ติดตามสถานะ 'rejected' ใน slice เรายังสามารถแสดงข้อผิดพลาดใน console ได้ โดยใช้ โครงสร้าง try-catch นอกจากนี้เราจะเพิ่ม finally ด้วย, เพื่อตั้งค่า local state กลับเป็น 'idle' หลังจากคำขอทำงานเสร็จ:

const onSaveProductClick = async () => { if (canBeSaved) { try { } catch (err) { console.error('save product error: ', err) } finally { setRequestStatus('idle') } } }

เราได้จัดการกับบล็อก catch และ finally แล้ว มาลอง เขียนโค้ดสำหรับบล็อก try กัน ที่นี่เราจะตั้งค่าสถานะท้องถิ่น เป็น 'in progress' จนกว่าเราจะได้รับ การตอบกลับใด ๆ จากการทำงานของ thunk, จากนั้นส่ง thunk addProduct ของเราไป ในการใช้ โครงสร้าง try-catch ตาม ประเภทของการตอบกลับจะช่วยเราได้โดยฟังก์ชัน RTK unwrap, ซึ่งมันเพิ่มเข้ามาใน promise ที่ส่งคืน จากนั้น หากคำขอสำเร็จ เราจะตั้งค่า local state กลับไปเป็นสถานะเริ่มต้น โค้ดทั้งหมดสำหรับ onSaveProductClick จะมีลักษณะดังนี้:

const onSaveProductClick = async () => { if (canBeSaved) { try { setRequestStatus('in progress') await dispatch( addProduct({ name, desc, price, amount, seller: sellerId })).unwrap() setName('') setDesc('') setPrice(0) setAmount(0) setSellerId('') } catch (err) { console.error('save product error: ', err) } finally { setRequestStatus('idle') } } }

มาเริ่มต้นแอปพลิเคชันของเราและลองเพิ่ม สินค้าใหม่กัน อย่างที่คุณเห็น ในกรณีที่คำขอสำเร็จ ฟิลด์จะถูกล้างและสินค้าใหม่จะถูกเพิ่มเข้าไป ในรายการสินค้า นอกจากนี้ลองดูในเบราว์เซอร์ ที่ Redux DevTools และลองสำรวจแท็บต่าง ๆ ของมัน, ดูที่ actions และวิธีที่ state ของคุณเปลี่ยนแปลง

เปิดแอปพลิเคชันนักเรียนของคุณ เปิดไฟล์ NewStudentForm.jsx ในนั้น เพิ่ม local state requestStatus อีกหนึ่ง, และตั้งค่าเริ่มต้นเป็น 'idle' หลังจากศึกษาบทเรียนแล้ว ให้สร้าง ตัวแปร canBeSaved โดยที่ ปุ่มบันทึกข้อมูลนักเรียนใหม่จะ ทำงาน/ไม่ทำงาน ขึ้นอยู่กับค่า requestStatus และความสมบูรณ์ของการกรอกฟิลด์

เขียนโค้ดแบบอะซิงโครนัสสำหรับ onSaveStudentClick, ซึ่งจะเปลี่ยนค่า requestStatus ตามสถานการณ์ ส่ง thunk addProduct พร้อมข้อมูลนักเรียนใหม่ ล้างฟิลด์ ในกรณีที่คำขอสำเร็จ และแสดง ข้อผิดพลาดใน console ในกรณีที่ล้มเหลว, ตามที่แสดงในบทเรียน ใช้ โครงสร้าง try-catch และฟังก์ชัน RTK unwrap สำหรับสิ่งนี้

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

← →
↑
ไทย▼
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣTürkmenTürkçeЎзбекOʻzbekTiếng Việt
เราใช้คุกกี้สำหรับการทำงานของเว็บไซต์ การวิเคราะห์ และการปรับเนื้อหาให้เหมาะสมส่วนบุคคล การประมวลผลข้อมูลเกิดขึ้นตาม นโยบายความเป็นส่วนตัว.
ยอมรับทั้งหมด ปรับแต่ง ปฏิเสธ