اليوم ، في ترجمة الجزء التالي من دورة React التدريبية ، نلفت انتباهكم إلى الدرس الثاني حول التقديم الشرطي وورشة عمل حول هذا الموضوع.

→ 
الجزء 1: نظرة عامة على الدورة ، وأسباب شعبية React ، ReactDOM و JSX→ 
الجزء 2: المكونات الوظيفية→ 
الجزء 3: ملفات المكونات ، هيكل المشروع→ 
الجزء 4: مكونات الوالدين والطفل→ 
الجزء 5: بدء العمل في تطبيق TODO ، أساسيات التصميم→ 
الجزء 6: حول بعض ميزات الدورة ، JSX وجافا سكريبت→ 
الجزء 7: الأنماط المضمنة→ 
الجزء 8: مواصلة العمل على تطبيق TODO ، الإلمام بخصائص المكونات→ 
الجزء 9: خصائص المكون→ 
الجزء 10: ورشة عمل حول العمل مع خصائص المكون والتصميم→ 
الجزء 11: توليد العلامات الديناميكية وطريقة صفائف الخريطة→ 
الجزء 12: ورشة العمل ، المرحلة الثالثة من العمل على طلب TODO→ 
الجزء 13: المكونات القائمة على الفصل→ 
الجزء 14: ورشة عمل حول المكونات القائمة على الفصل ، وحالة المكون→ 
الجزء 15: ورش العمل الصحية المكونة→ 
الجزء 16: المرحلة الرابعة من العمل على طلب TODO ، التعامل مع الأحداث→ 
الجزء 17: المرحلة الخامسة من العمل على تطبيق TODO ، وتعديل حالة المكونات→ 
الجزء 18: المرحلة السادسة من العمل على طلب TODO→ 
الجزء 19: طرق دورة حياة المكونالجزء 20: الدرس الأول في التقديم الشرطي→ 
الجزء 21: الدرس الثاني وورشة العمل حول التقديم الشرطي→ 
الجزء 22: المرحلة السابعة من العمل على تطبيق TODO ، وتنزيل البيانات من مصادر خارجية→ 
الجزء 23: الدرس الأول حول العمل مع النماذج→ 
الجزء 24: نماذج الدرس الثاني→ 
الجزء 25: ورشة عمل حول العمل مع النماذج→ 
الجزء 26: بنية التطبيق ، نمط الحاوية / المكون→ 
الجزء 27: مشروع المقررالدرس 37. التقديم الشرطي ، الجزء 2
→ 
الأصلفي البرنامج التعليمي اليوم حول التقديم الشرطي ، سنتحدث عن استخدام عامل التشغيل المنطقي 
&& (And). سنقوم بتجربة مشروع قياسي تم إنشاؤه بواسطة create-react-app ، في ملف 
App.js والذي يوجد به الكود التالي:
 import React, {Component} from "react" class App extends Component {   constructor() {       super()       this.state = {           unreadMessages: [               "Call your mom!",               "New spam email available. All links are definitely safe to click."           ]       }   }   render() {       return (           <div>              <h2>You have {this.state.unreadMessages.length} unread messages!</h2>           </div>       )   } } export default App 
