كيفية استخدام الـ Context API في React

الـ React هي مكتبة تم إنشاؤها لبناء واجهات تفاعلية وجذابة للغاية. تستخدم ما يعرف بالمكونات (Components) لبناء الواجهات وهو ما يتيح إمكانية اعادة استخدام نفس (Component) عديد الاماكن وعديد الصفحات بتغيير بياناته فقط بطريقة ديناميكية . الـ (State) هي الجانب المسؤول عن هذا الامر و هي من الاشياء التي كانت تثير جدلا بين المطورين في مجتمع الـ React لصعوبة ادارتها ، وكما كان لم يدم المشكل طويلا وكان الحل ظهور مكتبة Redux التي حلت معضو المشكلات التي كانت تتعلق بـادارة State .

لكن ومع هذا الـ Redux تعتبر سلاحا ثقيلا معدا لدخول حرب ليس لقتال صغير (لا للعنف :sweat_smile:) فهي ليست مكتبة تستخدم حصرا في React فقط ، بل في اي مشروع Javascript و تحتاج لتعلمها دورة لوحدها .
و مع تطور React وتحديدا النسخة 16.3 تم الاعلان عن Context API يمكن القول هو محاولة من المطورين لتسهيل تمرير البيانات بين المكونات وجعل الامر اكثر بساطة واقل تعقيدا

و الان سنذهب للشرح التفصيلي شاهد هذه الشجرة من المكونات اعلم انها مؤلوفة لك

وكما نعلم جميعا يمكننا انشاء state في اي مكون من المكونات التي نريد و تمرير اي بيانات للمكونات الابناء كما فعلنا فالصورة اسفل

كما ترى في الصورة قمنا بانشاء state تحمل بيانات المستخدم وقمنا بتمرير البيانات عبر props للابناء وهكذا تباعا و الان شاهد الصورة في الاسفل

اعلم انك تفكر فيما افكر كيف سنمرر البيانات لذلك المكون باللون الاحمر في الجهة المقابلة لنقم بحل هذه المشكلة

لقد قمنا برفع الـstate لاعلى مكون وقمنا بتمرير البيانات عبر عدة مكونات لا تحتاج اصلا لتلك المعلومات وهذا فقط لتمريرها لمكون يحتاجها

الامر يزداد تعقيدا كلما زاد حجم التطبيق حتى يصل لمرحلة يصعب صيانته وتتبع الاخطاء فيها ولهذا ظهرت عديد الحلول وهي من سبق وتحدثت عنها منها Redux وهيا ليست موضوعنا و Context API لنرى نفس المثال مع Context API

نعم صديقي فالامر بعيدا عن التعقيد بسيط جدا الان الامر يتم بين موفر Provider ومستهلك Consumer الـ Provider تقوم بوضعه في اعلى المكونات التي تريد تمرير البيانات لها و تذهب الى المون وتقوم باستدعاء الـ Consumer ولهذا لا يوجد افضل من الشرح التطبيقي كيفية نقل معلومات المستخدم باستخدام الـ Context

فنفتح الصفحة src/App.js الموجودة في تطبيقنا الجديد :blush: ونقوم فقط بالابقاء على الكود الاتي :

    import React from 'react';

     class App extends React.Component {

      render() {
        return (
          <div className="App">

          </div>
        );
      }
    }

    export default App; 

اول خطورة نقوم بانشاء state و البيانات الخاصة بالمستخدم لنقم باضافة الكود التالي

    import React from 'react';

     class App extends React.Component {
      state = {
        user: {
          name: "Mohamed",
          age: 23,
          email: "[email protected]"
        }
      };

      render() {
        return (
          <div className="App">

          </div>
        );
      }
    }

    export default App; 

ونقوم بعدها بانشاء الـ Context الخاص بمعلومات المستخدم

    import React from 'react';

    // New
    const UserContext = React.createContext();  

     class App extends React.Component {
      state = {
        user: {
          name: "Mohamed",
          age: 23,
          email: "[email protected]"
        }
      };
      render() {
        return (
          <div className="App">

          </div>
        );
      }
    }

    export default App; 

و الان نحتاج للمكون الذي ستمر من خلاله البيانات ولهذا سننشئ مكون اسمه Profile

    import React from 'react';

    const UserContext = React.createContext();

    // New
    const Profile = () => (
      <div>
        
      </div>
    );

    class App extends React.Component {
      state = {
        user: {
          name: "Mohamed",
          age: 23,
          email: "[email protected]"
        }
      };

      render() {
        return (
          <div className="App">
            <UserContext.Provider value={this.state.user}>
              <Profile />
            </UserContext.Provider>
          </div>
        );
      }
    }

    export default App;

و نقوم الان بانشاء المكون الذي سيستقبل البيانات من state عبر الـ Context

    import React from 'react';

    const UserContext = React.createContext();
    // New
    const UserInfo = () => (
      <UserContext.Consumer>
      {(user) => (`Username: ${user.name} || 
                  Age : ${user.age} || 
                  Email: ${user.email} `)} 
      </UserContext.Consumer>
    );

    const Profile = () => (
      <div>
        <UserInfo />     // new
      </div>
    );

    class App extends React.Component {
      state = {
        user: {
          name: "Mohamed",
          age: 23,
          email: "[email protected]"
        }
      };
ملخص

سيتم إخفاء هذا النص

      render() {
        return (
          <div className="App">
            
          </div>
        );
      }
    }

    export default App;

