Menu
flag Ar iconالعربيةdown icon

العرض الشرطي في React: if والمعامل الثلاثي و&& وnull

العرض الشرطي في React هو JavaScript عادية: عبارة if أو معامل ثلاثي أو && يحدد أي JSX يُرجعها المكوّن. تعلّم كل نمط، والصفر الشارد الذي قد يطبعه &&، وإرجاع null، ولماذا إخفاء المكوّن ليس كعدم عرضه.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

العرض الشرطي في React يعني اختيار ما يُرجعه المكوّن بـ JavaScript عادية: عبارة if قبل return، أو معامل ثلاثي cond ? a : b داخل JSX، أو cond && <Thing /> لإظهار شيء أو لا شيء. لا توجد صيغة قوالب خاصة عليك تعلمها.

انقر الزر فتتبدل الرسالة والتسمية كلتاهما، لأن كل معامل ثلاثي يختار نصًا مختلفًا في العرض التالي. غيّر useState(false) إلى useState(true) فتبدأ المعاينة بحالة تسجيل الدخول.

عبارات if والإرجاع المبكر

تقبل أقواس JSX المعقوصة التعابير لا العبارات، فلا يمكنك كتابة {if (x) ...} داخل الترميز. لكن يمكنك كتابة أي if تريدها قبل return. عندما تبدو حالة كاملة للمكوّن مختلفة (التحميل، أو الخطأ، أو الفراغ)، أرجع مبكرًا لكل حالة واحتفظ بالترميز الرئيسي للحالة العادية.

كل زر يضع صندوق الوارد في حالة مختلفة، ولكل حالة فرعها القصير السهل القراءة. يُبقي الإرجاع المبكر المسار الطبيعي في الأسفل دون تداخل.

المعامل الثلاثي داخل JSX

عندما يتغير جزء صغير فقط من الترميز، يُبقيه معامل ثلاثي مضمّن متماسكًا: {isOpen ? <CloseIcon /> : <MenuIcon />}. يعمل المعامل الثلاثي جيدًا مع خيارين. أما المعاملات الثلاثية المتداخلة لثلاثة خيارات أو أكثر فتصبح صعبة القراءة بسرعة:

// Hard to follow
{status === 'loading' ? <Spinner /> : status === 'error' ? <ErrorBox /> : <List />}

عندما ترى ذلك، انقل المنطق إلى سلسلة if قبل return (كما في الأعلى) أو إلى خريطة كائن (في الأسفل).

المعامل && والصفر الشارد

يعرض cond && <Thing /> العنصر <Thing /> عندما تكون cond صائبة، ولا يعرض شيئًا عندما تكون false. ينجح ذلك لأن && يُرجع طرفه الأول عندما يكون خاطئًا، ولا تعرض React شيئًا للقيم false وnull وundefined.

الفخ أن 0 قيمة خاطئة أيضًا، وأن React تعرض الأرقام فعلًا. لذا فإن count && <Badge /> مع عدد يساوي 0 يضع 0 حرفيًا في الصفحة.

عندما لا توجد رسائل غير مقروءة يقرأ السطر الأول "Broken: 0" بينما لا يعرض الثاني شيئًا بعد "Fixed:". انقر New message فيتفقان؛ وانقر Mark all read فيعود 0. الحل هو إعطاء && قيمة منطقية حقيقية: unread > 0 أو items.length > 0 أو Boolean(unread). للنص الفارغ '' المشكلة نفسها من حيث المبدأ، لكنه يُعرض كلا شيء مرئي، فنادرًا ما تلاحظه.

إرجاع null

يمكن للمكوّن أن يُرجع null ليعرض لا شيء. شريط تحذير لا يظهر إلا عندما يوجد ما يُحذَّر منه مثال مناسب: يعرض الأب دائمًا <Warning /> والمكوّن هو من يقرر.

راقب وحدة التحكم: تسجّل الدالة Warning في كل عرض، بما في ذلك المرات التي تُرجع فيها null. إرجاع null يتخطى المخرجات لا العمل. ما زالت خطافاته وتأثيراته تعمل، فإذا كان المكوّن مكلفًا أو يبدأ شيئًا ما (مؤقتًا أو اشتراكًا)، فقرّر في الأب ولا تعرضه أصلًا.

تخزين JSX في متغير

JSX قيمة، فيمكنك إسنادها إلى متغير، وبناؤها بعبارات if، ووضعها في الترميز لاحقًا. يفيد هذا عندما يعتمد جزء من تخطيط أكبر على عدة شروط.

function Checkout({ cart, user }) {
    let action;
    if (!user) {
        action = <a href="/login">Log in to check out</a>;
    } else if (cart.length === 0) {
        action = <p>Your cart is empty.</p>;
    } else {
        action = <button>Pay now</button>;
    }

    return (
        <section>
            <h2>Your cart</h2>
            {action}
        </section>
    );
}

