⊗jsrxPmATADR 49 of 57 menu

การกำจัดการร้องขอข้อมูลซ้ำซ้อนใน Redux

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

สาเหตุของปัญหานี้มาจากลักษณะการมอนต์ คอมโพเนนต์ใน React 18 และเวอร์ชันที่สูงกว่า ในโหมด การพัฒนา (dev) เมื่อใช้ React.StrictMode (ได้ยินมาว่าในโหมด production ไม่มีปัญหานี้) โดยเริ่มแรกคอมโพเนนต์จะถูกติดตั้ง (mount) จากนั้นก็ถอดออก (unmount) และติดตั้งอีกครั้ง ดังนั้น คำขอก็จึงถูกส่งสองครั้ง

เป็นไปได้ว่าเมื่อคุณศึกษาบทเรียนนี้ การมอนต์สองครั้งใน React นี้ อาจจะถูกเปลี่ยนแปลงไปแล้วในบางรูปแบบ เราจะไม่ลงลึกในรายละเอียด แต่เพียง ใช้ React hook useRef ซึ่งจะช่วยให้เราหลีกเลี่ยงความเข้าใจผิดนี้ได้

มาเปิดแอปพลิเคชันสินค้าของเรา และในนั้นเปิดไฟล์ ProductsList.jsx แล้วนำเข้า hook useRef:

import { useEffect, useRef } from 'react'

และตอนนี้มาแก้ไขบล็อกโค้ดถัดไป ที่มี useEffect เล็กน้อย:

useEffect(() => { if (productStatus === 'idle') { dispatch(fetchProducts()) } }, [productStatus, dispatch])

เริ่มต้นด้วยการประกาศตัวแปรใหม่ชื่อ dataFetch สำหรับ useRef ตั้งค่า property current เป็น false ตั้งแต่แรก หากแอปพลิเคชัน ถูกเริ่มต้นแล้ว และคำขอถูก ส่งไปแล้ว property current จะเป็น true แล้ว ซึ่งหมายความว่าเราจะออกจากฟังก์ชันและ จะไม่มีการร้องขอข้อมูลซ้ำอีก ดังนั้นโค้ดส่วนที่กล่าวมาข้างต้น จะมีหน้าตาดังนี้:

const dataFetch = useRef(false) useEffect(() => { if (dataFetch.current) return dataFetch.current = true if (productStatus === 'idle') { dispatch(fetchProducts()) } }, [productStatus, dispatch])

ตอนนี้มาเริ่มต้นแอปพลิเคชันของเราอีกครั้ง และสังเกตด้วยความโล่งใจว่าข้อความเตือนสีแดง ในคอนโซลได้หายไป และจะเห็น รายการสินค้าโดยไม่มีข้อมูลซ้ำ ตอนนี้ มีสินค้า 8 รายการ ตามที่เราวางแผนไว้บน เซิร์ฟเวอร์ ตอนนี้ใน Redux DevTools action ที่ถูกสร้างเมื่อมีการร้องขอ จะไม่ เกิดซ้ำอีกต่อไป

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

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