Search⌘ K
AI Features

أنماط البيانات في الوقت الحقيقي

تعرف على كيفية الحفاظ على استجابة واجهات المستخدم في الوقت الفعلي من خلال جدولة التحديثات الواردة حتى لا تقاطع تفاعل المستخدم.

تُضاف ميزات الوقت الفعلي عادةً بنوايا حسنة: "للحفاظ على تحديث واجهة المستخدم". تقوم لوحة المعلومات بالتحقق كل بضع ثوانٍ. ويشترك موجز الأخبار في تدفق البيانات. وتستمع شارة الحالة إلى التحديثات. في البداية، يبدو النظام حيويًا. ولكن مع إضافة المزيد من مصادر الوقت الفعلي، قد تصبح واجهة المستخدم غير مستقرة. تومض القوائم مع وصول البيانات الجديدة. وتقفز مواضع التمرير. وتفقد المدخلات التركيز. ينقر المستخدم على زر، وفي منتصف التفاعل، تتغير الشاشة أسفله بشكل طفيف.

من وجهة نظر المطور، تبدو طبقة البيانات سليمة: تصل التحديثات في الوقت المحدد، لكن تجربة المستخدم تبدو غير سلسة. رد الفعل الشائع هو إضافة المزيد من خيارات التحكم: إيقاف التحديثات مؤقتًا أثناء الكتابة، أو تأخير عمليات العرض، أو التخزين المؤقت المكثف، أو نقل كل شيء إلى مخزن بيانات عام. هذه الحلول تتعامل مع الوقت الفعلي كمشكلة في معدل نقل البيانات، بينما تكمن المشكلة الحقيقية في تنسيق العرض. يقوم React بما هو مطلوب منه تمامًا: إعادة العرض عند تغيير الحالة. الخطأ هو افتراض أن البيانات الجديدة يجب أن تؤدي دائمًا إلى تحديث فوري لواجهة المستخدم.

تكمن المشكلة في اختلاف أولوية البيانات الآنية عن تفاعل المستخدم. فالنقرة، أو الضغط على زر، أو السحب، كلها إجراءات يجب أن تبدو فورية، بينما لا يكون تحديث الخلفية كذلك. لا ينظر المستخدمون إلى الأنظمة الآنية على أنها دقيقة للغاية، بل على أنها مستقرة، ويمكن التنبؤ بها، وسريعة الاستجابة. وعندما يُعامل كل تحديث على أنه بنفس القدر من الأهمية، تقل قدرة React على تحديد أولويات التفاعلات، وتصبح واجهة المستخدم مزدحمة.

يُقدّم React 19 أداةً مفقودة. فبدلاً من الاختيار بين "مباشر" أو "غير مباشر"، يُمكن التحكم في التحديثات من خلال تحديد وقت السماح بتنفيذها ومكان وصولها. وذلك من خلال مواءمة التحديثات في الوقت الفعلي مع نموذج جدولة React باستخدام أدوات مثلstartTransition ، ويمكن أن يظل التفاعل سريع الاستجابة أثناء مزامنة البيانات في الخلفية، ولا يمكن تثبيت التحديثات المرئية إلا عندما لا تعطل المستخدم.

Real-time data feels real when updates are coordinated, not when everything re-renders instantly
Real-time data feels real when updates are coordinated, not when everything re-renders instantly

يُظهر الرسم التخطيطي أعلاه واجهة مستخدم مُقسّمة إلى ثلاثة أقسام. يُحدَّث مؤشر صغير مُباشر فور ورود الأحداث. يُجهّز قسم القائمة التحديثات في الخلفية ويُثبّتها عند جاهزيتها. تبقى لوحة التفاصيل ثابتة أثناء تفاعل المستخدم، ولا تُعاد عرضها إلا عندما يُقرر React أنها آمنة. تقرأ جميع الأقسام من نفس مصدر البيانات المُتطوّر، لكنها تُثبّت التحديثات في أوقات مُختلفة بناءً على الأولوية.

استخدام React 19 لجدولة التحديثات في الوقت الفعلي بأمان

أول تغيير في طريقة التفكير هو التوقف عن التعامل مع البيانات الآنية كتدفق يُجبر واجهة المستخدم على التحديث باستمرار. بدلاً من ذلك، فكّر من منظور حداثة البيانات المُقرأة والتحكم في الالتزام. بعض العناصر، مثل عداد البيانات المباشر، يمكن تحديثها فورًا. بينما عناصر أخرى، مثل قائمة مُرتبة أو لوحة تفاصيل، يجب تحديثها فقط عندما يكون بإمكان React القيام بذلك دون التأثير على التفاعل.

في React 19، يمكن جدولة عمليات العرض بأولويات مختلفة. يتيح ذلك التمييز بين التفاعلات العاجلة ومزامنة الخلفية. لا يستحق التحديث الفوري تلقائيًا نفس أولوية النقر أو ضغطة المفتاح. عند وضع علامة "غير عاجل" على تحديثات الخلفية،startTransition يمكن لـ React الحفاظ على استجابة واجهة المستخدم الحالية أثناء إعداد الحالة المرئية التالية.

مفهوم مفتاح آخر هو استقرار عمليات قراءة البيانات. غالبًا ما تُرسل الأنظمة الآنية البيانات بشكل متكرر، ولكن يجب ألا تُعيد المكونات إنشاء الوعود أو الاشتراكات أو البنى المشتقة في كل عملية عرض. يعمل React بأفضل شكل عندما تقرأ المكونات من مصادر ثابتة يمكن أن تتغير بمرور الوقت دون تغيير هويتها. هذا يسمح React بالتوفيق التدريجي بدلاً من إعادة بدء العمل.

أخيرًا، النطاق مهم. يجب أن تؤثر التحديثات الفورية على أصغر منطقة ممكنة. عندما يشترك كل شيء في كل شيء، يبدو كل تحديث شاملًا. عندما تكون التحديثات معزولة ضمن حدود واضحة، يمكن React إجراء تغييرات صغيرة ومحلية مع ترك باقي الشاشة دون تغيير. تتحسن تجربة المستخدم الفورية ليس بالسرعة، بل بالهدوء.

والآن ننتقل من مرحلة التأطير إلى مرحلة البرهان. يوضح المثال أدناه كيف يمكن استيعاب التحديثات المستمرة في الوقت الفعلي في الخلفية، بينما يتم إعادة عرض مناطق واجهة المستخدم ...