الفرق بين المراجعتين لصفحة: «React/react api»

من موسوعة حسوب
لا ملخص تعديل
ط تعديل التصنيفات
 
(8 مراجعات متوسطة بواسطة 3 مستخدمين غير معروضة)
سطر 6: سطر 6:
=== المكوّنات ===
=== المكوّنات ===
تُتيح لك مكوّنات React تقسيم واجهة المستخدم إلى قطع مستقلة قابلة لإعادة الاستخدام والتفكير بكل قطعة لوحدها. يُمكِن تعريف مكوّنات React عن طريق أخذ صنف فرعي من <code>React.Component</code> أو <code>React.PureComponent</code>.
تُتيح لك مكوّنات React تقسيم واجهة المستخدم إلى قطع مستقلة قابلة لإعادة الاستخدام والتفكير بكل قطعة لوحدها. يُمكِن تعريف مكوّنات React عن طريق أخذ صنف فرعي من <code>React.Component</code> أو <code>React.PureComponent</code>.
* <code>React.Component</code>.
* <code>[[React/react api#React.Component|React.Component]]</code>.
* <code>React.PureComponent</code>.
* <code>[[React/react api#React.PureComponent|React.PureComponent]]</code>.
إن لم تكن تستخدم أصناف ES6 فبإمكانك استخدام الوحدة <code>create-react-class</code>. انظر إلى استخدام React بدون ES6 للمزيد من المعلومات.
إن لم تكن تستخدم أصناف ES6 فبإمكانك استخدام الوحدة <code>create-react-class</code>. انظر إلى [[React/react without es6|استخدام React بدون ES6]] للمزيد من المعلومات.
 
يمكن أن تُعرَّف مكونات React أيضًا على أنَّها دوالٌ يمكن تغليفها:
* <code>[[React/react api#React.memo|React.memo]]</code>


=== إنشاء عناصر React ===
=== إنشاء عناصر React ===
نوصي باستخدام JSX لوصف مظهر واجهة المستخدم لديك. كل عنصر في JSX هو مجرّد تعبير بديل لاستدعاء التابع <code>React.createElement()‎</code>. لن تضطر بشكل اعتيادي إلى استدعاء التوابع التالية بشكل مباشر إن كنت تستخدم JSX:
نوصي [[React/introducing jsx|باستخدام JSX]] لوصف مظهر واجهة المستخدم لديك. كل عنصر في JSX هو مجرّد تعبير بديل لاستدعاء التابع <code>[[React/react api#createElement.28.29.E2.80.8E|React.createElement()]]‎</code>. لن تضطر بشكل اعتيادي إلى استدعاء التوابع التالية بشكل مباشر إن كنت تستخدم JSX:
* <code>createElement()</code>‎.
* <code>[[React/react api#createElement.28.29.E2.80.8E|createElement()]]</code>‎.
* <code>createFactory()‎</code>.
* <code>[[React/react api#createFactory.28.29.E2.80.8E|createFactory()‎]]</code>.
انظر إلى استخدام React بدون JSX للمزيد من المعلومات.
انظر إلى [[React/react without jsx|استخدام React بدون JSX]] للمزيد من المعلومات.


=== تحويل العناصر ===
=== تحويل العناصر ===
يُزوّدنا الكائن <code>React</code> بالعديد من واجهات برمجة التطبيقات (APIs) للتعامل مع العناصر:
يُزوّدنا الكائن <code>React</code> بالعديد من واجهات برمجة التطبيقات (APIs) للتعامل مع العناصر:
* <code>cloneElement()‎</code>.
* <code>[[React/react api#cloneElement.28.29.E2.80.8E|cloneElement()‎]]</code>.
* <code>isValidElement()</code>‎.
* <code>[[React/react api#isValidElement.28.29.E2.80.8E|isValidElement()]]</code>‎.
* <code>React.Children</code>.
* <code>[[React/react api#React.Children|React.Children]]</code>.


=== الأجزاء (Fragments) ===
=== الأجزاء (Fragments) ===
تُزوِّدنا React أيضًا بمكوّن لتصيير عدة عناصر بدون مُغلِّف له.
تُزوِّدنا React أيضًا بمكوّن لتصيير عدة عناصر بدون مُغلِّف له.
* <code>React.Fragment</code>.
* <code>[[React/react api#React.Fragment|React.Fragment]]</code>.


=== المراجع (Refs) ===
=== المراجع (Refs) ===
* <code>React.createRef</code>.
* <code>[[React/react api#React.createRef|React.createRef]]</code>.
* <code>React.forwardRef</code>.
* <code>[[React/react api#React.forwardRef|React.forwardRef]]</code>.
 
=== التعليق (Suspense) ===
يتيح التعليق للمكونات "انتظار" شيء ما قبل التصيير. اليوم، يدعم التعليق حالة استخدام وحيدة فقط هي: [[React/code splitting#.D8.A7.D9.84.D8.AF.D8.A7.D9.84.D8.A9 React.lazy|تحميل المكونات ديناميكيًّا مع <code>React.lazy</code>]]. في المستقبل، سيدعم حالات استخدام أخرى مثل جلب البيانات (data fetching).
* <code>[[React/react api#React.lazy|React.lazy]]</code>
* <code>[[React/react api#React.Suspense|React.Suspense]]</code>
 
=== الخطافات (Hooks) ===
الخطافات هي إضافة جديدة إلى الإصدار 16.8 في React، إذ تسمح لك باستعمال ميزة الحالة وميزات React الأخرى دون كتابة أي صنف. تملك الخطافات [[React/hooks intro|قسمًا مخصَّصًّا بها]] و<nowiki/>[[React/hooks reference|واجهة برمجية منفصلة]]:
* [[React/hooks reference#.D8.A7.D9.84.D8.AE.D8.B7.D8.A7.D9.81.D8.A7.D8.AA .D8.A7.D9.84.D8.A3.D8.B3.D8.A7.D8.B3.D9.8A.D8.A9|الخطافات الأساسية]]
** <code>[[React/hooks reference#useState|useState]]</code>
** <code>[[React/hooks reference#useEffect|useEffect]]</code>
** <code>[[React/hooks reference#useContext|useContext]]</code>
* [[React/hooks reference#.D8.AE.D8.B7.D8.A7.D9.81.D8.A7.D8.AA .D8.A5.D8.B6.D8.A7.D9.81.D9.8A.D8.A9|خطافات إضافية]]
** <code>[[React/hooks reference#useReducer|useReducer]]</code>
** <code>[[React/hooks reference#useCallback|useCallback]]</code>
** <code>[[React/hooks reference#useMemo|useMemo]]</code>
** <code>[[React/hooks reference#useRef|useRef]]</code>
** <code>[[React/hooks reference#useImperativeHandle|useImperativeHandle]]</code>
** <code>[[React/hooks reference#useLayoutEffect|useLayoutEffect]]</code>
** <code>[[React/hooks reference#useDebugValue|useDebugValue]]</code>


== مرجع ==
== مرجع ==


=== <code>React.Component</code> ===
=== <code>React.Component</code> ===
إنّ <code>React.Component</code> هو عبارة عن الصنف الأساسي لمكوّنات React عند تعريفها باستخدام أصناف ES6:<syntaxhighlight lang="javascript">
إنّ <code>React.Component</code> هو عبارة عن الصنف الأساسي لمكوّنات React عند تعريفها باستخدام [https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes أصناف ES6]:<syntaxhighlight lang="javascript">
class Greeting extends React.Component {
class Greeting extends React.Component {
   render() {
   render() {
سطر 40: سطر 63:
}
}


</syntaxhighlight>انظر إلى مرجع <code>React.Component</code> API للحصول على قائمة بالتوابع والخاصيّات المرتبطة بالصنف <code>React.Component</code> الأساسي.
</syntaxhighlight>انظر إلى مرجع <code>[[React/react component|React.Component]]</code> API للحصول على قائمة بالتوابع والخاصيّات المرتبطة بالصنف <code>React.Component</code> الأساسي.


=== <code>React.PureComponent</code> ===
=== <code>React.PureComponent</code> ===
يُشبه <code>React.PureComponent</code> الصنف <code>React.Component</code>. الفرق بينهما هي عدم اعتماد الصنف <code>React.Component</code> للتابع <code>shouldComponentUpdate()</code>‎ بينما يعتمده <code>React.PureComponent</code> مع مقارنة ضئيلة بين الخاصيّات والحالة.
يُشبه <code>React.PureComponent</code> الصنف <code>[[React/react api#React.Component|React.Component]]</code>. الفرق بينهما هي عدم اعتماد الصنف <code>[[React/react api#React.Component|React.Component]]</code> للتابع <code>[[React/react component|shouldComponentUpdate()]]</code>‎ بينما يعتمده <code>React.PureComponent</code> مع مقارنة ضئيلة بين الخاصيّات والحالة.


إن كان تابع التصيير <code>render()</code>‎ للمكوّن يُصيّر نفس النتيجة عند إعطاء نفس الخاصيّات والحالة فتستطيع استخدام <code>React.PureComponent</code> لتحسين الأداء في بعض الحالات.
إن كان تابع التصيير <code>render()</code>‎ للمكوّن يُصيّر نفس النتيجة عند إعطاء نفس الخاصيّات والحالة فتستطيع استخدام <code>React.PureComponent</code> لتحسين الأداء في بعض الحالات.


'''ملاحظة:''' يُقارِن التابع <code>shouldComponentUpdate()‎</code> الخاص بالصنف <code>React.PureComponent</code> مقارنة ضئيلة فقط بين الكائنات، فإن كانت تحتوي على بنى معطيات معقدة فقد يُنتِج سلبيات كاذبة للمقارنات الأعمق. يجب الامتداد إلى الصنف <code>PureComponent</code> فقط عندما تتوقع امتلاك حالة وخاصيّات بسيطة، أو استخدم التابع <code>forceUpdate()‎</code> عندما تعلم بتغيّر بنى المعطيات العميقة، أو انظر في استخدام الكائنات غير القابلة للتعديل لتسهيل المقارنات السريعة بين البيانات المتداخلة.
'''ملاحظة:''' يُقارِن التابع <code>shouldComponentUpdate()‎</code> الخاص بالصنف <code>React.PureComponent</code> مقارنة ضئيلة فقط بين الكائنات، فإن كانت تحتوي على بنى معطيات معقدة فقد يُنتِج سلبيات كاذبة للمقارنات الأعمق. يجب الامتداد إلى الصنف <code>PureComponent</code> فقط عندما تتوقع امتلاك حالة وخاصيّات بسيطة، أو استخدم التابع <code>[[React/react component|forceUpdate()]]‎</code> عندما تعلم بتغيّر بنى المعطيات العميقة، أو انظر في استخدام [https://facebook.github.io/immutable-js/ الكائنات غير القابلة] للتعديل لتسهيل المقارنات السريعة بين البيانات المتداخلة.


يتخطى التابع <code>shouldComponentUpdate()‎</code> أيضًا تحديث الخاصيّات لكامل الشجرة الفرعية للمكوّن، احرص على أن تكون المكوّنات الأبناء له أيضًا نقيّة.
يتخطى التابع <code>shouldComponentUpdate()‎</code> أيضًا تحديث الخاصيّات لكامل الشجرة الفرعية للمكوّن، احرص على أن تكون المكوّنات الأبناء له أيضًا نقيّة.
=== <code>React.memo</code> ===
<syntaxhighlight lang="javascript">
const MyComponent = React.memo(function MyComponent(props) {
  /* props صيّر باستعمال */
});
</syntaxhighlight>إنَّ React.memo هو [[React/higher order components|مكون ذو ترتيب أعلى]]. إنه مشابه إلى React.PureComponent ولكن من أجل مكونات دوال وليس أصناف.
إن صير مكون الدالة الخاص بك نفس النتيجة بعد إعطاء نفس الخاصيات، يمكنك حينئذٍ تغليفها في استدعاء إلى React.memo من أجل تسريع الأداء في بعض الحالات عبر تذكر النتيجة. هذا يعني أنَّ React ستتخطى عملية تصيير المكون وتعيد استعمال آخر نتيجة جرى تصييرها.
افتراضيًّا، ستُجرَى عملية موازنة سطحية فقط بين الكائنات المعقدة في الكائنات props. إن أردت التحكم بعملية الموازنة، يمكنك آنذاك توفير دالة موازنة مخصصة كوسيطٍ ثانٍ.<syntaxhighlight lang="javascript">
function MyComponent(props) {
  /* props صيّر باستعمال */
}
function areEqual(prevProps, nextProps) {
  /*
    سيعيد render إلى nextProps إن كان تمرير true سيعيد القيمة
  false وإلا سيعيد القيمة ،render إلى prevProps نفس النتيجة إذا مُرِّرت
  */
}
export default React.memo(MyComponent, areEqual);
</syntaxhighlight>الغرض من خلق هذا التابع هو لتحسين الأداء. لا تعتمد عليه لمنع عملية التصيير، إذ سيؤدي ذلك إلى حصول أخطاء.
'''ملاحظة''': خلافًا للتابع <code>()shouldComponentUpdate</code> في مكونات الأصناف، تعيد الدالة <code>areEqual</code> القيمة <code>true</code> إن كانت الخاصيات (props) متساوية والقيمة <code>false</code> إن كانت الخاصيات غير متساوية. هذه هي حالة معاكسة للدالة <code>()shouldComponentUpdate</code>.


=== <code>createElement()‎</code> ===
=== <code>createElement()‎</code> ===
سطر 59: سطر 106:
)
)


</syntaxhighlight>يُنشِئ ويُعيد عنصر React جديد من النوع المُعطى. يُمكِن للوسيط <code>type</code> أن يكون إمّا سلسلة نصيّة لاسم العنصر (مثل ‎<code>'div'‎</code> أو ‎<code>'span'</code>‎)، أو نوع لمكوّن React (مثل صنف أو دالة)، أو نوع لجزء React (أي fragment).
</syntaxhighlight>يُنشِئ ويُعيد [[React/rendering elements|عنصر React]] جديد من النوع المُعطى. يُمكِن للوسيط <code>type</code> أن يكون إمّا سلسلة نصيّة لاسم العنصر (مثل ‎<code>'div'‎</code> أو ‎<code>'span'</code>‎)، أو نوع [[React/components and props|لمكوّن React]] (مثل صنف أو دالة)، أو نوع [[React/react api#React.Fragment|لجزء React]] (أي fragment).


تُحوَّل الشيفرة المكتوبة باستخدام JSX إلى استدعاءات للتابع <code>React.createElement()</code>‎. لن تستدعي هذا التابع بشكل مباشر عادةً إن كنت تستخدم JSX. انظر إلى استخدام React بدون JSX لتعلم المزيد.
تُحوَّل الشيفرة المكتوبة باستخدام [[React/introducing jsx|JSX]] إلى استدعاءات للتابع <code>React.createElement()</code>‎. لن تستدعي هذا التابع بشكل مباشر عادةً إن كنت تستخدم JSX. انظر إلى [[React/react without jsx|استخدام React بدون JSX]] لتعلم المزيد.


=== <code>cloneElement()‎</code> ===
=== <code>cloneElement()‎</code> ===
سطر 82: سطر 129:
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
React.createFactory(type)
React.createFactory(type)
</syntaxhighlight>يُعيد دالة تُنتِج عناصر React من النوع المُعطى. وكما هو الحال مع التابع <code>React.createElement()</code>‎ يُمكِن للوسيط <code>type</code> أن يكون إمّا سلسلة نصيّة لاسم العنصر (مثل ‎<code>'div'</code>‎ أو ‎<code>'span'</code>‎)، أو نوع لمكوّن React (مثل صنف أو دالة)، أو نوع لجزء React (أي fragment).
</syntaxhighlight>يُعيد دالة تُنتِج عناصر React من النوع المُعطى. وكما هو الحال مع التابع <code>[[React/react api#createElement.28.29.E2.80.8E|React.createElement()]]</code>‎ يُمكِن للوسيط <code>type</code> أن يكون إمّا سلسلة نصيّة لاسم العنصر (مثل ‎<code>'div'</code>‎ أو ‎<code>'span'</code>‎)، أو نوع [[React/components and props|لمكوّن React]] (مثل صنف أو دالة)، أو نوع [[React/react api#React.Fragment|لجزء React]] (أي fragment).


يُعتبَر هذا التابع قديمًا في React ونوصي باستخدام JSX أو التابع <code>React.createElement()</code>‎ بشكل مباشر بدلًا من ذلك.
يُعتبَر هذا التابع قديمًا في React ونوصي باستخدام JSX أو التابع <code>React.createElement()</code>‎ بشكل مباشر بدلًا من ذلك.


لن تستدعي هذا التابع بشكل مباشر إن كنت تستخدم JSX. انظر إلى استخدام React بدون JSX لتعلّم المزيد.
لن تستدعي هذا التابع بشكل مباشر إن كنت تستخدم JSX. انظر إلى [[React/react without jsx|استخدام React بدون JSX]] لتعلّم المزيد.


=== <code>isValidElement()‎</code> ===
=== <code>isValidElement()‎</code> ===
سطر 104: سطر 151:
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
React.Children.forEach(children, function[(thisArg)])
React.Children.forEach(children, function[(thisArg)])
</syntaxhighlight>مماثل للتابع <code>React.Children.map()</code>‎ ولكن لا يُعيد مصفوفة.
</syntaxhighlight>مماثل للتابع <code>[[React/react api#React.Children.map|React.Children.map()]]</code>‎ ولكن لا يُعيد مصفوفة.


==== <code>React.Children.count</code> ====
==== <code>React.Children.count</code> ====
سطر 116: سطر 163:
</syntaxhighlight>يتحقّق من أنّ <code>children</code> يمتلك فقط ابنًا واحدًا (عنصر React) ويُعيده. فيما عدا ذلك سيرمي هذا التابع خطأً.
</syntaxhighlight>يتحقّق من أنّ <code>children</code> يمتلك فقط ابنًا واحدًا (عنصر React) ويُعيده. فيما عدا ذلك سيرمي هذا التابع خطأً.


'''ملاحظة:''' لا يقبل التابع <code>React.Children.only()</code>‎ القيمة المُعادة من <code>React.Children.map()</code>‎ لأنّها مصفوفة وليست عنصر React.
'''ملاحظة:''' لا يقبل التابع <code>React.Children.only()</code>‎ القيمة المُعادة من <code>[[React/react api#React.Children.map|React.Children.map()]]</code>‎ لأنّها مصفوفة وليست عنصر React.


==== <code>React.Children.toArray</code> ====
==== <code>React.Children.toArray</code> ====
سطر 136: سطر 183:
}
}


</syntaxhighlight>تستطيع أيضًا استخدامه عن طريق الصياغة المختصرة ‎<></>‎. للمزيد من المعلومات انظر تحسين الدعم للأجزاء في إصدار React v16.2.0.
</syntaxhighlight>تستطيع أيضًا استخدامه عن طريق الصياغة المختصرة ‎<></>‎. للمزيد من المعلومات انظر إلى [https://reactjs.org/blog/2017/11/28/react-v16.2.0-fragment-support.html تحسين الدعم للأجزاء في إصدار React v16.2.0].


=== <code>React.createRef</code> ===
=== <code>React.createRef</code> ===
يُنشِئ <code>React.createRef</code> مرجعًا <code>ref</code> والذي يُمكِن إرفاقه إلى عناصر React عبر الخاصيّة <code>ref</code>:<syntaxhighlight lang="javascript">
يُنشِئ <code>React.createRef</code> [[React/refs and the dom|مرجعًا <code>ref</code>]] والذي يُمكِن إرفاقه إلى عناصر React عبر الخاصيّة <code>ref</code>:<syntaxhighlight lang="javascript">
class MyComponent extends React.Component {
class MyComponent extends React.Component {
   constructor(props) {
   constructor(props) {
سطر 160: سطر 207:
=== <code>React.forwardRef</code> ===
=== <code>React.forwardRef</code> ===
يُنشِئ <code>React.forwardRef</code> مكوّن React يُمرِّر خاصيّة المرجع <code>ref</code> التي يستقبلها إلى مكوّن آخر أدنى منه في الشجرة. هذه التقنية ليست شائعة كثيرًا ولكنّها مفيدة بشكل خاص في حالتين:
يُنشِئ <code>React.forwardRef</code> مكوّن React يُمرِّر خاصيّة المرجع <code>ref</code> التي يستقبلها إلى مكوّن آخر أدنى منه في الشجرة. هذه التقنية ليست شائعة كثيرًا ولكنّها مفيدة بشكل خاص في حالتين:
* تمرير المراجع إلى مكوّنات DOM.
* [[React/forwarding refs#.D8.AA.D9.85.D8.B1.D9.8A.D8.B1 .D8.A7.D9.84.D9.85.D8.B1.D8.A7.D8.AC.D8.B9 .D8.A5.D9.84.D9.89 .D9.85.D9.83.D9.88.D9.86.D8.A7.D8.AA DOM|تمرير المراجع إلى مكوّنات DOM]].
* تمرير المراجع في المكوّنات ذات الترتيب الأعلى.
* [[React/forwarding refs#.D8.AA.D9.85.D8.B1.D9.8A.D8.B1 .D8.A7.D9.84.D9.85.D8.B1.D8.A7.D8.AC.D8.B9 .D9.81.D9.8A .D8.A7.D9.84.D9.85.D9.83.D9.88.D9.86.D8.A7.D8.AA .D8.B0.D8.A7.D8.AA .D8.A7.D9.84.D8.AA.D8.B1.D8.AA.D9.8A.D8.A8 .D8.A7.D9.84|تمرير المراجع في المكوّنات ذات الترتيب الأعلى]].
تقبل <code>React.forwardRef</code> دالة تصيير كوسيط لها. ستستدعي React هذه الدالة مع الخاصيّات <code>props</code> والمرجع <code>ref</code> كوسيطين لها. يجب أن تُعيد هذه الدالة عقدة React:<syntaxhighlight lang="javascript">
تقبل <code>React.forwardRef</code> دالة تصيير كوسيط لها. ستستدعي React هذه الدالة مع الخاصيّات <code>props</code> والمرجع <code>ref</code> كوسيطين لها. يجب أن تُعيد هذه الدالة عقدة React:<syntaxhighlight lang="javascript">
const FancyButton = React.forwardRef((props, ref) => (
const FancyButton = React.forwardRef((props, ref) => (
سطر 169: سطر 216:
));
));


// You can now get a ref directly to the DOM button:
// DOM تستطيع الآن الحصول على مرجع بشكل مباشر إلى زر  
// تستطيع الآن الحصول على مرجع بشكل مباشر إلى زر DOM
const ref = React.createRef();
const ref = React.createRef();
<FancyButton ref={ref}>انقر هنا</FancyButton>;
<FancyButton ref={ref}>انقر هنا</FancyButton>;
سطر 178: سطر 224:
كنتيجة لذلك بعد إرفاق React للمرجع، سيُشير <code>ref.current</code> بشكلٍ مباشر إلى نسخة العنصر ‎<code><button></code>‎.
كنتيجة لذلك بعد إرفاق React للمرجع، سيُشير <code>ref.current</code> بشكلٍ مباشر إلى نسخة العنصر ‎<code><button></code>‎.


للمزيد من المعلومات انظر إلى تمرير المراجع في توثيق React.
للمزيد من المعلومات انظر إلى [[React/forwarding refs|تمرير المراجع في توثيق React]].
 
=== <code>React.lazy</code> ===
تمكنك الدالة <code>()React.lazy</code> من تعريف مكون يحمَّل ديناميكيًّا. هذا يساعد في تقليل حجم الحزمة (bundle size) لتأخير تحميل المكونات التي لا تُستعمَل أثناء أول عملية تصيير.
 
يمكنك تعلم كيفية استعمالها من توثيق تقسيم الشيفرة. يمكنك أيضًا الاطلاع على هذه المقالة التي توضح كيفية استعمالها بتفصيل أوسع.<syntaxhighlight lang="javascript">
// يحمَّل هذا المكون ديناميكيًّا
const SomeComponent = React.lazy(() => import('./SomeComponent'));
</syntaxhighlight>انتبه إلى تحميل المكونات <code>lazy</code> (الكسولة) يتطلب وجود مكون من النوع <code><React.Suspense></code> في مستوى أعلى من شجرة التصيير. هذه هي كيفية تحديد مؤشر تحميل.
 
ملاحظة: يتطلب استعمال <code>React.lazy</code> مع استيراد ديناميكي توافر وعود في البيئة JS. ذلك يتطلب دعمًا للإصدار IE11 وما قبله.
 
=== <code>React.Suspense</code> ===
يمكِّنك <code>React.Suspense</code> من تحديد مؤشر التحميل في حال كان هنالك بعض المكونات التي تقع أسفل منها في الشجرة غير جاهزة للتصيير بعد. اليوم، المكونات ذات التحميل الكسول (lazy loading components) هي حالة الاستعمال الوحيدة المدعومة عبر <code><React.Suspense></code>:<syntaxhighlight lang="javascript">
// يحمَّل هذا المكون ديناميكيًّا
const OtherComponent = React.lazy(() => import('./OtherComponent'));
 
function MyComponent() {
  return (
    // Displays <Spinner> until OtherComponent loads
    <React.Suspense fallback={<Spinner />}>
      <div>
        <OtherComponent />
      </div>
    </React.Suspense>
  );
}
</syntaxhighlight>جرى توثيق <code>React.Suspense</code> في صفحة [[React/code splitting|تقسيم الشيفرة]]. انتبه إلى أنَّ المكونات <code>lazy</code> (الكسولة) يمكن أن تتوضع بداخل الشجرة <code>Suspense</code> بعمق، إذ لا تحتاج إلى تغليف كل واحدة منها. أفضل سلوك هو وضع <code><Suspense></code> حيث أردت رؤية مؤشر تحميل، ولكن استعمال <code>()lazy</code> حيثما أردت القيام بتقسيم الشيفرة.
 
لمَّا كان ذلك غير مدعوم الآن، فنخطط في المستقبل بترك <code>Suspense</code> يعالج حالات أوسع مثل جلب بيانات. يمكنك قراءة المزيد في [https://reactjs.org/blog/2018/11/27/react-16-roadmap.html هذه التدوينة].
 
'''ملاحظة''': إن <code>()React.lazy</code> و <code><React.Suspense></code> غير مدعومين بعد عبر <code>[[React/react dom server|ReactDOMServer]]</code>. سيجري في المستقبل حل هذا القيد.
 
== انظر أيضًا ==
* واجهة برمجة التطبيق (API) ذات المستوى الأعلى في React (الصفحة الحالية)
* [[React/react component|الصنف React.Component]]
* [[React/react dom|الكائن ReactDOM]]
* [[React/react dom server|الكائن ReactDOMServer]]
* [[React/dom elements|عناصر DOM]]
* [[React/events|الأحداث المصطنعة (Synthetic Events)]]
* [[React/test utils|أدوات الاختبار]]
* [[React/shallow renderer|التصيير السطحي (Shallow Rendering)]]
* [[React/test renderer|مصير الاختبار (Test Renderer)]]
* [[React/javascript environment requirements|متطلبات بيئة JavaScript]]


== مصادر==
== مصادر==
*[https://reactjs.org/docs/react-api.html صفحة واجهة برمجة التطبيق (API) ذات المستوى الأعلى في توثيق React الرسمي].
*[https://reactjs.org/docs/react-api.html صفحة واجهة برمجة التطبيق (API) ذات المستوى الأعلى في توثيق React الرسمي].
[[تصنيف:React]]
[[تصنيف:React]]
[[تصنيف:React API Reference]]

المراجعة الحالية بتاريخ 11:21، 19 مارس 2019

إنّ الكائن React هو نقطة الدخول إلى مكتبة React. إن حمّلت React عن طريق العنصر ‎<script>‎ فستكون هذه الواجهة ذات المستوى الأعلى متوفرة عبر الكائن العام React. وإن استخدمت ES6 مع npm فتستطيع كتابة ‎import React from 'react'‎. إن استخدمت ES5 مع npm فتستطيع كتابة ‎var React = require('react')‎.

لمحة عامة

المكوّنات

تُتيح لك مكوّنات React تقسيم واجهة المستخدم إلى قطع مستقلة قابلة لإعادة الاستخدام والتفكير بكل قطعة لوحدها. يُمكِن تعريف مكوّنات React عن طريق أخذ صنف فرعي من React.Component أو React.PureComponent.

إن لم تكن تستخدم أصناف ES6 فبإمكانك استخدام الوحدة create-react-class. انظر إلى استخدام React بدون ES6 للمزيد من المعلومات.

يمكن أن تُعرَّف مكونات React أيضًا على أنَّها دوالٌ يمكن تغليفها:

إنشاء عناصر React

نوصي باستخدام JSX لوصف مظهر واجهة المستخدم لديك. كل عنصر في JSX هو مجرّد تعبير بديل لاستدعاء التابع React.createElement(). لن تضطر بشكل اعتيادي إلى استدعاء التوابع التالية بشكل مباشر إن كنت تستخدم JSX:

انظر إلى استخدام React بدون JSX للمزيد من المعلومات.

تحويل العناصر

يُزوّدنا الكائن React بالعديد من واجهات برمجة التطبيقات (APIs) للتعامل مع العناصر:

الأجزاء (Fragments)

تُزوِّدنا React أيضًا بمكوّن لتصيير عدة عناصر بدون مُغلِّف له.

المراجع (Refs)

التعليق (Suspense)

يتيح التعليق للمكونات "انتظار" شيء ما قبل التصيير. اليوم، يدعم التعليق حالة استخدام وحيدة فقط هي: تحميل المكونات ديناميكيًّا مع React.lazy. في المستقبل، سيدعم حالات استخدام أخرى مثل جلب البيانات (data fetching).

الخطافات (Hooks)

الخطافات هي إضافة جديدة إلى الإصدار 16.8 في React، إذ تسمح لك باستعمال ميزة الحالة وميزات React الأخرى دون كتابة أي صنف. تملك الخطافات قسمًا مخصَّصًّا بها وواجهة برمجية منفصلة:

مرجع

React.Component

إنّ React.Component هو عبارة عن الصنف الأساسي لمكوّنات React عند تعريفها باستخدام أصناف ES6:

class Greeting extends React.Component {
  render() {
    return <h1>أهلًا {this.props.name}</h1>;
  }
}

انظر إلى مرجع React.Component API للحصول على قائمة بالتوابع والخاصيّات المرتبطة بالصنف React.Component الأساسي.

React.PureComponent

يُشبه React.PureComponent الصنف React.Component. الفرق بينهما هي عدم اعتماد الصنف React.Component للتابع shouldComponentUpdate()‎ بينما يعتمده React.PureComponent مع مقارنة ضئيلة بين الخاصيّات والحالة.

إن كان تابع التصيير render()‎ للمكوّن يُصيّر نفس النتيجة عند إعطاء نفس الخاصيّات والحالة فتستطيع استخدام React.PureComponent لتحسين الأداء في بعض الحالات.

ملاحظة: يُقارِن التابع shouldComponentUpdate()‎ الخاص بالصنف React.PureComponent مقارنة ضئيلة فقط بين الكائنات، فإن كانت تحتوي على بنى معطيات معقدة فقد يُنتِج سلبيات كاذبة للمقارنات الأعمق. يجب الامتداد إلى الصنف PureComponent فقط عندما تتوقع امتلاك حالة وخاصيّات بسيطة، أو استخدم التابع forceUpdate() عندما تعلم بتغيّر بنى المعطيات العميقة، أو انظر في استخدام الكائنات غير القابلة للتعديل لتسهيل المقارنات السريعة بين البيانات المتداخلة.

يتخطى التابع shouldComponentUpdate()‎ أيضًا تحديث الخاصيّات لكامل الشجرة الفرعية للمكوّن، احرص على أن تكون المكوّنات الأبناء له أيضًا نقيّة.

React.memo

const MyComponent = React.memo(function MyComponent(props) {
  /* props صيّر باستعمال */
});

إنَّ React.memo هو مكون ذو ترتيب أعلى. إنه مشابه إلى React.PureComponent ولكن من أجل مكونات دوال وليس أصناف.

إن صير مكون الدالة الخاص بك نفس النتيجة بعد إعطاء نفس الخاصيات، يمكنك حينئذٍ تغليفها في استدعاء إلى React.memo من أجل تسريع الأداء في بعض الحالات عبر تذكر النتيجة. هذا يعني أنَّ React ستتخطى عملية تصيير المكون وتعيد استعمال آخر نتيجة جرى تصييرها.

افتراضيًّا، ستُجرَى عملية موازنة سطحية فقط بين الكائنات المعقدة في الكائنات props. إن أردت التحكم بعملية الموازنة، يمكنك آنذاك توفير دالة موازنة مخصصة كوسيطٍ ثانٍ.

function MyComponent(props) {
  /* props صيّر باستعمال */
}
function areEqual(prevProps, nextProps) {
  /*
    سيعيد render إلى nextProps إن كان تمرير true سيعيد القيمة
   false وإلا سيعيد القيمة ،render إلى prevProps نفس النتيجة إذا مُرِّرت 
  */
}
export default React.memo(MyComponent, areEqual);

الغرض من خلق هذا التابع هو لتحسين الأداء. لا تعتمد عليه لمنع عملية التصيير، إذ سيؤدي ذلك إلى حصول أخطاء.

ملاحظة: خلافًا للتابع ()shouldComponentUpdate في مكونات الأصناف، تعيد الدالة areEqual القيمة true إن كانت الخاصيات (props) متساوية والقيمة false إن كانت الخاصيات غير متساوية. هذه هي حالة معاكسة للدالة ()shouldComponentUpdate.

createElement()‎

React.createElement(
  type,
  [props],
  [...children]
)

يُنشِئ ويُعيد عنصر React جديد من النوع المُعطى. يُمكِن للوسيط type أن يكون إمّا سلسلة نصيّة لاسم العنصر (مثل ‎'div'‎ أو ‎'span'‎)، أو نوع لمكوّن React (مثل صنف أو دالة)، أو نوع لجزء React (أي fragment).

تُحوَّل الشيفرة المكتوبة باستخدام JSX إلى استدعاءات للتابع React.createElement()‎. لن تستدعي هذا التابع بشكل مباشر عادةً إن كنت تستخدم JSX. انظر إلى استخدام React بدون JSX لتعلم المزيد.

cloneElement()‎

React.cloneElement(
  element,
  [props],
  [...children]
)

ينسخ ويُعيد عنصر React جديد باستخدام الوسيط element كنقطة بداية. يمتلك العنصر الناتج نفس خاصيّات العنصر الأصلي مع دمج الخاصيّات الجديد. سيحل العناصر الأبناء المُقدمين عبر الوسيط children محل العناصر الأبناء الحاليين. سيُحتفَظ بالمفتاح key والمرجع ref من العنصر الأصلي. يُكافِئ التابع React.cloneElement()‎ كتابة ما يلي:

<element.type {...element.props} {...props}>{children}</element.type>

ولكن يُحافِظ استخدام التابع على المرجع ref أيضًا. يعني هذا أنّه لو كان لديك عنصر ابن مع مرجع ref ضمنه، فلن تأخذه عن طريق الخطأ من العنصر السليف له، بل ستحصل على نفس المرجع مُرفقًا بعنصرك الجديد.

قُدِّمت هذه الواجهة (ِAPI) كبديل للتابع React.addons.cloneWithProps()‎ المُهمَل.

createFactory()‎

React.createFactory(type)

يُعيد دالة تُنتِج عناصر React من النوع المُعطى. وكما هو الحال مع التابع React.createElement()‎ يُمكِن للوسيط type أن يكون إمّا سلسلة نصيّة لاسم العنصر (مثل ‎'div'‎ أو ‎'span'‎)، أو نوع لمكوّن React (مثل صنف أو دالة)، أو نوع لجزء React (أي fragment).

يُعتبَر هذا التابع قديمًا في React ونوصي باستخدام JSX أو التابع React.createElement()‎ بشكل مباشر بدلًا من ذلك.

لن تستدعي هذا التابع بشكل مباشر إن كنت تستخدم JSX. انظر إلى استخدام React بدون JSX لتعلّم المزيد.

isValidElement()‎

React.isValidElement(object)

يتحقّق من أنّ الكائن هو عنصر React. يُعيد القيمة true أو false.

React.Children

يُزوّدنا React.Children بأدوات مساعدة للتعامل مع بنية المعلومات this.props.children.

React.Children.map

React.Children.map(children, function[(thisArg)])

يستدعي دالة لكل عنصر ابن مباشر موجود ضمن children مع تعيين this إلى قيمة thisArg. إن كان children عبارة عن جزء (fragment) مع مفتاح أو مصفوفة فلن تُمرَّر الدالة للكائن الحاوي. إن كانت قيمة children هي null أو undefined فسيُعيد null أو undefined بدلًا من المصفوفة.

React.Children.forEach

React.Children.forEach(children, function[(thisArg)])

مماثل للتابع React.Children.map()‎ ولكن لا يُعيد مصفوفة.

React.Children.count

React.Children.count(children)

يُعيد العدد الكلي للمكوّنات الموجود ضمن children، مُكافئ لعدد المرات التي يُمرَّر فيها رد النداء إلى map أو التي يُستدعى فيها forEach.

React.Children.only

React.Children.only(children)

يتحقّق من أنّ children يمتلك فقط ابنًا واحدًا (عنصر React) ويُعيده. فيما عدا ذلك سيرمي هذا التابع خطأً.

ملاحظة: لا يقبل التابع React.Children.only()‎ القيمة المُعادة من React.Children.map()‎ لأنّها مصفوفة وليست عنصر React.

React.Children.toArray

React.Children.toArray(children)

يُعيد بنية البيانات children كمصفوفة مع تعيين مفتاح لكل عنصر ابن. يكون مفيدًا إن أردت التعامل مع مجموعة من العناصر الأبناء في توابع التصيير لديك، خاصّة إن أردت إعادة ترتيب أو تجزئة this.props.children قبل تمريره.

ملاحظة: يُغيّر التابع React.Children.toArray()‎ المفاتيح ليُحافظ على دلالات المصفوفات المتداخلة عند تبسيط قائمة من العناصر الأبناء. حيث يضع كل مفتاح قبل العنصر في المصفوفة المُعادة بحيث يكون المجال لمفتاح كل عنصر هو مصفوفة الدخل التي تحتويه.

React.Fragment

يُتيح لك مكوّن الأجزاء React.Fragment أن تُعيد عناصر متعددة في التابع render()‎ بدون إنشاء عناصر DOM إضافيّة:

render() {
  return (
    <React.Fragment>
      نص ما
      <h2>ترويسة</h2>
    </React.Fragment>
  );
}

تستطيع أيضًا استخدامه عن طريق الصياغة المختصرة ‎<></>‎. للمزيد من المعلومات انظر إلى تحسين الدعم للأجزاء في إصدار React v16.2.0.

React.createRef

يُنشِئ React.createRef مرجعًا ref والذي يُمكِن إرفاقه إلى عناصر React عبر الخاصيّة ref:

class MyComponent extends React.Component {
  constructor(props) {
    super(props);

    this.inputRef = React.createRef();
  }

  render() {
    return <input type="text" ref={this.inputRef} />;
  }

  componentDidMount() {
    this.inputRef.current.focus();
  }
}

React.forwardRef

يُنشِئ React.forwardRef مكوّن React يُمرِّر خاصيّة المرجع ref التي يستقبلها إلى مكوّن آخر أدنى منه في الشجرة. هذه التقنية ليست شائعة كثيرًا ولكنّها مفيدة بشكل خاص في حالتين:

تقبل React.forwardRef دالة تصيير كوسيط لها. ستستدعي React هذه الدالة مع الخاصيّات props والمرجع ref كوسيطين لها. يجب أن تُعيد هذه الدالة عقدة React:

const FancyButton = React.forwardRef((props, ref) => (
  <button ref={ref} className="FancyButton">
    {props.children}
  </button>
));

// DOM تستطيع الآن الحصول على مرجع بشكل مباشر إلى زر 
const ref = React.createRef();
<FancyButton ref={ref}>انقر هنا</FancyButton>;

في المثال السابق تُمرِّر React مرجعًا ref إلى العنصر ‎<FancyButton ref={ref}>‎ كوسيطٍ ثانٍ لدالة التصيير بداخل الاستدعاء React.forwardRef. تُمرِّر دالة التصيير هذه المرجع ref إلى العنصر ‎<button ref={ref}>‎.

كنتيجة لذلك بعد إرفاق React للمرجع، سيُشير ref.current بشكلٍ مباشر إلى نسخة العنصر ‎<button>‎.

للمزيد من المعلومات انظر إلى تمرير المراجع في توثيق React.

React.lazy

تمكنك الدالة ()React.lazy من تعريف مكون يحمَّل ديناميكيًّا. هذا يساعد في تقليل حجم الحزمة (bundle size) لتأخير تحميل المكونات التي لا تُستعمَل أثناء أول عملية تصيير.

يمكنك تعلم كيفية استعمالها من توثيق تقسيم الشيفرة. يمكنك أيضًا الاطلاع على هذه المقالة التي توضح كيفية استعمالها بتفصيل أوسع.

// يحمَّل هذا المكون ديناميكيًّا
const SomeComponent = React.lazy(() => import('./SomeComponent'));

انتبه إلى تحميل المكونات lazy (الكسولة) يتطلب وجود مكون من النوع <React.Suspense> في مستوى أعلى من شجرة التصيير. هذه هي كيفية تحديد مؤشر تحميل.

ملاحظة: يتطلب استعمال React.lazy مع استيراد ديناميكي توافر وعود في البيئة JS. ذلك يتطلب دعمًا للإصدار IE11 وما قبله.

React.Suspense

يمكِّنك React.Suspense من تحديد مؤشر التحميل في حال كان هنالك بعض المكونات التي تقع أسفل منها في الشجرة غير جاهزة للتصيير بعد. اليوم، المكونات ذات التحميل الكسول (lazy loading components) هي حالة الاستعمال الوحيدة المدعومة عبر <React.Suspense>:

// يحمَّل هذا المكون ديناميكيًّا
const OtherComponent = React.lazy(() => import('./OtherComponent'));

function MyComponent() {
  return (
    // Displays <Spinner> until OtherComponent loads
    <React.Suspense fallback={<Spinner />}>
      <div>
        <OtherComponent />
      </div>
    </React.Suspense>
  );
}

جرى توثيق React.Suspense في صفحة تقسيم الشيفرة. انتبه إلى أنَّ المكونات lazy (الكسولة) يمكن أن تتوضع بداخل الشجرة Suspense بعمق، إذ لا تحتاج إلى تغليف كل واحدة منها. أفضل سلوك هو وضع <Suspense> حيث أردت رؤية مؤشر تحميل، ولكن استعمال ()lazy حيثما أردت القيام بتقسيم الشيفرة.

لمَّا كان ذلك غير مدعوم الآن، فنخطط في المستقبل بترك Suspense يعالج حالات أوسع مثل جلب بيانات. يمكنك قراءة المزيد في هذه التدوينة.

ملاحظة: إن ()React.lazy و <React.Suspense> غير مدعومين بعد عبر ReactDOMServer. سيجري في المستقبل حل هذا القيد.

انظر أيضًا

 مصادر