الفرق بين المراجعتين ل"React/conditional rendering"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
سطر 1: سطر 1:
 
<noinclude>{{DISPLAYTITLE:التصيير الشرطي Conditional Rendering‎}}</noinclude>
 
<noinclude>{{DISPLAYTITLE:التصيير الشرطي Conditional Rendering‎}}</noinclude>
 +
بإمكانك في React إنشاء مُكوِّنات مميّزة تُغلِّف السلوك الذي تريده، ثم بعد ذلك تُصيِّر فقط أجزاء منها اعتمادًا على حالة تطبيقك.
 +
 +
يعمل التصيير الشرطي في React بنفس الطريقة التي تعمل فيها التعابير الشرطيّة في JavaScript، حيث تستطيع استخدام مُعامِلات JavaScript مثل [[JavaScript/if...else|if]] أو [[JavaScript/Conditional Operator|المُعامِل الشرطي]] لإنشاء عناصر تُمثِّل الحالة الحاليّة، ثمّ تدع React تُحدِّث واجهة المستخدم لمُطابقتها.
 +
 +
فلننظر إلى هذين المُكوِّنين:<syntaxhighlight lang="javascript">
 +
function UserGreeting(props) {
 +
  return <h1>أهلًا بعودتك!</h1>;
 +
}
 +
 +
function GuestGreeting(props) {
 +
  return <h1>يرجى التسجيل في الموقع</h1>;
 +
}
 +
 +
</syntaxhighlight>سنُنشِئ مُكوِّن الترحيب <code>Greeting</code> الذي يعرض واحدًا من هذين المُكوِّنين بحسب حالة المستخدم إن كان قيد تسجيل الدخول أم لا:<syntaxhighlight lang="javascript">
 +
function Greeting(props) {
 +
  const isLoggedIn = props.isLoggedIn;
 +
  if (isLoggedIn) {
 +
    return <UserGreeting />;
 +
  }
 +
  return <GuestGreeting />;
 +
}
 +
 +
ReactDOM.render(
 +
  // جرب التغيير إلى isLoggedIn={true}
 +
  <Greeting isLoggedIn={false} />,
 +
  document.getElementById('root')
 +
);
 +
 +
