اذهب إلى المحتوى

Hassan Hedr

الأعضاء
  • المساهمات

    2846
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    38

إجابات الأسئلة

  1. إجابة Hassan Hedr سؤال في كيف يمكن فك تشفير كلمة السر المخزنة في قاعدة البيانات في لارافل؟ كانت الإجابة المقبولة   
    عملية التقطيع أو Hashing هي عملية تحويل قيمة إلى أخرى بنفس الطريقة دومًا، لكن دون إمكانية الرجوع من النتيجة إلى القيمة الأصل، لذا نصفها بأنها باتجاه واحد فقط، يفيد ذلك في التحقق من المساواة بين القيم دون الحاجة لتخزين القيمة الأصلية، فقط تخزين القيمة المقطّعة، ولاحقًا يمكنك التأكد من مطابقة قيمة ما مع القيمة المخزنة لديك بتمريرها على نفس خوارزمية التقطيع ومقارنة تساوي النتيجتين،
    في حالتك عادة لا نخزن كلمات السر كما هي في قاعدة البيانات لأغراض أمنية، بل نخزن قيمة Hash لها، وعندما يحاول المستخدم تسجيل الدخول نتأكد من صحة كلمة المرور التي أدخلها بتمريرها على نفس خوارزمية التقطيع، وإذا تطابقت النتيجتين فالكلمة صحيحة، أي لا نقارن كلمات السر مباشرة، بل نطابق قيم Hash لها

    يمكنك الاستفادة من قراءة المقالات التالية:
     
  2. إجابة Hassan Hedr سؤال في كيفية إستدعاء ملف PHP من داخل ملف عرض view في لارافيل Laravel؟ كانت الإجابة المقبولة   
    يمكنك إضافة مسار المجلد الحاوي على ملفات PHP التي تريد إضافتها ضمن ملف الإعداد config\view.php تحديدًا ضمن القيمة paths كالتالي: 
    'paths' => [ .. public_path('php/scripts') ], بعدها يمكن استخدام include@ ضمن ملفات العرض لديك وذكر مسار الملف النسبي بدءًا من المجلد scripts كالتالي:
    @include('helpers')  
  3. إجابة Hassan Hedr سؤال في كيفية تشغيل وضع الإصلاح maintenance mode في لارافيل Laravel؟ كانت الإجابة المقبولة   
    يمكنك إضافة مسار مخصص عند الوصول إليه سيتم تنفيذ أمر Artisan لتغيير حالة وضع الإصلاح، وحماية هذا المسار بطريقة ما بحسب تطبيقك للوصول إليه فقط من المستخدم صاحب الصلاحية لذلك مثلًا كالتالي: 
    // حماية الوصول للمسارات Route::middleware('auth')->group(function(){ // تنشيط وضع الإصلاح Route::get('/app-down', function(){ Artisan::call('down'); }); // إيقاف وضع الإصلاح Route::get('/app-up', function(){ Artisan::call('up'); }); }); بعد ذلك وبعد تسجيل الدخول كمستخدم لديه صلاحية الوصول لتلك المسارات يمكنك الاتصال بالمسار التالي لتنشيط وضع الإصلاح (مع تبديل اسم النطاق بحسب تطبيقك):
    http://domain.com/app-down والمسار التالي لإيقاف ذلك الوضع وتشغيل التطبيق مجددًا
    http://domain.com/app-up  
  4. إجابة Hassan Hedr سؤال في كيفية معرفة عدد الكائنات في علاقة one to many في لارافيل Laravel؟ كانت الإجابة المقبولة   
    يمكن الاستفادة من التابع withCount وتمرير اسم العلاقة التي تحاول عد السجلات فيها ليصبح الاستعلام عن التصنيفات كالتالي:
    $categories = Category::with("users")->withCount("users")->get(); سيضيف ذلك خاصية جديدة بالاسم users_count لكل نموذج من النتيجة يشير إلى عدد المستخدمين المرتبط بهذا النموذج:
    foreach($categories as $category) { echo $category->users_count; // عدد المستخدمين في هذا التصنيف }  
  5. إجابة Hassan Hedr سؤال في هل يمكن توليد قالب blade من خلال نص في لارفيل Laravel؟ كانت الإجابة المقبولة   
    يمكن الاستعانة بالواجهة Blade والاستفادة من التابع render ضمنها لترجمة نص من صيغة blade، ويمكن تمرير النص كمعامل أول ثم مصفوفة المتغيرات المستخدمة ضمن النص كمعامل ثاني، ليصبح المثال لديك كالتالي:
    use Illuminate\Support\Facades\Blade; echo Blade::render('<h2>Hello, {{ $name }}</h2>', ['name' => 'Emad Saif']); // <h2>Hello, Emad Saif</h2>  
  6. إجابة Hassan Hedr سؤال في كيفية توليد نموذج model في مجلد معين في لارافيل Laravel؟ كانت الإجابة المقبولة   
    يمكنك تعيين اسم النطاق namespace الكامل للنموذج لتحديد مكانه، وفي حالتك لوضع النموذج داخل المجلد mainModels يمكنك تنفيذ الأمر كالتالي:
    php artisan make:model App\\mainModels\\User أما في حال كنت تريد إنشاء النموذج خارج مجلد التطبيق app، فيمكنك تمرير المسار النسبي انطلاقًا من مجلد التطبيق app، مثلًا لو كان لديك مجلد Models بجانب المجلد app وتريد إنشاء نموذج مستخدم User في ذلك المجلد كالتالي:
    app/ ├─ ... Models/ ├─ User.php يمكنك تمرير المسار النسبي لذلك المجلد لأمر التوليد كالتالي:
    php artisan make:model ../Models/User  
  7. إجابة Hassan Hedr سؤال في هل توجد دالة before_save في النماذج models في لارافيل Laravel؟ كانت الإجابة المقبولة   
    يمكن تنفيذ تعليمات خلال مراحل معينة من دورة حياة النموذج Model، يمكنك تسجيلها ضمن التابع booted ضمن صنف النموذج، التوابع التي ستستخدمها لحالتك هي:
    saving يتم تنفيذه قبل حفظ النموذج saved يتم تنفيذه بعد حفظ النموذج ويمكنك داخلها الوصول لكائن النموذج الذي تتم عملية الحفظ عليه من خلال المعامل post$ الممرر للتابع الذي تسجله لكل حدث من تلك الأحداث بالشكل التالي:
    class Post extends Model { protected static function booted() { static::saving(function ($post) { // قبل الحفظ }); static::saved(function ($post) { // بعد الحفظ }); } }  
  8. إجابة Hassan Hedr سؤال في كيف تتعامل مع التراكم الكبير في الاعمال؟؟ كانت الإجابة المقبولة   
    رتب أولوياتك لا يجب أن تقبل كل عمل يعرض عليك، بل عليك اختيار أفضلها وما يناسبك من ناحية الربح والوقت والجهد اللازم لإتمامه دون التضحية بالجودة أو بالالتزام بوقت التسليم، في حال تكرار بعض الأعمال الروتينية التي يمكنك تفويضها حددها أولًا وابحث عن أشخاص يمكنهم إنجازها بشكل دوري كي تتفرغ للاهتمام بباقي الأعمال بأكبر كفاءة ممكنة، تذكر أن نتائج التعهيد مسؤوليتك، لذا يجب الاهتمام بمن تعهد وبالمتابعة الدائمة مع المستقل، يمكنك الاستفادة من قراءة المقالات التالية:  
     
  9. إجابة Hassan Hedr سؤال في ما هي فائدة الملفات console.php و channels.php في لارافيل Laravel؟ كانت الإجابة المقبولة   
    يوجد عدة طرق للتواصل مع التطبيق أي القناة التي تمر عبرها بيانات الدخل وتصل بيانات الخرج إلى المستخدم، حيث نُعرّف داخل الملفات ضمن مجلد routes الطرق بأنواعها العديدة المؤدية إلى التطبيق وكيفية توجيه الطلبات القادمة عبر أي نوع من القنوات والملفات لتلك القنوات هي:
    ملف web.php للتواصل عبر الويب وطلبات HTTP عن طريق المتصفح. ملف api.php للتواصل عبر الواجهة البرمجية للتطبيق بطلبات مثل AJAX لطلب صيغ مثل JSON. ملف console.php للتواصل عبر الطرفية وسطر الأوامر باستخدام artisan. ملف channels.php للتواصل عبر قنوات الاتصال الحية مثل مقابس الويب WebSockets. استخدم كل ملف منها لتعريف التوجيه لكل نوع من أنواع التواصل مع تطبيقك التي ترغب بها، ومن الشائع عند تطوير الويب تعريف التوجيه ضمن مسارات web.php وإذا دعت الحاجة لتعريف بعض المسارات للواجهة البرمجية للتطبيق API ضمن ملف api.php وذلك لدعم بعض الواجهات التي تُصيّر Renders بطرف العميل 
  10. إجابة Hassan Hedr سؤال في كيفية معرفة عدد المستخدمين المسجلين في الموقع خلال السنة الحالية في لارافيل Laravel؟ كانت الإجابة المقبولة   
    قيمة أقدم تاريخ تسجيل يجب أن تكون أول يوم من السنة الحالية، ما تمرره هو تاريخ اليوم الحالي لذا يجب استخدام التابع startOfYear لتمرير قيمة أول يوم من السنة الحالية كالتالي:
    $users = User::select('email')->whereDate('created_at', '>', now()->startOfYear())->count(); أو يمكن الاستفادة مباشرة من تابع الاستعلام whereYear وتمرير السنة التي نريد الاستعلام عنها لتصبح الشيفرة أوضح عند قراءتها كالتالي: 
    $users = User::select('email')->whereYear('created_at', '=', now()->year)->count();  
  11. إجابة Hassan Hedr سؤال في ما فائدة new في جافا سكربت كانت الإجابة المقبولة   
    عند استدعاء Date كتابع فإن الناتج من تلك العملية سيكون سلسلة نصية تعبر عن التاريخ الحالي، كلمة new تفيد في بناء كائنات من صنف أو تابع يعامل معاملة التابع الباني، وعند استدعاء نفس التابع مسبوقًا بكلمة new، سيُنشئ جافاسكربت كائن فارغ جديد object ويربطه bind بعملية تنفيذ ثم يربط ال prototype لذلك التابع بهذا الكائن ويعيد ذلك الكائن كناتج من تلك العملية،
    الفائدة من ذلك أن كل التوابع المعرفة ضمن prototype التابع الباني سيتم تعيينها ضمن الكائن الجديد، وأن أي متغيرات يتم تعيينها ضمن التابع على الكلمة this سيتم تعيينها ضمن الكائن أيضًا، أي الهدف من الكلمة new هي إنشاء نسخة كائن جديدة تحمل صفات التابع الباني، أو ما يشبه في لغات البرمجة كائنية التوجة الأخرى عملية إنشاء كائن جديد من صنف class، يمكنك الاستفادة من قراءة المقالات التالية:
     
  12. إجابة Hassan Hedr سؤال في أشعر أنني ضعيف بأساسيات لغة جافاسكربت ماذا أفعل؟ كانت الإجابة المقبولة   
    حاول الرجوع إلى مسار الأساسيات وتدرب عليها وادرسها أكثر، التقدم إلى الدروس اللاحقة دون تمكين الأساسيات كلها أو إهمال بعضها سيعرضك لمشاكل في فهم الدروس اللاحقة وتشعر أنك لا تستطيع التطبيق أو فهم الدروس، ركز على التطبيق العملي لتلك الأساسيات وطور برامج بسيطة تستخدم فيها ما تعلمت، من ضمنها التمارين ضمن مسار الأساسيات ولا تتجاوز أي فكرة لا تفهمها، يمكنك الاستفادة من قراءة المقال التالي:
     
  13. إجابة Hassan Hedr سؤال في كيف اتعلم ادارة السيرفرات والنطاقات كانت الإجابة المقبولة   
    أنصحك بالقراءة عن ما تتعامل معه فقط، وحاول فهمه وطريقة عمله ولماذا يستخدم، لأن مجال إدارة الخوادم و DevOps واسع ومتشعب، مثلًا إبدأ بالقراءة عن DNS بشكل عام وما هي وظيفته وما هي أنواع السجلات Records ضمنه، يمكنك الاستفادة من قراءة المقالات:
    ثم تعرف على خوادم الويب مثل Apache وما هي وظيفتها الأساسية دون التعمق في ذلك، وتعرف على ملف الإعدادات الفرعي الذي يستخدمه htacess. وما هي الأوامر الأساسية الممكن إعدادها ضمنه لمختلف الحالات، لهذا الملف بالذات أنصحك بالرجوع للتوثيق الرسمي لكل أمر تستخدمه والقراءة عنه أكثر، ويمكنك الاستفادة من قراءة المقالات:
    مع الممارسة ومواجهة مشاكل جديدة في كل مرة ستزيد خبرتك، المهارة الأساسية التي تحتاجها هي البحث عن حلول للمشاكل والقراءة ضمن المراجع والتوثيقات أو الحلول المقترحة،
    بالتوفيق لك 
  14. إجابة Hassan Hedr سؤال في مشكلة في إضافة عنصر باستخدام append في جافاسكربت كانت الإجابة المقبولة   
    يجب تمرير العنصر المخزن ضمن الثابت hhart ليتم إضافته وليس تمرير سلسلة نصية تحمل نفس اسم الثابت، فبذلك سيتم إضافة نص داخل ذلك العنصر، لحل المشكلة يجب تعديل شيفرة الإضافة لتصبح كالتالي:
    contenerheart.append(hhart);  
  15. إجابة Hassan Hedr سؤال في مشكلة في عرض ترقيم الصفحات pagination في لارافيل؟ كانت الإجابة المقبولة   
    في حال كنت تستخدم Bootstrap لتنسيق الموقع تأكد من توجيه المتصفح Paginator لاستخدام تنسيقات Bootstrap وذلك باستدعاء useBoostrap ضمن أحد مزودات الخدمة المسجلة في التطبيق، مثل AppServiceProvider كالتالي:
    use Illuminate\Pagination\Paginator; class AppServiceProvider extends ServiceProvider { public function boot() { Paginator::useBootstrap(); } } يمكنك الاستفادة من قراءة المقال التالي:
     
  16. إجابة Hassan Hedr سؤال في pagination في swiper js لا يعمل كانت الإجابة المقبولة   
    نعم أحسنت لقد حصرت المشكلة، تأكد من إرفاق تنسيقات CSS للمكتبة ضمن ملف جافاسكربت في حال كنت تستخدم محزم مثل webpack كالتالي:
    import 'swiper/css'; import 'swiper/css/navigation'; import 'swiper/css/pagination';  
  17. إجابة Hassan Hedr سؤال في طلب مراجعة شيفرات PHP وتحديد الثغرات الأمنية والحماية منها كانت الإجابة المقبولة   
    إذا كنت ترغب بتوظيف مستقل لمراجعة الشيفرات الخاصة بك وتقديم النصائح لتحسينها يمكنك إضافة عرضك على موقع مستقل وشرح المطلوب بالتفصيل وسيتقدم من لديه الخبرة بعرضه ويمكنك الاتفاق معه على التفاصيل،
    أما في حال رغبت بالتأكد منها بنفسك فيمكنك الاطلاع على أفضل ممارسات الحماية ومنع الهجمات وطرق تضمينها من قراءة المقال التالي، حيث يكفي مراجعة هذه الثغرات وتطبيق طرق الحماية منها ضمن تطبيقك لزيادة الحماية والأمن على موقعك الالكتروني:
     
  18. إجابة Hassan Hedr سؤال في ما هو عمل الخطاف useEffect في React كانت الإجابة المقبولة   
    الخطاف useEffect يستخدم لتنفيذ تابع ما في أحد الحالات التالي:
    عند أول ظهور للمكون useEffect(() => { //.. }, [])  
    عند كل تصيير render للمكون useEffect(() => { //.. })  
    عند كل تغير لقيمة متغير أو عدد من المتغيرات useEffect(() => { //.. }, [x, y])  
    بحسب الحالة التي لديك قد يفيدك تنفيذ تابع ما في إحدى هذه الحالات، تختار منها ما يناسبك وتطبقها، يمكنك الاستفادة من قراءة المقالات التالية ولاحظ كيف يتم توظيف أحد تلك الحالات دومًا لتنفيذ حل لمشكلة ما:
     
  19. إجابة Hassan Hedr سؤال في كيف سيتم متابعتي أثناء حضوري للدورة من قبل الفريق المختص كانت الإجابة المقبولة   
    يوجد فريق من المدربين متواجد دومًا لمساعدتك إذا كان لديك أي استفسار أو مشكلة تواجهها متعلقة بدروس الدورة، كل ما عليك فعله هو التعليق أسفل الدرس الذي تواجه به المشكلة وشرح مشكلتك بالتفصيل، أو طرح استفسارك وسيتابع معك أحد أفراد الفريق ويرد على استفساراتك ويشرح لك، ويساعدك في حل المشاكل التي تواجهها، هدف الفريق مساعدتك عند الحاجة، يمكنك قراءة التعليقات السابقة لزملائك ولاحظ كيف يطرحون استفساراتهم ومشاكلهم ويتم الرد عليهم من قبل أعضاء الفريق،
    بالتوفيق لك في دراستك
  20. إجابة Hassan Hedr سؤال في لماذا بعض مواقع laravel يمكنك تشغيلها بدون الأمر php artisan serve كانت الإجابة المقبولة   
    لتخديم ملفات مشروع laravel يجب وجود خادم ويب يعمل سواء كان الخادم المحلي الخاص بـ PHP والذي يُستخدم عند تنفيذ الأمر php artisan serve، أو وجود خادم آخر على الجهاز مثل WAMPP، مهمة خادم الويب تحويل الطلبات المتوجهة إليه والتي تطلب الموقع إلى أمر PHP لتنفيذ ملفات إطار عمل Laravel وإرجاع نتيجة التنفيذ لتلك الملفات،
    حتى ولو كان الموقع لا يستخدم PHP ويستخدم فقط ملفات ثابتة يجب وجود خادم ويب يستطيع تخديم تلك الملفات للعميل عند ورود طلب HTTP إليه، يمكنك الاستفادة من المقال التالي للتعرف على طريقة تخديم المواقع من خلال خادم الويب:
     
  21. إجابة Hassan Hedr سؤال في كسب المال من الإنترنت كانت الإجابة المقبولة   
    فكر بالقيمة المضافة لعملك المنجز سواء لك أو لصاحب المشروع، ملئ الاستبيانات بهوية وهمية أو حقيقية مقابل رأي زائف والقليل من الربح لن يضيف لك على المدى البعيد، هناك الكثير من المهارات التي يمكنك أن تستثمر وقتك بها وتعود عليك بالفائدة ولصاحب المشروع، هناك الكثير من الأعمال والمهارات المطلوبة، مثل الترجمة والتصميم والبرمجة وتقريبًا كل المهارات التي يمكنها أن تساهم في مشروع ما،
    حدد المجال الذي تفضله أو لديك شغف به، واستثمر فترة من وقتك في التعلم المستمر وتطوير الذات، بعد ذلك ستستغل هذه المهارة وتقدم الأعمال مقابل المال، الأمر الذي سيعود عليك بالفائدة على المدى الطوير لأن كل عمل تنجزه سيضاف إلى معرض أعمالك ويتيح لك فرصًا أكبر مستقبلًا، على عكس وظيفة ملئ الاستبيانات، قارن بين مترجم يعمل منذ سنة ومالئ استبيانات يعمل منذ سنة أيضًا، أيهما تطورت مهاراته وزادت فرصه وحتى ربحه،
    أنصحك بقراءة كتاب "طريقك إلى العمل الحر عبر الإنترنت" وكتاب "دليل المستقل والعامل عن بعد" فهي ستوضح لك الطريق بالكامل، بدءًا من المجالات التي يمكنك العمل فيها، إلى طريقة التسويق لنفسك واستلام المشاريع والتربح منها:
     
  22. إجابة Hassan Hedr سؤال في استفسار عن الشروط و الاحكام الخاصة بالموقع كانت الإجابة المقبولة   
    سياسة الخصوصية هي تصريح رسمي من موقعك للمستخدمين يوضح فيها طريقة استخدام بياناتهم ويلزمك ذلك قانونيًا، أي توضح كيف ستستخدم بيانات المستخدمين ومع من ستشاركها وما هي الحالات التي تسمح لك بمشاركة تلك البيانات الشروط والأحكام هي كاتفاق بينك وبين مستخدم الموقع، توضح فيه ما لك وما عليك، مثلًا تفرض شروط على المستخدم بعدم إساءة استخدام خدمتك أو استخدامها لأغراض غير قانونية الغرض من تلك التصريحات قانوني، الجهة التي تطلب منك وجود تلك التصريحات ضمن موقعك هدفها مراجعتها والتأكد أن شروط استخدامك توافق شروط الأفراد الذين يرغبون بالتعامل معهم، يمكنك إما استشارة محامٍ مختص ولديك خبرة بتلك التفاصيل، أو الدخول إلى تلك الصفحات على المواقع الأخرى التي تشبه خدمة موقعك، وستلاحظ نمطًا متكررا من الشروط يفرضها جميع تلك المواقع يمكنك الاستفادة منها لكتابة شيء مشابه، مثلًا موقع أكاديمية حسوب يحوي صفحة لبيان الخصوصية، وصفحة لإرشادات الاستخدام
    يمكنك الاستفادة أيضًا من أجوبة الأسئلة التالية:
     
     
  23. إجابة Hassan Hedr سؤال في مشكلة في إضافة shortcode ضمن HTML في ووردبرس كانت الإجابة المقبولة   
    أنشئ ال shorcode الخاص بك كما ذكرت لك سابقًا:
    function my_custom_link() { $id = ...; return '<meta http-equiv = "refresh" content = "0; url = https://www.simple.com/'. $id .'"/" />'; } add_shortcode('my_link', 'my_custom_link'); ولقيمة ال id يمكنك تنفيذ ال shortcode الخاص بالإضافة عن طريق التابع do_shortcode كالتالي:
    $id = do_shortcode('[test]'); وضمن نص المنشور أو الصفحة تضيف فقط ال shorcode الخاص بك دون الحاجة لاستخدام مكون HTML:
    [my_link]  
  24. إجابة Hassan Hedr سؤال في خطأ في معاينة صفحات HTML للموقع باستخدام إضافة Live Server كانت الإجابة المقبولة   
    بما أنه لا يوجد صفحة بالاسم index.html وهو اسم الصفحة الرئيسية عادة، فإن خادم إضافة Live Server في VSCode يعرض لك كافة الملفات الموجودة في المجلد الحالي المفتوح ضمن VSCode للاختيار منها، يمكنك إما الضغط على اسم الصفحة التي تريدين معاينتها من هذه الصفحة، أو من VSCode يمكنك مباشرة الضغط بالزر الأيمن على ملف الصفحة الذي تريدين معاينته واختيار "Open with Live Server"

  25. إجابة Hassan Hedr سؤال في ما الفرق بين Redux  و Context API في React؟ ومتى أستعمل كلًا منهما؟ كانت الإجابة المقبولة   
    يمكن اعتبار Redux كمخزن مركزي لحالة التطبيق، يتم إرسال الأحداث إليه من كل المكونات مع تفاصيل عن تلك الأحداث، ويتم التحقق من تلك الأحداث وتحديث الحالة ضمن المخزن بناءًا على شروط موضوعة ضمن reducers، مكتبة Redux كانت موجودة لتحل مشكلة مركزية الحالة قبل وجود Context API، لكن بعد إطلاق تلك الميزة في React أصبح من السهل التعامل مع مشاركة الحالة لعدد من المكونات المتباعدة ضمن شجرة مكونات التطبيق دون الحاجة لمكتبات مثل Redux، 
    يتميز Redux باستخدام reducers لتحديث حالة المخزن وهي توابع تتلقى الأحداث وتغير حالة قسم من بيانات المخزن، لكن يمكن تطبيق نفس الفكرة باستخدام Context API مع الخطاف useReducer.
    مزايا كل من الطريقتين:
    Context API: يأتي مسبقًا مع رياكت ولا يحتاج إلى إعداد، ممتاز للبيانات الثابتة مثل حالة الواجهة أو بيانات سيتم تحديثها محليًا فقط. Redux: يحتاج لتثبيت مكتبته وإعدادها، ويحتاج إلى الكثير من الكتابة المتكررة أغلب الوقت لتنفيذ نفس الوظيفة، ويمكن بسهولة إعداده ليتعامل مع البيانات الديناميكية أثناء معالجة حالة التطبيق (كجلب بيانات من خادم نظام خلفي)، ويتوفر له أدوات مطور قوية تساعد حلى تعقب وحل المشاكل بسهولة. في حال كانت الحالة ضمن تطبيقك معقدة ومترابطة بين عدة مكونات وأقسام وتحتاج لمعالجة بيانات ديناميكية تدخل في حساب حالة التطبيق، استخدم Redux، عدا ذلك Context API أسهل وأبسط.
    يمكنك الاستفادة من قراءة المقالات التالية:
     
×
×
  • أضف...