مزامنة الحالة مع localStorage
أنشئوا خطافًا مخصصًا باسم useLocalStorage يُبقي حالة React وlocalStorage متزامنتين في الاتجاهين.
مزامنة الحالة مع localStorage درس مجاني في React Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.
النهج الساذج يؤدي إلى فقدان التزامن
قد يكون أول ما يخطر بالبال قراءة localStorage في مكان وكتابته في مكان آخر، لكن هذين المكانين قد يبتعدان عن بعضهما. فتؤدي تحديثات الحالة التي تنسى الحفظ، أو القيم المحفوظة التي لا تنعكس في الحالة، إلى أخطاء.
أنتم بحاجة إلى مصدر واحد للحقيقة يُبقي حالة React والتخزين متزامنين تمامًا.
الخطاف المخصص useLocalStorage
الحل المنظم هو خطاف useLocalStorage يغلّف useState ويحفظ التغييرات تلقائيًا. ويُرجع قيمة ودالة ضبط تمامًا مثل useState.
يستخدمه المستهلكون تمامًا مثل الحالة العادية، لكنهم يحصلون على الاستمرارية تلقائيًا.
دالة التهيئة الكسولة
تُعد قراءة localStorage عملية متزامنة، لذلك ينبغي ألا تنفذوها عند كل عملية تصيير. مرروا دالة إلى useState، وهي المهيئ الكسول، بحيث تحدث القراءة مرة واحدة فقط عند التركيب.
تحلل هذه الدالة القيمة المخزنة أو تُرجع القيمة الافتراضية المقدمة.
أهمية التهيئة الكسولة
إذا حسبتم الحالة الأولية مباشرةً كوسيط، فسيُنفذ ذلك التعبير عند كل عملية تصيير، رغم تجاهله بعد المرة الأولى. أما عند تمرير دالة، فيستدعيها React مرة واحدة فقط.
تتجنبون بذلك، عند قراءة localStorage، تنفيذ عمل متزامن متكرر على الخيط الرئيسي مع كل عملية تصيير.
المزامنة عبر useEffect
لحفظ التحديثات، أضيفوا useEffect يُنفذ كلما تغيرت القيمة، ويستدعي localStorage.setItem(key, JSON.stringify(value)).
يؤدي وضع القيمة في مصفوفة التبعيات إلى كتابة كل تغيير في الحالة إلى التخزين تلقائيًا.
التحديثات الوظيفية تتجنب الإغلاقات القديمة
عند ضبط قيمة اعتمادًا على القيمة السابقة، استخدموا الصيغة الوظيفية setValue(prev => prev + 1). فهذا يتجنب الإغلاقات القديمة التي قد تؤدي إلى كتابة قيمة قديمة تم التقاطها.
ويكتسب ذلك أهمية خاصة داخل معالجات الأحداث والتأثيرات التي قد تلتقط لقطة قديمة.
معالجة قيمة مخزنة تساوي null
تُرجع getItem القيمة null عندما لا يكون المفتاح موجودًا. لذلك يجب أن يكتشف المهيئ هذه الحالة ويرجع إلى القيمة الافتراضية بدلًا من محاولة تحليل null.
يتعامل حارس مثل stored != null ? JSON.parse(stored) : defaultValue مع الزيارة الأولى بسلاسة.
الأنواع العامة في TypeScript
في TypeScript تجعلون الخطاف عامًا: function useLocalStorage<T>(key: string, initial: T). ويحافظ ذلك على نوع القيمة، بحيث يحصل المستهلكون على أمان كامل للأنواع.
تُكتب صيغة الصفيف المُرجع كالتالي: [T, Dispatch<SetStateAction<T>>]، بما يطابق useState.
إصدار البيانات المخزنة
يتغير شكل بياناتكم بمرور الوقت، وقد تؤدي القيم القديمة المخزنة إلى تعطل الشيفرة الجديدة. خزّنوا مفتاح إصدار إلى جانب البيانات حتى تتمكنوا من اكتشاف التنسيقات القديمة.
فعلى سبيل المثال، احفظوا { version: 2, data } وقارنوا الإصدار عند القراءة.
حذف البيانات عند عدم تطابق الإصدار
عندما لا يطابق الإصدار المخزن الإصدار الحالي، تجاهلوا القيمة القديمة أو رحّلوها بدلًا من الوثوق بها. تتمثل الاستراتيجية الأبسط في إزالة الإدخال القديم والرجوع إلى القيم الافتراضية.
يمنع ذلك حدوث أعطال بسبب بيانات كتبتها نسخة أقدم من تطبيقكم.
تركيب الخطاف كاملًا
يجمع useLocalStorage الكامل بين مهيئ كسول يقرأ البيانات ويحللها بأمان، ودالة ضبط تدعم التحديثات الوظيفية، وuseEffect يكتب التغييرات مباشرةً مع إدارة الإصدارات.
والنتيجة بديل مباشر لـ useState يستمر بعد إعادة التحميل.
تحقق سريع
اختبروا مدى فهمكم لتهيئة الحالة.
مراجعة
تعلمتم إنشاء خطاف useLocalStorage باستخدام مهيئ كسول، وحفظ التغييرات عبر useEffect، واستخدام التحديثات الوظيفية لتجنب الإغلاقات القديمة، ومعالجة القيم التي تساوي null.
كما تعرفتم إلى الأنواع العامة في TypeScript وإدارة الإصدارات لحذف البيانات القديمة بأمان.
الأسئلة الشائعة
هل درس «مزامنة الحالة مع localStorage» مجاني؟
نعم — نص درس «مزامنة الحالة مع localStorage» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «مزامنة الحالة مع localStorage»؟
أنشئوا خطافًا مخصصًا باسم useLocalStorage يُبقي حالة React وlocalStorage متزامنتين في الاتجاهين. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «مزامنة الحالة مع localStorage»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- قراءة localStorage والكتابة فيه في React
- مزامنة الحالة مع localStorage
- التعامل مع أحداث التخزين بين علامات التبويب
- sessionStorage وIndexedDB واختيار واجهة API المناسبة