اذهب إلى المحتوى

السؤال

نشر

ما أريد فعله هو عمل مكون يأخذ props لتحدد ما إن كان العنصر سيكون من نوع h1 - h2 - h3 - h4 - h5 - h6 بالشكل التالي:

<h{this.props.num}>{this.props.content}</h{this.props.num}>

حاولت أن أستعمل المكون كالتالي:

<CustomTag num="1" content="Hello, World!" />

وتوقعت أن تكون النتيجة كالتالي:

<h2>Hello, World!</h2>

لكن يبدو أن الطريقة السابقة لا تعمل، هل هناك حل بدل من إستعمال جمل if متعددة لتحديد نوع العنصر؟

Recommended Posts

  • 0
نشر

جميل جدا هذا السؤال 

يمكنك أن تستخدم الكود التالي 

return React.createElement(this.props.tagName , this.props, this.props.content);

بكل بساطة الطريقة الأسهل التي نستخدمها لكتابة مكونات ريأكت تسمى ب jsx وهي تبسيط للشكل المرفق لا أكثر ففي حالتنا يمكننا إستخدام الكود المرفق لانشاء المكون بالشكل الذي تريده بطريقة بسيطه حيث أن:

  • this.props.tagName: هي اسم المكون الذي تريده على سبيل المثال في حالتنا هذه h1 أو h2 أو h3....إلخ
  • this.props: هنا كل ال props يتم إعطاءها للمكون 
  • this.props.content: هنا كل ال children أو الأبناء لهذا المكون وفي حالتنا هذه هو المحتوى الذي نود عرضه 

    فعلى سبيل المثال لو كتبنا بطريقة jsx الكود التالي 
<ComponentName color="blue" shadowSize={2}>
  Content Content
</ComponentName>

ف ريأكت تقوم بتحويل هذا الكود إلى الكود التالي وتتعامل معه

React.createElement(
  ComponentName,
  {color: 'blue', shadowSize: 2},
  'Content Content'
)

عسى أن يكون الأمر واضحا ومبسطا. 

بالتوفيق إن شاء الله.

  • 0
نشر

في حالة العناوين الديناميكية (h1 ، h2 ...) ، يمكن للمكون إرجاع React.createElement على هذا النحو.

const Heading = ({level, children, ...props}) => {
    return React.createElement(`h${level}`, props , children)
}

ويمكن تمرير كل من الدعائم والأطفال.

<div>
	<Heading level={1}>Heading 1</Heading>
    <Heading level={2}>Heading 2</Heading>
    <Heading level={3}>Heading 3</Heading>
</div>
      

النتيجة 

Heading 1  <!-- بخط كبير -->
Heading 2  <!-- بخط متوسط-->
Heading 3  <!-- بخط صغر -->

 

  • 0
نشر

لا نستطيع تفسير التعابير ضمن شيفرة JSX حسب التوثيق الرسمي

إنما نستطيع تعريف مكون ديناميكي و من ثم استخدامه كمثال بسيط:

const Heading = "h" + 1;
.
.
return <Heading>...</Heading>;

كمثال كامل:

لاحظ تمرير المتغير level حيث يتم تعريف ال HTML TAG قبل بنائه.

function TypographyHeading({text, level}) {

    // Select heading <h1> - <h5>:
    const Heading = "h" + level;

    return (
        <div>
            <Heading>
      			{text}
            </Heading>
        </div>
    );
}

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...