useLocalStorage خطّاف التخزين المحلي

آخر تحديث: 2026-11-03

useLocalStorage خطّاف التخزين المحلي

يبقي useLocalStorage قراءات useState وكتابتها متزامنة مع localStorage: يقرأ القيمة المخزّنة كسولاً أثناء التهيئة، ويكتبها إلى القرص عند كل تحديث، فتنجو الحالة من إعادة تحميل الصفحة. وهو المثال النموذجي لخطّاف مخصّص يلتفّ على واجهة متصفح أصلية. ودالة التحديث المعادة تتصرّف تماماً كدالة useState، فلا يحتاج المستدعي إلى تعلّم واجهة ثانية لمجرد الحصول على الحفظ مجاناً.

المجموعةأنماط المكونات
النوعخطاف
منذ الإصدارReact 16.8

ℹ️ ملاحظة يحوّل المحرّر JSX إلى JavaScript ويعرض الواجهة الحقيقية داخل بيئة معزولة؛ تُركَّب المكوّنات تلقائياً دون استدعاء render يدوي.

📝 الصيغة

function useLocalStorage(key, initial) {
  const [value, setValue] = useState(() => {
    const saved = localStorage.getItem(key)      // تهيئة كسولة: اقرأ مرة واحدة فقط
    return saved !== null ? JSON.parse(saved) : initial
  })
  useEffect(() => {
    localStorage.setItem(key, JSON.stringify(value))
  }, [key, value])
  return [value, setValue]
}

⚙️ المعاملات

keyمفتاح التخزين في localStorage؛ ضع بادئة باسم تطبيقك لتفادي التصادم.
initialالقيمة المستخدمة حين لا يوجد شيء مخزّن محلياً؛ ويُقبل أي نوع قابل للتحويل إلى JSON.

القيمة المرجعة:يعيد زوجاً [القيمة، setValue] يعمل تماماً مثل useState، عدا أن القراءات والكتابات تُحفظ تلقائياً في localStorage.

▶ مثال

المثال يعمل مباشرة: يُعرض تلقائياً عند التوسيع وتظهر التعديلات فوراً.

الناتج:

يزيد الضغط على الزر العدّاد ويكتبه في localStorage؛ وبعد إعادة التحميل أو فتح الصفحة من جديد يبقى العدد كما هو، ويعيد «Reset» إرجاعه إلى الصفر.

💡 النقاط الأساسية

💡 نصيحة مرّر دالة للتهيئة حتى تُقرأ القيمة كسولاً، فتتجنّب لمس localStorage في كل عرض — فهو إدخال وإخراج متزامن وليس رخيصاً.
ℹ️ ملاحظة خزّن الكائنات والمصفوفات عبر تحويل JSON، واحمِ القراءة بـ try/catch تحسّباً لقيمة مخزّنة تالفة أو معدّلة يدوياً.
⚠️ تحذير ‏localStorage مشترك لكل أصل ومحدود بحوالي 5 ميغابايت، فلا ينبغي أبداً تخزين بيانات حسّاسة مثل الرموز فيه كنص صريح.
المزيد من الحالات قريباً.

📚 دروس ذات صلة

❓ الأسئلة الشائعة

س هل سيرمي خطأً في بيئة SSR؟
ج نعم، فلا window ولا localStorage على الخادم. احمِ القراءة بفحص typeof window أو انقلها إلى useEffect.
س ما الفرق عن استخدام useState مباشرة؟
ج يضيف طبقة حفظ: القيمة الابتدائية تأتي من القرص، وكل تغيير يُكتب تلقائياً، وتبقى الواجهة مطابقة تماماً لـ useState.
س لماذا نحوّل الكائن إلى JSON عند تخزينه؟
ج لا يستطيع localStorage حمل سوى نصوص؛ وبدون التحويل ستخزّن «[object Object]» ولن تتمكّن أبداً من استعادة القيمة.
Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%