الآن يظهر التطبيق في المتصفح كما هو موضح أدناه.
صفحة التطبيق في المتصفحربما تكون قد استخدمت بالفعل عامل التشغيل 
&& في إنشاءات مثل 
true && false (والتي تعطي 
false ). لكي يتم إرجاع التعبير 
true كنتيجة لحساب مثل هذا التعبير ، يجب أن يبدو وكأنه 
true && true . عند معالجة هذه التعبيرات ، تحدد JavaScript ما إذا كان جانبها الأيسر صحيحًا ، وإذا كان الأمر كذلك ، فأرجع ببساطة ما هو في الجانب الأيمن منها. إذا تمت معالجة تعبير عن النموذج 
false && false ، فسيتم إرجاع 
false على الفور ، دون التحقق من الجانب الأيمن من التعبير. نتيجة لذلك ، يمكن استخدام عامل التشغيل 
&& في التقديم الشرطي. مع ذلك ، يمكنك إما إرجاع شيء سيتم عرضه على الشاشة ، أو عدم إرجاع أي شيء.
دعنا نحلل كود تطبيق التدريب.
تخزن حالة مكون 
App مجموعة من سلاسل 
unreadMessages . يمثل كل صف في هذه الصفيف رسالة غير مقروءة. تعرض الصفحة عدد الرسائل غير المقروءة ، والتي تحدد بناءً على طول الصفيف. إذا كانت هذه المجموعة فارغة ، فلن يكون هناك عنصر واحد فيها ، ثم يعرض التطبيق ما هو موضح أدناه على الصفحة.
التطبيق يعلمنا أنه لا توجد رسائل غير مقروءةلتحقيق هذا التأثير ، يكفي إحضار الصفيف إلى هذا النموذج: 
unreadMessages: [] .
إذا لم تكن هناك رسائل غير مقروءة ، فمن الممكن تمامًا عدم عرض أي رسالة على الإطلاق. إذا استخدمنا عامل التشغيل الثلاثي الذي تحدثنا عنه في 
آخر مرة لتنفيذ هذا السلوك للتطبيق ، فيمكن إعادة كتابة طريقة التقديم 
render() الخاصة بمكون 
App على النحو التالي:
 render() {   return (       <div>           {               this.state.unreadMessages.length > 0 ?              <h2>You have {this.state.unreadMessages.length} unread messages!</h2> :               null           }       </div>   ) } 
الآن ، إذا كانت مجموعة 
unreadMessages فارغة ، فلن يتم عرض أي شيء على الصفحة. لكن الكود المقدم هنا يمكن تبسيطه باستخدام عامل التشغيل 
&& . إليك كيف ستبدو:
 render() {   return (       <div>           {               this.state.unreadMessages.length > 0 &&              <h2>You have {this.state.unreadMessages.length} unread messages!</h2>           }       </div>   ) } 
إذا كان هناك شيء ما في المصفوفة ، فسيتم عرض الجانب الأيمن من التعبير على الصفحة. إذا كانت المصفوفة فارغة ، فلن يتم عرض أي شيء على الصفحة.
هذا لا يعني أن استخدام عامل التشغيل &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&> لكن النهج المقدم هنا يبسط الكود ، وبالإضافة إلى ذلك ، يتم استخدامه في كثير من الأحيان ، لذلك قد تواجهه أثناء قراءة برامج الآخرين.
الدرس 38. ورشة العمل. التقديم الشرطي
→ 
الأصلob الوظيفة
في ما يلي رمز المكون الوظيفي 
App.js ، والذي يتم تخزينه في ملف 
App.js لمشروع قياسي تم إنشاؤه باستخدام create-react-app.
 import React from "react" function App() {   return (       <div>           Code goes here       </div>   ) } export default App 
تحتاج إلى القيام بما يلي:
- تحويل رمز المكون لتجهيزه مع الدولة.
- تأكد من أن حالة المكون ستحتوي على معلومات حول ما إذا كان المستخدم "قام بتسجيل الدخول" أم لا (في هذا التمرين ، يعني "تسجيل الدخول" إلى النظام و "تسجيل الخروج" تغيير القيمة المقابلة المخزنة في الحالة فقط).
- أضف إلى الصفحة التي تشكل المكون زرًا يتيح للمستخدم تسجيل الدخول والخروج.
 
 - هذه مهمة إضافية. تأكد من أنه إذا لم يتم تسجيل دخول المستخدم ، LOG INالزرLOG IN، وإذا كان قد تم تسجيل الدخول ،LOG OUTبتسجيلLOG OUT.
 
 
- على الصفحة التي تم تكوينها بواسطة المكون ، قم Logged inحالة تسجيل دخول المستخدم ، ثمLogged outإذا لم يتمLogged out.
 