</syntaxhighlight>[https://codepen.io/gaearon/pen/ZpVxNq?editors=0011 جرِّب المثال على موقع CodePen].
 +
 +
يعرض هذا المثال ترحيبًا مختلفًا اعتمادًا على قيمة الخاصيّة <code>isLoggedIn</code>.
 +
 +
== متغيّرات العناصر ==
 +
بإمكانك استخدام المتغيّرات لتخزين العناصر، يُساعد هذا على تصيير جزء من المُكوِّن بشكل شرطي بحيث لا تتغير بقية ناتجه.
 +
 +
فلنأخذ هذين المُكوِّنين الجديدين اللذين يُمثِّلان أزرار تسجيل الخروج (Logout) وتسجيل الدخول (Login):<syntaxhighlight lang="javascript">
 +
function LoginButton(props) {
 +
  return (
 +
    <button onClick={props.onClick}>
 +
      تسجيل الدخول
 +
    </button>
 +
  );
 +
}
 +
 +
function LogoutButton(props) {
 +
  return (
 +
    <button onClick={props.onClick}>
 +
      تسجيل الخروج
 +
    </button>
 +
  );
 +
}
 +
 +
</syntaxhighlight>في المثال السّابق سنُنشِئ مُكوِّن له حالة وسنُسمّيه <code>LoginControl</code>.
 +
 +
سيُصيِّر هذا المُكوِّن إمّا <code>‎<LoginButton /></code>‎ أو ‎<code><LogoutButton /></code>‎ بحسب حالته الحاليّة، سيُصيِّر أيضًا ‎<code><Greeting /></code>‎ من المثال السّابق:<syntaxhighlight lang="javascript">
 +
class LoginControl extends React.Component {
 +
  constructor(props) {
 +
    super(props);
 +
    this.handleLoginClick = this.handleLoginClick.bind(this);
 +
    this.handleLogoutClick = this.handleLogoutClick.bind(this);
 +
    this.state = {isLoggedIn: false};
 +
  }
 +
 +
  handleLoginClick() {
 +
    this.setState({isLoggedIn: true});
 +
  }
 +
 +
  handleLogoutClick() {
 +
    this.setState({isLoggedIn: false});
 +
  }
 +
 +
  render() {
 +
    const isLoggedIn = this.state.isLoggedIn;
 +
    let button;
 +
 +
    if (isLoggedIn) {
 +
      button = <LogoutButton onClick={this.handleLogoutClick} />;
 +
    } else {
 +
      button = <LoginButton onClick={this.handleLoginClick} />
 +
    }
 +
 +
    return (
 +
      <div>
 +
        <Greeting isLoggedIn={isLoggedIn} />
 +
        {button}
 +
      </div>
 +
    );
 +
  }
 +
}
 +
 +
ReactDOM.render(
 +
  <LoginControl />,
 +
  document.getElementById('root')
 +
);
 +
 +
</syntaxhighlight>

مراجعة 10:46، 17 يوليو 2018

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

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

فلننظر إلى هذين المُكوِّنين:

function UserGreeting(props) {
  return <h1>أهلًا بعودتك!</h1>;
}

function GuestGreeting(props) {
  return <h1>يرجى التسجيل في الموقع</h1>;
}

سنُنشِئ مُكوِّن الترحيب Greeting الذي يعرض واحدًا من هذين المُكوِّنين بحسب حالة المستخدم إن كان قيد تسجيل الدخول أم لا:

function Greeting(props) {
  const isLoggedIn = props.isLoggedIn;
  if (isLoggedIn) {
    return <UserGreeting />;
  }
  return <GuestGreeting />;
}

ReactDOM.render(
  // جرب التغيير إلى isLoggedIn={true}
  <Greeting isLoggedIn={false} />,
  document.getElementById('root')
);

جرِّب المثال على موقع CodePen.

يعرض هذا المثال ترحيبًا مختلفًا اعتمادًا على قيمة الخاصيّة isLoggedIn.

متغيّرات العناصر

بإمكانك استخدام المتغيّرات لتخزين العناصر، يُساعد هذا على تصيير جزء من المُكوِّن بشكل شرطي بحيث لا تتغير بقية ناتجه.

فلنأخذ هذين المُكوِّنين الجديدين اللذين يُمثِّلان أزرار تسجيل الخروج (Logout) وتسجيل الدخول (Login):

function LoginButton(props) {
  return (
    <button onClick={props.onClick}>
      تسجيل الدخول
    </button>
  );
}

function LogoutButton(props) {
  return (
    <button onClick={props.onClick}>
      تسجيل الخروج
    </button>
  );
}

في المثال السّابق سنُنشِئ مُكوِّن له حالة وسنُسمّيه LoginControl. سيُصيِّر هذا المُكوِّن إمّا ‎<LoginButton />‎ أو ‎<LogoutButton />‎ بحسب حالته الحاليّة، سيُصيِّر أيضًا ‎<Greeting />‎ من المثال السّابق:

class LoginControl extends React.Component {
  constructor(props) {
    super(props);
    this.handleLoginClick = this.handleLoginClick.bind(this);
    this.handleLogoutClick = this.handleLogoutClick.bind(this);
    this.state = {isLoggedIn: false};
  }

  handleLoginClick() {
    this.setState({isLoggedIn: true});
  }

  handleLogoutClick() {
    this.setState({isLoggedIn: false});
  }

  render() {
    const isLoggedIn = this.state.isLoggedIn;
    let button;

    if (isLoggedIn) {
      button = <LogoutButton onClick={this.handleLogoutClick} />;
    } else {
      button = <LoginButton onClick={this.handleLoginClick} />
    }

    return (
      <div>
        <Greeting isLoggedIn={isLoggedIn} />
        {button}
      </div>
    );
  }
}

ReactDOM.render(
  <LoginControl />,
  document.getElementById('root')
);