قمنا اعلا بانشاء المكون UserInfo الذي سيستقبل البيانات من Provider الموجود في اعلى مكون الذي سنقوم بتعيينه الان وقمنا بجعل UserInfo كـ Consumer عبر </UserContext.Consumer> وقمنا ايضا جعله مكون ابن للمكون Profile و الان سنقوم يتغليف المكون Profile ب <UserContext.Provider value={this.state.user}> واضافة البيانات كخاصية value و الان اضف الكود التالي

    import React from 'react';

    const UserContext = React.createContext();

    const UserInfo = () => (
      <UserContext.Consumer>
      {(user) => (`Username: ${user.name} || 
                  Age : ${user.age} || 
                  Email: ${user.email} `)} 
      </UserContext.Consumer>
    );

    const Profile = () => (
      <div>
        <UserInfo />
      </div>
    );

    class App extends React.Component {
      state = {
        user: {
          name: "Mohamed",
          age: 23,
          email: "[email protected]"
        }
      };

      render() {
        return (
          <div className="App">
            // New
            <UserContext.Provider value={this.state.user}>
              <Profile />
            </UserContext.Provider>
          </div>
        );
      }
    }

    export default App;

وهكذا قمنا بتمرير البيانات من state الى المكون الابن لـ Profile بدون استعمال الـ Props ولفهم اكثر هذا رابط المثال مباشر يمكنك تجريبه استودعكم الله
اضغط هنا

7 Likes

الله يبارك فيك يأخي شكرا على شرحك :smiling_face_with_three_hearts:

3 Likes

العفو اخي :black_heart:

3 Likes

شرح ممتاز وطريقة ايصال المعلومة هكذا جميلة جداً ومرتبة :clap::clap::clap: شكراً جزيلاً

5 Likes

ماشاء الله خويا حسين المقال في غاية الروعة و شرح بمستوى عالمي :heart_eyes:

الحقيقة أنا لم أستعمل React من قبل لكن بما أنني استعملت Flutter من قبل و عارف التشابه الكبير بين هاتين الفرايمووركس والمشاكل المشتركة في ال state management لذلك أتمنى فعلا المزيد من الشروحات حول مواضيع ال state management لأنها مهمة لكل مطوري الفرونت و خاصة بوجود شرح رائع مثل شرحك :heart:

شكرا لك على المقال صديقي و أكيد لا للعنف :joy:

3 Likes

العفو و شكرا لكلامك المحفز اخي :black_heart:

2 Likes

نعم اخي هي نفس المفاهيم في اغلب الفريم ووركس مع اختلاف في التنفيذ و التطبيق فقط
وان شاء الله ساكمل شرحي لها و استعمالها مع React hook
وشكرا لكلامك الجميل :black_heart: لكي لا ننسى لا للعنف :joy:

2 Likes

يعطيك العافية صديقي حسين

شرح ممتاز وانطلاقة رائعة لك في مجتمع كورتابز، فأهلا بك

بالنسبة لي تخليت عن استخدام React في المشاريع التي تتطلب State Management على Components Tree كبيرة، صحيح أن الـ Context API سهلت المهمة كثيرًا، لكن الكود ازداد تعقيدًا بوجود المزيد من الـ Providers والـ Consumers :dizzy_face:

بانتظار جديدك مع الـ React Hooks :wave:

2 Likes

شكرا لك على الترحيب اخي لؤي :blush:

لماذا تخليت عن React فالامور اصبحت اكثر سلاسة مع React hooks فالـ Redux و Context API يدعمان الـ Hooks وهو الامر الذي جعل من اصعب المشكلات حل بسيط جدا اقترح عليك تجربة الامر اذا كانت لك مدة طويلة غائب عنها

ان شاء الله اخي في القريب :ok_hand:

2 Likes

اهلا بك حسين @elBatel في مجتمعنا, وشكرا لك على هذا المقال.

يبدوا انه اصبح لدينا مؤيد جديد لمكتبة react :heart_eyes:, الكثير من الاخوة هنا من المحترفين في استخدام Vue

وبالفعل ال context api تحل مشكلة prop drilling والتي تعني تمرير ال prop من اعلى شجرة المكونات الى الاسفل لتتمكن المكونات هناك من تشارك خاصية او كائن ما.

بانتظار مقالات اخرى عن react و خصوصا ال hooks :+1:

3 Likes

ما تخليت عنها تماما، لكني فضلت حلول مناسبة أكثر لهيك نوعية من المشاريع

لم تتح لي الفرصة لتجربة الوضع مع الـ Hooks، لكن إنشالله بنجربها معك :crossed_fingers:

2 Likes

شرح ابداعي صراحة…

تعتبر دائما الـ state management من أعقد المواضيع في الفرونت، لكن شرحك لها جعلها بقمة السهولة :ok_hand:

2 Likes

شكرا لكلامك الجميل اخي ياسر :black_heart:
ساحاول في قادم المنشورات ان شاء الله ازالة التعقيد عن هذا الامر

1 Like

شرح رائع ومبسط ومشكور عليه :heart:

2 Likes

خليل احضر كل الفريق و لنحط الرحال هنا الجو جميل هنا :joy: :joy: :joy:

2 Likes

خلاص درك نجيب كامل دوزاتي ونتحول لهنا :laughing:

2 Likes

اه أنا لست معتاد على رياكت كثير

لكن لم أجد أسهل من vuex في إدارة الحالة (state management)

وفقت أخي حسين في الطرح … أنتظر منك هاته الدورات على قناتك قريبا … أتحفنا :heart_eyes:

2 Likes

شكرا اخي اسامة في القريب ان شاء الله

1 Like

شكرا اخي… سبق لي استخدام redux وهي معقدة فعلا وفي كل مرة اراجع بعض الملخصات عند إعادة استخدامها

باذن الله ابدا في تصفح ال context

3 Likes

نعم هيا معقدة قليلا مع الممارسة يصبح الامر روتيني و redux من افضل state management في الساحة :black_heart:

1 Like