การสร้างสโตร์แบบกำหนดเองด้วย useSyncExternalStore
สร้างสโตร์ภายนอกขนาดเล็กตั้งแต่ต้น และเชื่อมต่อเข้ากับ React ด้วย useSyncExternalStore
การสร้างสโตร์แบบกำหนดเองด้วย useSyncExternalStore เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
ข้อกำหนดขั้นต่ำของสโตร์
สโตร์แบบกำหนดเองต้องมีสามสิ่ง ได้แก่ สถานะบางอย่าง ฟังก์ชันสมัครรับการแจ้งเตือนสำหรับลงทะเบียนตัวรับฟังเหตุการณ์ และฟังก์ชัน getSnapshot สำหรับอ่านสถานะปัจจุบัน นี่คือข้อกำหนดทั้งหมดที่ useSyncExternalStore คาดหวัง
การทำให้สโตร์มีขนาดเล็กเช่นนี้ทำให้ไม่ผูกกับเฟรมเวิร์ก ดังนั้นจึงใช้สโตร์เดียวกันได้ทั้งภายในและภายนอกรีแอ็กต์
โรงงาน createStore
โรงงาน createStore รับค่าเริ่มต้นและคืนออบเจ็กต์ที่มี getSnapshot ฟังก์ชันสมัครรับการแจ้งเตือน และฟังก์ชันอัปเดต ภายในโรงงานจะเก็บสถานะปัจจุบันและชุดฟังก์ชันเรียกกลับของตัวรับฟังเหตุการณ์
รูปแบบโรงงานนี้ช่วยให้คุณสร้างสโตร์อิสระหลายชุดได้ด้วยฟังก์ชันที่นำกลับมาใช้ใหม่เพียงหนึ่งชุด
ฟังก์ชันอัปเดตแจ้งเตือนผู้สมัครรับ
เมื่อฟังก์ชันอัปเดตเปลี่ยนสถานะ ฟังก์ชันจะกำหนดค่าใหม่แล้วเรียกตัวรับฟังเหตุการณ์ที่ลงทะเบียนไว้ทุกตัว ตัวรับฟังเหล่านั้นคือฟังก์ชันเรียกกลับที่รีแอ็กต์มอบให้ผ่านฟังก์ชันสมัครรับการแจ้งเตือน
การเรียกใช้ตัวรับฟังเหล่านี้จะแจ้งรีแอ็กต์ว่าสโตร์เปลี่ยนแปลง ทำให้รีแอ็กต์อ่าน getSnapshot อีกครั้งและเรนเดอร์คอมโพเนนต์ใด ๆ ที่อ่านข้อมูลจากสโตร์ใหม่
เชื่อมต่อกับรีแอ็กต์ผ่านฮุก
คอมโพเนนต์อ่านข้อมูลจากสโตร์โดยเรียกใช้ useSyncExternalStore พร้อมฟังก์ชันสมัครรับการแจ้งเตือนและฟังก์ชัน getSnapshot ของสโตร์ ฮุกจะคืนค่าปัจจุบันและเรนเดอร์ใหม่เมื่อค่านั้นเปลี่ยนแปลง
คุณสามารถห่อหุ้มการทำงานนี้ไว้ในฮุกแบบกำหนดเอง เช่น useStore เพื่อให้คอมโพเนนต์เรียกใช้ฟังก์ชันเดียว แทนการเชื่อมต่ออาร์กิวเมนต์ของฮุกด้วยตนเองทุกครั้ง
แบ่งปันระหว่างคอมโพเนนต์โดยไม่ใช้ตัวให้บริการ
เนื่องจากสโตร์เป็นออบเจ็กต์ระดับโมดูล คอมโพเนนต์ใด ๆ ที่นำเข้าสโตร์จะใช้สถานะเดียวกันร่วมกัน โดยไม่ต้องมีตัวให้บริการบริบท ไม่ต้องห่อหุ้มต้นไม้คอมโพเนนต์ และไม่ต้องส่งพร็อพผ่านคอมโพเนนต์หลายชั้น
นี่คือจุดเด่นสำคัญของสโตร์ภายนอก นั่นคือสถานะส่วนกลางที่ใช้ร่วมกันได้ผ่านรูปแบบการนำเข้าและใช้งานโดยตรง แทนลำดับชั้นของตัวให้บริการ
สโตร์หลายชุดสำหรับส่วนย่อยของสถานะ
คุณสามารถสร้างสโตร์ขนาดเล็กหลายชุด โดยแต่ละชุดเป็นเจ้าของส่วนย่อยของสถานะ แทนการใช้สโตร์ขนาดใหญ่รวมเป็นก้อนเดียว คอมโพเนนต์จะสมัครรับเฉพาะส่วนย่อยที่ตนสนใจ
วิธีนี้ช่วยแยกหน้าที่ออกจากกันและจำกัดการเรนเดอร์ใหม่ เพราะการเปลี่ยนแปลงส่วนย่อยหนึ่งจะไม่รบกวนคอมโพเนนต์ที่อ่านข้อมูลจากอีกส่วนย่อย
Zustand ใช้งานสิ่งนี้ภายใน
Zustand ซึ่งเป็นไลบรารีสถานะขนาดเล็กที่ได้รับความนิยม สร้างขึ้นตามรูปแบบนี้โดยตรง และใช้ useSyncExternalStore ภายในตั้งแต่รุ่นที่ 4 เอพีไอขนาดเล็กของไลบรารีนี้โดยพื้นฐานแล้วคือ createStore ที่ปรับปรุงให้ใช้งานสะดวก พร้อมชั้นตัวเลือกข้อมูล
การเห็นความเชื่อมโยงนี้ช่วยให้ไลบรารีลักษณะนี้เข้าใจได้ง่ายขึ้น เพราะแท้จริงแล้วเป็นตัวห่อหุ้มพื้นฐานเดียวกันที่บางและใช้งานสะดวก ซึ่งคุณสามารถสร้างขึ้นเองได้
การเรนเดอร์ใหม่เฉพาะเมื่อส่วนย่อยเปลี่ยนแปลง
เมื่อส่งตัวเลือกให้ getSnapshot ซึ่งคืนค่าเฉพาะส่วนของสถานะที่คอมโพเนนต์ใช้งาน คุณจะทำให้คอมโพเนนต์เรนเดอร์ใหม่เฉพาะเมื่อส่วนดังกล่าวเปลี่ยนแปลง
การทำเช่นนี้ต้องอาศัยผลลัพธ์ของตัวเลือกที่คงที่ ดังนั้นควรทำค่าที่คำนวณต่อให้เป็นเมโมเพื่อหลีกเลี่ยงลูปไม่รู้จบจากการอ้างอิงใหม่ พร้อมทั้งจำกัดการอัปเดตให้อยู่ในส่วนย่อยที่เกี่ยวข้อง
ป้ายกำกับการดีบักใน DevTools
สำหรับการดีบัก คุณสามารถเพิ่มป้ายกำกับให้สโตร์และบันทึกการอัปเดต หรือนำไปผสานรวมกับ DevTools ของเบราว์เซอร์ เพื่อดูได้ว่าสโตร์ใดเปลี่ยนแปลงและเกิดขึ้นเมื่อใด
แม้แต่การบันทึกอย่างง่ายในคอนโซลภายใน update ซึ่งเปิดใช้เฉพาะเมื่อมีแฟล็กสำหรับการพัฒนา ก็ช่วยให้คุณเข้าใจการไหลของสถานะขณะสร้างสโตร์ได้
การทดสอบสโตร์ทั้งภายในและภายนอก React
เนื่องจากสโตร์เป็น JavaScript แบบพื้นฐาน คุณจึงทดสอบตรรกะของสโตร์ได้โดยตรง โดยเรียก update และตรวจสอบว่า getSnapshot คืนค่าใหม่ โดยไม่ต้องเรนเดอร์สิ่งใดเลย
คุณยังสามารถทดสอบภายใน React ได้ด้วยการเรนเดอร์คอมโพเนนต์ที่อ่านค่าจากสโตร์ แล้วตรวจสอบว่ามีการเรนเดอร์ใหม่หลังจาก update ซึ่งครอบคลุมทั้งสโตร์และการผสานรวมของสโตร์
ตรวจสอบอย่างรวดเร็ว: ฟังก์ชัน subscribe ของสโตร์แบบกำหนดเอง
โปรดทบทวนข้อกำหนดการทำงานของเมธอด subscribe สำหรับสโตร์แบบกำหนดเอง
สรุป: การสร้างสโตร์แบบกำหนดเอง
สโตร์แบบกำหนดเองต้องมี state, subscribe และ getSnapshot โรงงาน createStore ร่วมกับ update ที่แจ้งให้ตัวรับฟังทราบ ทำให้มีสถานะส่วนกลางที่ใช้ร่วมกันได้โดยไม่ต้องมี Provider เนื่องจากการนำเข้าโมดูลใช้สโตร์อินสแตนซ์เดียวกัน
ใช้สโตร์สำหรับส่วนย่อยหลายชุดและตัวเลือกเพื่อจำกัดการเรนเดอร์ใหม่ โดยอย่าลืมใช้อ้างอิงที่คงที่ Zustand v4+ สร้างขึ้นจากรูปแบบนี้โดยตรง และสโตร์ JavaScript แบบพื้นฐานก็ทดสอบได้ง่ายทั้งภายในและภายนอก React
คำถามที่พบบ่อย
บทเรียน “การสร้างสโตร์แบบกำหนดเองด้วย useSyncExternalStore” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสร้างสโตร์แบบกำหนดเองด้วย useSyncExternalStore” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสร้างสโตร์แบบกำหนดเองด้วย useSyncExternalStore”
สร้างสโตร์ภายนอกขนาดเล็กตั้งแต่ต้น และเชื่อมต่อเข้ากับ React ด้วย useSyncExternalStore คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การสร้างสโตร์แบบกำหนดเองด้วย useSyncExternalStore” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม
ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ปัญหาของการสมัครรับข้อมูลจากสโตร์ภายนอก
- API และพารามิเตอร์ของ useSyncExternalStore
- การสมัครรับข้อมูลจาก API ของเบราว์เซอร์
- การสร้างสโตร์แบบกำหนดเองด้วย useSyncExternalStore