الفرق بين المراجعتين لصفحة: «ReactNative/state»

من موسوعة حسوب
لا ملخص تعديل
اشيفرات ورابط التنسيق وبعض التنسيقات النصية
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:الحالة في React Native}}</noinclude>
<noinclude>{{DISPLAYTITLE:الحالة في React Native}}</noinclude>
==الحالة (State)==
==الحالة (State)==
هناك نوعان من البيانات التي تتحكم بالمكوّن: [[ReactNative/props|الخاصياتُ ‎<code>props</code>‎]] والحالةُ ‎<code>state</code>‎. يتم تعيين الخاصيّات من قبل المكوّن الأب وتكون ثابتة طوال حياة المكوّن. أمّا بالنسبة للبيانات التي ستتغيّر، فعلينا استخدام الحالة.
هناك نوعان من البيانات التي تتحكم بالمكوّن: [[ReactNative/props|الخاصياتُ ‎<code>props</code>‎]] والحالةُ ‎<code>state</code>‎. يتم تعيين الخاصيّات من قبل المكوّن الأب وتكون ثابتة طوال حياة المكوّن. أمّا بالنسبة للبيانات التي ستتغيّر، فعلينا استخدام الحالة.
سطر 7: سطر 8:
على سبيل المثال، لنفترض أننا نريد إنشاء نصٍّ يومض طوال الوقت كلّ ثانيّة. يتم ضبط النصّ نفسُه مرّة واحدة عند إنشاء المكوّن الذي يومض، لذا فالنّص نفسه خاصيّة. أمّا "ما إذا كان النص ظاهرًا أو مخفيًّا" فهو شرطٌ يتغيّر بمرور الوقت، لذلك يجب حفظه في الكائن ‎<code>state</code>‎:
على سبيل المثال، لنفترض أننا نريد إنشاء نصٍّ يومض طوال الوقت كلّ ثانيّة. يتم ضبط النصّ نفسُه مرّة واحدة عند إنشاء المكوّن الذي يومض، لذا فالنّص نفسه خاصيّة. أمّا "ما إذا كان النص ظاهرًا أو مخفيًّا" فهو شرطٌ يتغيّر بمرور الوقت، لذلك يجب حفظه في الكائن ‎<code>state</code>‎:
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
import React, { Component } from 'react';
import React, { useState, useEffect } from 'react';
import { AppRegistry, Text, View } from 'react-native';
import { Text, View } from 'react-native';


class Blink extends Component {
const Blink = (props) => {
  constructor(props) {
  const [isShowingText, setIsShowingText] = useState(true);
    super(props);
    this.state = { isShowingText: true };


    // تغيير الحالة كل ثانيّة
  useEffect(() => {
    setInterval(() => (
    const toggle = setInterval(() => {
      this.setState(previousState => (
      setIsShowingText(!isShowingText);
        { isShowingText: !previousState.isShowingText }
    }, 1000);
      ))
    ), 1000);
  }


  render() {
    return () => clearInterval(toggle);
    if (!this.state.isShowingText) {
  })
      return null;
    }


    return (
  if (!isShowingText) {
      <Text>{this.props.text}</Text>
     return null;
     );
   }
   }
  return <Text>{props.text}</Text>;
}
}


export default class BlinkApp extends Component {
const BlinkApp = () => {
  render() {
  return (
    return (
    <View style={{marginTop: 50}}>
      <View>
      <Blink text='I love to blink' />
        <Blink text='I love to blink' />
      <Blink text='Yes blinking is so great' />
        <Blink text='Yes blinking is so great' />
      <Blink text='Why did they ever take this out of HTML' />
        <Blink text='Why did they ever take this out of HTML' />
      <Blink text='Look at me look at me look at me' />
        <Blink text='Look at me look at me look at me' />
    </View>
      </View>
  );
    );
  }
}
}


