كمطورين لـ React، غالبًا ما نواجه سيناريوهات تتطلب مزامنة تغييرات الحالة السريعة المتعددة مع واجهة برمجة التطبيقات. قد يكون إجراء استدعاء واجهة برمجة التطبيقات (API) لكل تغيير صغير أمرًا غير فعال ويفرض ضرائب على كل من العميل والخادم. وهنا يأتي دور إدارة الدولة الذكية والذكية. في هذه المقالة، سنبني رابط React مخصصًا يلتقط مكالمات تحديث واجهة برمجة التطبيقات المتوازية عن طريق دمج الحمولات وإلغاء استدعاء واجهة برمجة التطبيقات.
تخيل حقل إدخال حيث يمكن للمستخدمين ضبط الإعدادات أو التفضيلات. يمكن أن تؤدي كل ضغطة مفتاح أو تعديل إلى استدعاء واجهة برمجة التطبيقات (API) لحفظ الحالة الجديدة. إذا أجرى المستخدم عدة تغييرات في تتابع سريع، فقد يؤدي ذلك إلى تدفق طلبات واجهة برمجة التطبيقات:
Debouncing هي تقنية تستخدم للحد من معدل إطلاق الوظيفة. بدلاً من استدعاء الوظيفة على الفور، عليك الانتظار لفترة معينة من عدم النشاط قبل تنفيذها. إذا وردت مكالمة أخرى قبل انتهاء التأخير، تتم إعادة ضبط المؤقت.
في React، useRef عبارة عن خطاف يسمح لك بالاحتفاظ بالقيم القابلة للتغيير بين عمليات العرض دون تشغيل إعادة التصيير. إنها في الأساس حاوية تحتوي على قيمة قابلة للتغيير.
دعونا نتعمق في الكود ونفهم كيف يتم تجميع كل ذلك معًا.
import { debounce } from "@mui/material"; import { useCallback, useEffect, useRef } from "react"; type DebouncedUpdateParams = { id: string; params: Record; }; function useDebouncedUpdate( apiUpdate: (params: DebouncedUpdateParams) => void, delay: number = 300, ) { const accumulatedUpdates = useRef (null); const processUpdates = useRef( debounce(() => { if (accumulatedUpdates.current) { apiUpdate(accumulatedUpdates.current); accumulatedUpdates.current = null; } }, delay), ).current; const handleUpdate = useCallback( (params: DebouncedUpdateParams) => { accumulatedUpdates.current = { id: params.id, params: { ...(accumulatedUpdates.current?.params || {}), ...params.params, }, }; processUpdates(); }, [processUpdates], ); useEffect(() => { return () => { processUpdates.clear(); }; }, [processUpdates]); return handleUpdate; } export default useDebouncedUpdate;
نقوم بتهيئة useRef المسمى بالتحديثات المتراكمة لتخزين المعلمات المجمعة لجميع التحديثات الواردة.
const AccumatedUpdates = useRef
نقوم بإنشاء تحديثات عملية للدالة المرتدة باستخدام أداة الارتداد المساعدة من واجهة المستخدم المادية.
const processUpdates = useRef( debounce(() => { if (accumulatedUpdates.current) { apiUpdate(accumulatedUpdates.current); accumulatedUpdates.current = null; } }, delay), ).current;
وظيفة HandleUpdate هي المسؤولة عن تجميع التحديثات وإطلاق استدعاء API المرتد.
const handleUpdate = useCallback( (params: DebouncedUpdateParams) => { accumulatedUpdates.current = { id: params.id, params: { ...(accumulatedUpdates.current?.params || {}), ...params.params, }, }; processUpdates(); }, [processUpdates], );
نقوم بمسح الوظيفة المرتدة عند إلغاء تحميل المكون لمنع تسرب الذاكرة.
useEffect(() => { return () => { processUpdates.clear(); }; }, [processUpdates]);
إليك كيفية استخدام هذا الخطاف في أحد المكونات:
import React from "react"; import useDebouncedUpdate from "./useDebouncedUpdate"; function SettingsComponent() { const debouncedUpdate = useDebouncedUpdate(updateSettingsApi, 500); const handleChange = (settingName, value) => { debouncedUpdate({ id: "user-settings", params: { [settingName]: value }, }); }; return (handleChange("username", e.target.value)} /> handleChange("notifications", e.target.checked)} />); } function updateSettingsApi({ id, params }) { // Make your API call here console.log("Updating settings:", params); }
من خلال الجمع بين الارتداد وتراكم الحالة، يمكننا إنشاء تطبيقات فعالة وسريعة الاستجابة. يضمن الخطاف useDebouncedUpdate تجميع التغييرات السريعة معًا، مما يقلل من استدعاءات واجهة برمجة التطبيقات غير الضرورية ويحسن الأداء.
الوجبات الرئيسية:
لا تتردد في دمج هذا الخطاف في مشاريعك وتعديله ليناسب احتياجاتك الخاصة. برمجة سعيدة!
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3