⊗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
เราใช้คุกกี้สำหรับการทำงานของเว็บไซต์ การวิเคราะห์ และการปรับเนื้อหาให้เหมาะสมส่วนบุคคล การประมวลผลข้อมูลเกิดขึ้นตาม นโยบายความเป็นส่วนตัว.
ยอมรับทั้งหมด ปรับแต่ง ปฏิเสธ