// تخطّ هذا السطر إن كنت تستعمل أداة
export default BlinkApp;
// Create React Native App
AppRegistry.registerComponent('AwesomeProject', () => BlinkApp);
</syntaxhighlight>
</syntaxhighlight>
في تطبيق واقعيّ، أغلب الظّن أنك لن تُغيِّر الحالة بمُؤقّتٍ كما في الشيفرة أعلاه. قد تُغيّرها عند وصول بيانات جديدة من الخادم، أو من مُدخَل يُدخله مستخدم التطبيق. يمكنك كذلك استخدام حاوي حالةٍ (state container) مثل [https://redux.js.org/ Redux] أو [https://mobx.js.org/ Mobx] للتحكم في تدفق البيانات. في هذه الحالة، يمكنك استخدام Redux أو Mobx لتغيير الحالة بدلاً من استدعاء ‎<code>setState</code>‎ مباشرةً.
في تطبيق واقعيّ، أغلب الظّن أنك لن تُغيِّر الحالة بمُؤقّتٍ كما في الشيفرة أعلاه. قد تُغيّرها عند وصول بيانات جديدة من الخادم، أو من مُدخَل يُدخله مستخدم التطبيق. يمكنك كذلك استخدام حاوي حالةٍ (state container) مثل [https://redux.js.org/ Redux] أو [https://mobx.js.org/ Mobx] للتحكم في تدفق البيانات. في هذه الحالة، يمكنك استخدام Redux أو Mobx لتغيير الحالة بدلاً من استدعاء ‎<code>setState</code>‎ مباشرةً.


عند استدعاء <code>setState</code>، سيُعيد المُكوّن ‎<code>BlinkApp</code>‎ تصيير مكوّنه.
عند استدعاء setState، سيُعيد المُكوّن ‎BlinkApp‎ تصيير مكوّنه.


استدعاءُ ‎<code>setState</code>‎ داخل المؤقِّت يُعيد تصيير (re-render) المكوّن في كل مرة تدقّ فيها عقارب المؤقِّت.
استدعاءُ ‎setState‎ داخل المؤقِّت يُعيد تصيير (re-render) المكوّن في كل مرة تدقّ فيها عقارب المؤقِّت.


تعمل الحالة بنفس طريقة عملها في React، لذلك للحصول على مزيد من التفاصيل حول معالجة الحالة، يمكنك إلقاء نظرة على واجهة  ‎<code>[[React/react component|React.Component]]</code>‎ البرمجيّة.
تعمل الحالة بنفس طريقة عملها في React، لذلك للحصول على مزيد من التفاصيل حول معالجة الحالة، يمكنك إلقاء نظرة على واجهة  ‎<code>[[React/react component|React.Component]]</code>‎ البرمجيّة.


قد تنزعج من أنّ معظم الأمثلة تستخدم النّص الأسود الافتراضي المملّ. لنتعلّم كيفيّة تنسيق التطبيقات وتجميلها.
قد تنزعج من أنّ معظم الأمثلة تستخدم النّص الأسود الافتراضي المملّ. لنتعلّم كيفيّة [[ReactNative/style|تنسيق التطبيقات]].


== مصادر ==
== مصادر ==
* [https://facebook.github.io/react-native/docs/state صفحة State في توثيق React Native الرسمي.]
* [https://facebook.github.io/react-native/docs/state صفحة State في توثيق React Native الرسميّ]
[[تصنيف:ReactNative]]
[[تصنيف:ReactNative]]

مراجعة 17:44، 5 مارس 2021


الحالة (State)

هناك نوعان من البيانات التي تتحكم بالمكوّن: الخاصياتُ ‎props والحالةُ ‎state‎. يتم تعيين الخاصيّات من قبل المكوّن الأب وتكون ثابتة طوال حياة المكوّن. أمّا بالنسبة للبيانات التي ستتغيّر، فعلينا استخدام الحالة.

عمومًا، عليك تهيئة (initialize) الحالة في الدالة البانية (constructor)، ثم استدعاء ‎setState‎ عندما تريد تغييرها.

على سبيل المثال، لنفترض أننا نريد إنشاء نصٍّ يومض طوال الوقت كلّ ثانيّة. يتم ضبط النصّ نفسُه مرّة واحدة عند إنشاء المكوّن الذي يومض، لذا فالنّص نفسه خاصيّة. أمّا "ما إذا كان النص ظاهرًا أو مخفيًّا" فهو شرطٌ يتغيّر بمرور الوقت، لذلك يجب حفظه في الكائن ‎state‎:

import React, { useState, useEffect } from 'react';
import { Text, View } from 'react-native';

const Blink = (props) => {
  const [isShowingText, setIsShowingText] = useState(true);

   useEffect(() => {
     const toggle = setInterval(() => {
       setIsShowingText(!isShowingText);
     }, 1000);

     return () => clearInterval(toggle);
  })

  if (!isShowingText) {
    return null;
  }

  return <Text>{props.text}</Text>;
}

const BlinkApp = () => {
  return (
    <View style={{marginTop: 50}}>
      <Blink text='I love to blink' />
      <Blink text='Yes blinking is so great' />
      <Blink text='Why did they ever take this out of HTML' />
      <Blink text='Look at me look at me look at me' />
    </View>
  );
}

export default BlinkApp;

في تطبيق واقعيّ، أغلب الظّن أنك لن تُغيِّر الحالة بمُؤقّتٍ كما في الشيفرة أعلاه. قد تُغيّرها عند وصول بيانات جديدة من الخادم، أو من مُدخَل يُدخله مستخدم التطبيق. يمكنك كذلك استخدام حاوي حالةٍ (state container) مثل Redux أو Mobx للتحكم في تدفق البيانات. في هذه الحالة، يمكنك استخدام Redux أو Mobx لتغيير الحالة بدلاً من استدعاء ‎setState‎ مباشرةً.

عند استدعاء setState، سيُعيد المُكوّن ‎BlinkApp‎ تصيير مكوّنه.

استدعاءُ ‎setState‎ داخل المؤقِّت يُعيد تصيير (re-render) المكوّن في كل مرة تدقّ فيها عقارب المؤقِّت.

تعمل الحالة بنفس طريقة عملها في React، لذلك للحصول على مزيد من التفاصيل حول معالجة الحالة، يمكنك إلقاء نظرة على واجهة ‎React.Component‎ البرمجيّة.

قد تنزعج من أنّ معظم الأمثلة تستخدم النّص الأسود الافتراضي المملّ. لنتعلّم كيفيّة تنسيق التطبيقات.

مصادر