شرح الدالة createContext في React

ما هو createContext؟

createContext يسمح لك بإنشاء سياق (context) يمكن للمكونات توفيره أو قراءته.

كيفية الاستخدام

إنشاء السياق

تقوم بإنشاء السياق باستخدام createContext خارج أي مكون.

import { createContext } from 'react';

const ThemeContext = createContext('light');


المعاملات

  • defaultValue: القيمة الافتراضية التي تريد أن يكون للسياق عندما لا يوجد مزود سياق مطابق في الشجرة فوق المكون الذي يقرأ السياق. إذا لم يكن لديك أي قيمة افتراضية ذات معنى، يمكنك تحديد null.

العائدات

createContext يعيد كائن سياق. هذا الكائن لا يحمل أي معلومات بحد ذاته، بل يمثل السياق الذي تقرأه أو توفره المكونات الأخرى.


خصائص كائن السياق

  • SomeContext.Provider: يسمح لك بتوفير قيمة السياق للمكونات.
  • SomeContext.Consumer: طريقة بديلة ونادرًا ما تُستخدم لقراءة قيمة السياق.

استخدام SomeContext.Provider

لتحديد قيمة السياق لجميع المكونات داخل المزود:

import React, { useState } from 'react';
import { ThemeContext } from './ThemeContext';

function App() {
  const [theme, setTheme] = useState('light');

  return (
    <ThemeContext.Provider value={theme}>
      <Page />
    </ThemeContext.Provider>
  );
}


استخدام SomeContext.Consumer

قبل وجود useContext، كانت هناك طريقة قديمة لقراءة السياق:

import React from 'react';
import { ThemeContext } from './ThemeContext';

function Button() {
  return (
    <ThemeContext.Consumer>
      {theme => (
        <button className={theme} />
      )}
    </ThemeContext.Consumer>
  );
}


الطريقة الموصى بها باستخدام useContext

الطريقة الحديثة والمفضلة لقراءة السياق هي باستخدام useContext:

import React, { useContext } from 'react';
import { ThemeContext } from './ThemeContext';

function Button() {
  const theme = useContext(ThemeContext);
  return <button className={theme} />;
}


استيراد وتصدير السياق من ملف

يمكنك تنظيم الكود الخاص بك عن طريق استيراد وتصدير السياق من ملف منفصل:

// ThemeContext.js
import { createContext } from 'react';

const ThemeContext = createContext('light');
export default ThemeContext;


ثم يمكنك استيراده في الملفات الأخرى:

// App.js
import React, { useState } from 'react';
import ThemeContext from './ThemeContext';

function App() {
  const [theme, setTheme] = useState('light');

  return (
    <ThemeContext.Provider value={theme}>
      <Page />
    </ThemeContext.Provider>
  );
}






استخدام createContext

createContext يسمح للمكونات بتمرير المعلومات بعمق دون الحاجة إلى تمرير props بشكل صريح.

إنشاء السياق

قم باستدعاء createContext خارج أي مكونات لإنشاء سياق واحد أو أكثر.

import { createContext } from 'react';

const ThemeContext = createContext('light');
const AuthContext = createContext(null);


قراءة السياق باستخدام useContext

يمكن للمكونات قراءة السياق عن طريق تمريره إلى useContext:

import { useContext } from 'react';
import { ThemeContext, AuthContext } from './Contexts.js';

function Button() {
  const theme = useContext(ThemeContext);
  // ...
}

function Profile() {
  const currentUser = useContext(AuthContext);
  // ...
}


توفير قيم ديناميكية للسياق

السياق يكون مفيدًا لأنه يمكنك توفير قيم ديناميكية من مكوناتك:

import React, { useState } from 'react';
import { ThemeContext, AuthContext } from './Contexts.js';

function App() {
  const [theme, setTheme] = useState('dark');
  const [currentUser, setCurrentUser] = useState({ name: 'Taylor' });

  return (
    <ThemeContext.Provider value={theme}>
      <AuthContext.Provider value={currentUser}>
        <Page />
      </AuthContext.Provider>
    </ThemeContext.Provider>
  );
}


الآن، مكون Page وأي مكونات داخله، بغض النظر عن عمقها، ستتمكن من “رؤية” قيم السياق الممررة. إذا تغيرت قيم السياق الممررة، سيقوم React بإعادة تصيير المكونات التي تقرأ السياق أيضًا.



استيراد وتصدير السياق من ملف

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

// Contexts.js
import { createContext } from 'react';

export const ThemeContext = createContext('light');
export const AuthContext = createContext(null);


ثم يمكن للمكونات المعلنة في ملفات أخرى استخدام جملة import لقراءة أو توفير هذا السياق:

// Button.js
import { useContext } from 'react';
import { ThemeContext } from './Contexts.js';

function Button() {
  const theme = useContext(ThemeContext);
  // ...
}

// App.js
import { ThemeContext, AuthContext } from './Contexts.js';

function App() {
  // ...
  return (
    <ThemeContext.Provider value={theme}>
      <AuthContext.Provider value={currentUser}>
        <Page />
      </AuthContext.Provider>
    </ThemeContext.Provider>
  );
}


استكشاف الأخطاء وإصلاحها

لا أستطيع العثور على طريقة لتغيير قيمة السياق

الكود مثل هذا يحدد قيمة السياق الافتراضية:

const ThemeContext = createContext('light');


هذه القيمة لا تتغير أبدًا. يستخدم React هذه القيمة فقط كملاذ أخير إذا لم يتمكن من العثور على مزود مطابق أعلاه.

لتغيير السياق بمرور الوقت، أضف حالة (state) ولف المكونات في مزود سياق




المرجع :
https://react.dev/reference/react/createContext

تعليقات

المشاركات الشائعة

ما هو JSX في React؟

مثال بسيط يوضح كيفية استخدام createContext و useContext لتمرير البيانات بين المكونات في React

مثال لتمرير مصفوفة عن طريق useState

إضافة الأنماط في React

المكونات (Components) في React

ما هي Props في React؟

هيكلة المشروع في React

الأمر npx create-react-app my-app

10 أمثلة على استخدام props في React

تطبيق توليد لون عشوائي للصفحة في React