إذا كنت تشعر الآن أنه من الصعب عليك البدء في حل هذه المشكلات ، فقم بإلقاء نظرة على النصائح ثم العمل.
نصائح
لإكمال هذه المهمة ، يجب أن تتذكر الكثير مما تحدثنا عنه في الفصول السابقة. بادئ ذي بدء ، يجب أن يكون المكون الذي يمكن أن يكون له حالة مكونًا يستند إلى فصل دراسي. يجب أن يكون هذا المكون منشئ. في حالة المكون ، يمكنك تخزين خاصية منطقية ، على سبيل المثال ، يمكن تسميتها 
isLoggedIn ، حيث تشير القيمة ، 
true أو 
false ، إلى ما إذا كان المستخدم قد قام بتسجيل الدخول أم لا. من أجل أن يكون الزر الذي يجب إضافته إلى الصفحة التي تم إنشاؤها بواسطة التطبيق قادراً على أداء وظائفه ، سوف يحتاج إلى 
onClick أحداث 
onClick . لعرض نصوص مختلفة ، استنادًا إلى القيمة المتغيرة للحالة ، سيكون من الضروري اللجوء إلى تقنية التقديم الشرطي.
olution الحل
نقوم بتحويل المكون الوظيفي المتاح في الكود إلى المكون بناءً على الفصل. نحن بحاجة إلى هذا لعدة أسباب. أولاً ، نحن بحاجة إلى العمل مع حالة التطبيق. ثانياً ، نحتاج إلى معالج أحداث يسمى عند النقر فوق زر. من حيث المبدأ ، يمكنك كتابة وظيفة مستقلة واستخدامها للتعامل مع أحداث الأزرار ، لكنني أفضل أن أصف معالجات داخل فئات المكونات.
إليك ما سيبدو عليه رمز المكون الوظيفي المحول إلى مكون قائم على الفصل. نحن هنا ، في مُنشئ المكون ، نصف حالته الأولية ، التي تحتوي على الخاصية 
isLoggedIn لتعيين 
false .
 import React from "react" class App extends React.Component {   constructor() {       super()       this.state = {           isLoggedIn: false       }   }   render() {          return (           <div>               Code goes here           </div>       )   } } export default App 
الرمز أعلاه هو حل للأجزاء الأولى والثانية من المهمة. الآن سنعمل على إضافة زر إلى الصفحة المعروضة بواسطة المكون. حتى الآن ، سيعرض هذا الزر نفس النقش بغض النظر عن ما يتم تخزينه في حالة التطبيق. سنعمل على تزويده بمعالج الأحداث ، ووضعه فيه ، للتحقق من إمكانية تشغيل التعليمات البرمجية الخاصة بنا ، وهو أمر بسيط لإخراج رسالة إلى وحدة التحكم. بالإضافة إلى ذلك ، سنقوم في مُنشئ المكون بربط هذا المعالج 
this الأمر ، وهو أمر مفيد لنا عندما نشير ، في رمز هذا المعالج ، إلى الآليات المصممة للعمل مع حالة المكون. الآن رمز يشبه أدناه.
 import React from "react" class App extends React.Component {   constructor() {       super()       this.state = {           isLoggedIn: false       }       this.handleClick = this.handleClick.bind(this)   }     handleClick() {       console.log("I'm working!")   }     render() {          return (           <div>               <button onClick={this.handleClick}>LOG IN</button>           </div>       )   } } export default App 