الاختيار بين عدة مكوّنات بكائن

عندما يكون الاختيار «واحدًا من كثير»، يكون الكائن الذي يربط كل قيمة بمكوّن أقصر من سلسلة if طويلة أو من switch، وإضافة حالة سطر واحد.

يختار TABS[tab] مكوّنًا، ويعرضه <Panel />. يجب أن يبدأ المتغير بحرف كبير: تعامل JSX <panel /> كوسم HTML. أضف مدخلًا notifications إلى TABS بمكوّنه الخاص فيظهر زر رابع.

الإخفاء ليس كعدم العرض

هناك طريقتان لإخفاء شيء، وتتصرفان بشكل مختلف. يزيل show && <Counter /> المكوّن من الشجرة عندما تكون show خاطئة. تفصله React وترمي حالته، فيبدأ من الصفر عندما يعود. أما إخفاؤه بـ CSS (style={{ display: show ? 'block' : 'none' }}) فيُبقيه مركّبًا، فتبقى حالته.

انقر العدّادين بضع مرات، وألغِ تحديد المربع، ثم حدّده مرة أخرى. عاد العدّاد الأول إلى 0 وما زال الثاني يحتفظ برقمه. لا أحدهما خاطئ: الإزالة مناسبة لنموذج ينبغي أن يبدأ فارغًا في كل مرة، والإخفاء مناسب لتبويبات ينبغي الاحتفاظ بموضع التمرير أو المدخلات فيها. تشرح صفحة العرض كيف تقرر React أن المكوّن هو نفسه بين مرات العرض.

تضيف React 19.2 خيارًا ثالثًا، <Activity mode="hidden">، الذي يخفي أبناءه ويحتفظ بحالتهم كما تفعل CSS، وينظّف أيضًا تأثيراتهم إلى أن يُعرضوا من جديد.

props وسمات شرطية

الشروط لا تتعلق فقط بالعناصر التي تظهر. يمكن لأي prop أن تأخذ قيمة محسوبة، فغالبًا ما يكفيك معامل ثلاثي أو مقارنة داخل سمة:

<button disabled={!canSave} className={hasError ? 'field error' : 'field'}>
    Save
</button>
<input aria-invalid={hasError} placeholder={user ? user.email : 'you@example.com'} />

عندما تكون قيمة prop هي undefined، تحذف React السمة كليًا، وهذه طريقة نظيفة لإضافة سمة في بعض الأحيان فقط: title={isTruncated ? fullText : undefined}. وللسمات المنطقية مثل disabled وchecked، مرّر true أو false فتضيفها React أو تزيلها.

الشروط في القوائم

لاستبعاد عناصر من قائمة، رشّح المصفوفة قبل المرور عليها بدلًا من إرجاع null من داخل map. يُقرأ items.filter((i) => i.done).map(...) كما يعمل تمامًا، وتعرضه صفحة القوائم والمفاتيح في مثال قابل للتشغيل.

الأسئلة الشائعة

كيف تكتب عبارة if داخل JSX؟

لا يمكنك وضع عبارة if داخل أقواس JSX المعقوصة، لأن الأقواس تأخذ تعابير. استخدم المعامل الثلاثي (cond ? a : b) أو && داخل JSX، أو نفّذ if قبل return واحفظ JSX في متغير.

لماذا يعرض مكوّني الرقم 0؟

يُرجع count && <Badge /> القيمة count نفسها عندما تكون 0، وتعرض React الرقم 0. اجعل الطرف الأول قيمة منطقية حقيقية: count > 0 && <Badge />.

كيف أعرض لا شيء في React؟

أرجع null من المكوّن، أو ضع null أو undefined أو false أو true في JSX. لا تعرض React أيًا منها.

هل يظل المكوّن الذي يُرجع null يعمل؟

نعم. تعمل دالته، وتعمل خطافاته، وتُطلق تأثيراته. إرجاع null يعني فقط أنه لا يضيف شيئًا إلى الصفحة. ولتخطي العمل كليًا، لا تعرض المكوّن من الأب.

هل أخفي المكوّن بـ CSS أم أزيله؟

إزالته (show && <Panel />) تفصله عن الشجرة، فتُرمى حالته ويبدأ من جديد في المرة التالية. أما إخفاؤه بـ display: none فيُبقيه مركّبًا ويحتفظ بحالته. اختر بحسب ما إذا كان ينبغي للحالة أن تبقى.

رسم توضيحي للغات البرمجة في Coddy

تعلّم البرمجة مع Coddy

ابدأ الآن