عند النقر على زر 
LOG IN ، 
I'm working! .
الآن دعنا نتذكر أنه عندما 
isLoggedIn على الزر ، فإن خاصية 
isLoggedIn المخزنة في الحالة 
isLoggedIn من 
true إلى 
false ، والعكس صحيح. للقيام بذلك ، في زر النقر فوق معالج ، سوف تحتاج إلى استدعاء وظيفة 
this.setState() ، والتي يمكن استخدامها بطريقتين. وهي ، يمكن أن تقدم ، في شكل كائن ، فكرة جديدة عن ما يجب تضمينه في الدولة. يوفر المتغير الثاني من استخدامه نقل دالة تأخذ الحالة السابقة للمكون إليها وتُشكِّل واحدة جديدة ، مع إعادة الكائن مرة أخرى. سنفعل ذلك تماما. هذا ما حصلنا عليه في هذه المرحلة من العمل.
 import React from "react" class App extends React.Component {   constructor() {       super()       this.state = {           isLoggedIn: false       }       this.handleClick = this.handleClick.bind(this)   }     handleClick() {       this.setState(prevState => {           return {               isLoggedIn: !prevState.isLoggedIn           }       })   }     render() {          return (           <div>               <button onClick={this.handleClick}>LOG IN</button>           </div>       )   } } export default App 
هنا يمكننا استخدام بنية if-else ، لكننا فقط نحول 
true إلى 
false و 
false إلى 
true باستخدام العامل المنطقي 
! (لا).
حتى الآن ، ليس لدينا آلية تسمح لنا ، بناءً على ما يتم تخزينه في الولاية ، بالتأثير على مظهر التطبيق. لذلك ، سنقوم الآن بحل المهمة الإضافية للمهمة رقم 3. وهي ، سوف نجعل الملصق الموجود على الزر يتغير وفقًا لحالة المكون. من أجل تحقيق ذلك ، يمكنك تعريف متغير في طريقة 
render() قيمته ، 
LOG IN أو 
LOG OUT ، على ما يتم تخزينه في الحالة. ثم يمكن استخدام هذه القيمة كنص زر. هنا هو كيف يبدو.
 import React from "react" class App extends React.Component {   constructor() {       super()       this.state = {           isLoggedIn: false       }       this.handleClick = this.handleClick.bind(this)   }     handleClick() {       this.setState(prevState => {           return {               isLoggedIn: !prevState.isLoggedIn           }       })   }     render() {         let buttonText = this.state.isLoggedIn ? "LOG OUT" : "LOG IN"       return (           <div>               <button onClick={this.handleClick}>{buttonText}</button>           </div>       )   } } export default App 
الآن لنأخذ الجزء الرابع من المهمة. سنقوم بعرض النص على الصفحة بناءً على ما إذا كان المستخدم قد قام بتسجيل الدخول أم لا. في الواقع ، النظر في كل ما هو موجود بالفعل في رمز المكون ، حل هذه المشكلة بسيط جدا. يوجد أدناه الرمز النهائي لملف 
App.js import React from "react" class App extends React.Component {   constructor() {       super()       this.state = {           isLoggedIn: false       }       this.handleClick = this.handleClick.bind(this)   }     handleClick() {       this.setState(prevState => {           return {               isLoggedIn: !prevState.isLoggedIn           }       })   }     render() {         let buttonText = this.state.isLoggedIn ? "LOG OUT" : "LOG IN"       let displayText = this.state.isLoggedIn ? "Logged in" : "Logged out"       return (           <div>               <button onClick={this.handleClick}>{buttonText}</button>               <h1>{displayText}</h1>           </div>       )   } } export default App 
هذا هو ما يبدو عليه التطبيق في المتصفح.
صفحة التطبيق في المتصفحيؤدي النقر فوق الزر " 
LOG IN الموضح في الشكل السابق إلى تغيير حالة التطبيق ، وبعد ذلك يتم عرض " 
LOG OUT على الزر ، ويتم عرض النص على الصفحة لإعلام المستخدم بأنه قام بتسجيل الدخول.
النتائج
واصلنا اليوم الحديث عن التقديم الشرطي ، وفحصنا استخدام 
&& عامل التشغيل ، وأكملنا مهمة عملية تنطوي على العديد من الآليات التي درسناها. في المرة القادمة ، سوف تستمر في العمل على تطبيق Todo وموضوع جديد.
أعزائي القراء! هل تعاملت مع مهمة اليوم العملية؟