الفرق بين المراجعتين ل"ReactNative/tutorial"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
سطر 1: سطر 1:
 
<noinclude>{{DISPLAYTITLE:أساسيات React Native}}</noinclude>
 
<noinclude>{{DISPLAYTITLE:أساسيات React Native}}</noinclude>
React Native يشبه [[React]]، لكنه يستخدم مكونات أصيلة بدلاً من مكونات الويب كعناصر أساسية. لفهم البنية الأساسية لتطبيق React Native، يجب أن تفهم أولًا بعضًا من مفاهيم React الأساسية، مثل [[React/introducing jsx|JSX]] و<nowiki/>[[React/components and props|المكوّنات]] و<nowiki/>[[React/state and lifecycle|الحالة ‎<code>state</code>‎]] والخاصيات ‎<code>props</code>. إذا كانت لديك خبرة سابقة مع React، فلا تزال بحاجة إلى معرفة بعض الأمور الخاصة بإطار React Native، كالمكونات الأصيلة (native components) مثلًا. هذا الدليل التطبيقي موجّه إلى جميع الفئات، سواء كانت لديك تجربة مع React أو لا.
+
إطار العمل React Native يشبه [[React]]، لكنه يستخدم مكونات أصيلة بدلًا من مكونات الويب كعناصر أساسية. يجب أن تفهم أولًا بعضًا من مفاهيم React الأساسية، مثل [[React/introducing jsx|JSX]] و<nowiki/>[[React/components and props|المكوّنات]] و<nowiki/>[[React/state and lifecycle|الحالة ‎<code>state</code>‎]] والخاصيات ‎<code>props</code>‎، لفهم البنية الأساسية لتطبيق React Native. إذا كانت لديك خبرة سابقة مع React، فلا تزال بحاجة إلى معرفة بعض الأمور الخاصة بإطار عمل React Native، كالمكونات الأصيلة native components مثلًا. هذا الدليل التطبيقي موجّه إلى جميع الفئات، سواء كانت لديك تجربة مع React أو لا.
  
==مرحبا بالعالم==
+
==مرحبًا بالعالم Hello World==
باتباع تقاليد من سبق، سنبدأ أولا ببناء تطبيقٍ الغرض الوحيد منه هو عرض جملة "مرحبًا بالعالم". إليك الشيفرة:
+
باتباع تقاليد من سبق، سنبدأ أولا ببناء تطبيقٍ الغرض الوحيد منه هو عرض جملة "مرحبًا بالعالم Hello World". إليك الشيفرة:
  
 
<syntaxhighlight lang="javascript">
 
<syntaxhighlight lang="javascript">
import React, { Component } from 'react';
+
import React from 'react';
 
import { Text, View } from 'react-native';
 
import { Text, View } from 'react-native';
  
export default class HelloWorldApp extends Component {
+
const HelloWorldApp = () => {
   render() {
+
  return (
 +
    <View
 +
      style={{
 +
        flex: 1,
 +
        justifyContent: "center",
 +
        alignItems: "center"
 +
      }}>
 +
      <Text>Hello, world!</Text>
 +
    </View>
 +
  )
 +
}
 +
export default HelloWorldApp;
 +
</syntaxhighlight>
 +
يمكنك تعديل عينة الشيفرة البرمجية مباشرة في [https://facebook.github.io/react-native/docs/tutorial محاكي الويب]. يمكنك أيضًا لصقها في ملف ‎<code>App.js</code>‎ لإنشاء تطبيق حقيقي على جهازك المحلي.
 +
 
 +
==شرح الشيفرة==
 +
 
 +
# نحتاج أولًا إلى استيراد <code>React</code> لنتمكّن من استخدام <code>JSX</code>، والتي ستُحوَّل بعد ذلك إلى المكونات الأصيلة لكل منصة.
 +
# استوردنا المكوّنين <code>Text</code> و <code>View</code> من <code>react-native</code> في السطر الثاني من الشيفرة السابقة.
 +
 
 +
ثم ستجد الدالة <code>HelloWorldApp</code>، وهي [[React/components and props|مكون دالة functional component]] وتتصرف هذه الدالة بالطريقة نفسها في React للويب. تعيد هذه الدالة مكون <code>View</code> مع بعض الأنماط والمكوّن <code>Text</code> كابنٍ لها.
 +
 
 +
يسمح المكون <code>Text</code> بتصيير render نص، بينما يصيّر المكوّن <code>View</code> حاوية. طُبِّقت أنماط متعددة على هذه الحاوية، إذًا لنحلل عمل كل نمط منها.
 +
 
 +
النمط الأول هو <code>flex: 1</code>​​، حيث ستحدّد الخاصية <code>[[ReactNative/layout props#flex|flex]]</code> كيف "تملأ" عناصرك المساحة المتوفرة اعتمادًا على المحور الرئيسي. بما أن لدينا حاوية واحدة فقط، لذلك ستشغل هذه الحاوية كل المساحة المتاحة للمكون الأب، وبما أنها المكون الوحيد في هذه الحالة، فستأخذ كل مساحة الشاشة المتاحة.
 +
 
 +
النمط التالي هو <code>[[ReactNative/layout props#justifyContent|justifyContent]]</code>: "center"‎. يؤدي هذا النمط إلى محاذاة العناصر الأبناء للحاوية في مركز محور الحاوية الرئيسي. أخيرًا، لدينا النمط <code>[[ReactNative/layout props#alignItems|alignItems]]</code>: "center"‎، والذي يؤدي إلى محاذاة عناصر الحاوية في مركز محور الحاوية الأفقي.
 +
 
 +
قد تبدو بعض الأجزاء في الشيفرة أعلاه مختلفة عن لغة JavaScript التي اعتدت عليها، لا تقلق، فهذه شيفرة JavaScript بنسختها ES2015 (التي تعرف كذلك بالرمز ES6)، وهي نسخة جديدة من JavaScript تُضيف مجموعة من التحسينات التي أصبحت الآن جزءًا من معيار JavaScript الرسمي، لكنّها غير مدعومة على جميع المتصفّحات، لذلك لا تُستخدَم عادةً في تطوير الويب. React Native يدعم ES2015 افتراضيًّا، لذا يُمكنك استخدام الميّزات الجديدة من JavaScript دون القلق بشأن التوافق. الجملُ ‎<code>from</code>‎و [[JavaScript/import|‎<code>import</code>‎]]  و ‎<code>[[JavaScript/class|class]]</code>‎ و‎<code>extends</code>‎ في المثال أعلاه كلها ميزات ES2015. إن لم تعرف ميّزات النسخة الجديدة من JavaScript، فربّما يُمكنك تعلّمها فقط من خلال قراءة شيفراتٍ برمجيّةٍ كالشيفرة البرمجية أعلاه. أو انظر [https://academy.hsoub.com/tags/introduction%20to%20es6/ هذه السلسلة من الدروس]، إضافة إلى أنّ [[JavaScript|توثيق JavaScript]] في الموسوعة يُغطّي ميّزات ES6 كذلك (استعن بمربّع البحث للوصول إلى صفحات معيّنة).
 +
 
 +
أما الشيء الآخر غير المعتاد في الشيفرة أعلاه فهو الجزء ‎<code><View><Text>Hello world!</Text></View></code>‎. هذه شيفرة JSX وهي بنيةٌ برمجيّةٌ syntax لتضمين XML داخل شيفرة JavaScript. تَستخدم العديد من أطر العمل لغة قوالب templating language خاصة تسمح لك بتضمين شيفرة برمجيّة داخل لغة هيكلة markup language. ويحدث عكس ذلك في شيفرة React. إذ تتيح لك JSX كتابة لغة هيكلة داخل شيفرة برمجيّة. الشيفرة مشابهة للغة HTML على الويب، باستثناء أنّ عناصر الويب مثل ‎<code>[[HTML/div|<nowiki><div></nowiki>]]</code>‎  أو ‎<code>[[HTML/div|<nowiki><span></nowiki>]]</code>‎ تُستبدَل بمكونات React. في هذه الحالة، ‎<code>[[ReactNative/text|<Text>]]</code>‎ هو [[ReactNative/intro react native components|مكونٌ أساسي]] يُستخدَم لعرض مقطعٍ نصيٍّ، أمّا [[ReactNative/view|‎<code>View</code>‎]] فهو مكوّن يقوم مقام ‎<code><nowiki><div></nowiki></code>‎  أو ‎<code><nowiki><span></nowiki></code>‎.
 +
==المكوّنات Components==
 +
تُعرِّف الشيفرة أعلاه مكوّنًا جديدًا باسم ‎<code>HelloWorldApp</code>‎. ستُنشئ العديد من المكونات الجديدة أثناء تطويرك للتطبيقات بإطار عمل React Native. كلّ ما تراه على الشاشة هو مكوّنٌ من هذه المكونات (مثل الأزرار ومربعات الإدخال والصور وغيرها).
 +
 
 +
== الخاصيات Props ==
 +
يمكن تخصيص معظم المكونات عند إنشائها باستخدام معاملات مختلفة، حيث تسمّى معاملات الإنشاء هذه بالخاصيات props.
 +
 
 +
يمكن لمكوناتك الخاصة أيضًا استخدام الخاصيات <code>props</code>، إذ يتيح لك ذلك إنشاء مكون واحد يمكن استخدامه في أماكن مختلفة من تطبيقك، ومع خاصيات مختلفة قليلًا في كل مكان مختلف. يُشار إلى هذه الخاصيات بالشكل <code>props.YOUR_PROP_NAME</code> في مكونات الدالة أو بالشكل <code>this.props.YOUR_PROP_NAME</code> في مكونات الصنف الخاصة بك. اطّلع على المثال التالي:<syntaxhighlight lang="javascript">
 +
import React from 'react';
 +
import { Text, View, StyleSheet } from 'react-native';
 +
 
 +
const styles = StyleSheet.create({
 +
  center: {
 +
    alignItems: 'center'
 +
  }
 +
})
 +
 
 +
const Greeting = (props) => {
 +
  return (
 +
    <View style={styles.center}>
 +
      <Text>Hello {props.name}!</Text>
 +
    </View>
 +
  );
 +
}
 +
 
 +
const LotsOfGreetings = () => {
 +
  return (
 +
    <View style={[styles.center, {top: 50}]}>
 +
      <Greeting name='Rexxar' />
 +
      <Greeting name='Jaina' />
 +
      <Greeting name='Valeera' />
 +
    </View>
 +
  );
 +
}
 +
 
 +
export default LotsOfGreetings;
 +
</syntaxhighlight>يسمح استخدام الاسم <code>name</code> كخاصية بتخصيص المكون <code>Greeting</code>، لنتمكّن من إعادة استخدام هذا المكون لكل التحيات greetings. يستخدم هذا المثال أيضًا المكوّن <code>Greeting</code> في JSX، وهذا ما يجعل React رائعةً للغاية.
 +
 
 +
الشيء الجديد الآخر  هو المكون <code>[[ReactNative/view|View]]</code> الذي يُعَد مفيدًا كحاوية للمكونات الأخرى بهدف التحكم في النمط والتخطيط.
 +
 
 +
يمكنك إنشاء مجموعة متنوعة من الشاشات الثابتة باستخدام الخاصيات <code>props</code> ومكونات <code>[[ReactNative/text|Text]]</code> و <code>[[ReactNative/image|Image]]</code> و <code>[[ReactNative/view|View]]</code> الأساسية، لكن يجب أن تعرف المزيد حول الحالة State لمعرفة كيفية تغيير تطبيقك بمرور الوقت.
 +
 
 +
== الحالة State ==
 +
تسمح الحالة <code>state</code> لمكونات React بتغيير مخرجاتها بمرور الوقت استجابةً لإجراءات المستخدم واستجابات الشبكة وأي شيء آخر، بخلاف الخاصيات التي تكون [[React/components and props#.D8.A7.D9.84.D8.AE.D8.A7.D8.B5.D9.8A.D8.A7.D8.AA props .D9.82.D8.A7.D8.A8.D9.84.D8.A9 .D9.84.D9.84.D9.82.D8.B1.D8.A7.D8.A1.D8.A9 .D9.81.D9.82.D8.B7|قابلة للقراءة فقط]] ولا يجب تعديلها.
 +
 
 +
=== الفرق بين الحالة والخاصيات في React ===
 +
الخاصيات في مكوِّن React هي المتغيرات التي نمررها من مكوّن أب إلى مكوّن ابن. أما الحالة فهي أيضًا متغيرات لكنها لا تُمرَّر كمعاملات حيث يهيّئها ويديرها المكوّن داخليًا.
 +
 
 +
=== هل توجد اختلافات بين React و React Native في التعامل مع الحالة؟ ===
 +
<syntaxhighlight lang="javascript">
 +
// ‫مثال ReactJS لعدّاد Counter باستخدام الخطّافات Hooks
 +
 
 +
import React, { useState } from 'react';
 +
 
 +
 
 +
 
 +
const App = () => {
 +
  const [count, setCount] = useState(0);
 +
 
 +
  return (
 +
    <div className="container">
 +
      <p>You clicked {count} times</p>
 +
      <button
 +
        onClick={() => setCount(count + 1)}>
 +
        Click me!
 +
      </button>
 +
    </div>
 +
  );
 +
};
 +
 
 +
 
 +
// CSS
 +
.container {
 +
  display: flex;
 +
  justify-content: center;
 +
  align-items: center;
 +
}
 +
 
 +
</syntaxhighlight><syntaxhighlight lang="javascript">
 +
// ‫مثال React Native لعّداد Counter باستخدام الخطّافات Hooks
 +
 
 +
import React, { useState } from 'react';
 +
import { View, Text, Button, StyleSheet } from 'react-native';
 +
 
 +
const App = () => {
 +
  const [count, setCount] = useState(0);
 +
 
 +
  return (
 +
    <View style={styles.container}>
 +
      <Text>You clicked {count} times</Text>
 +
      <Button
 +
        onPress={() => setCount(count + 1)}
 +
        title="Click me!"
 +
      />
 +
    </View>
 +
  );
 +
};
 +
 
 +
// React Native أنماط
 +
const styles = StyleSheet.create({
 +
  container: {
 +
    flex: 1,
 +
    justifyContent: 'center',
 +
    alignItems: 'center'
 +
  }
 +
});
 +
</syntaxhighlight>لا يوجد فرق في التعامل مع الحالة بين [[React/state and lifecycle|React]] و React Native كما هو موضح أعلاه. يمكنك استخدام حالة المكونات الخاصة بك في كل من مكونات الدالة ومكونات الصنف باستخدام [[React/hooks intro|الخطّافات hooks]].
 +
 
 +
سنعرض في المثال التالي مثال العدّاد counter نفسه ولكن باستخدام الأصناف classes:<syntaxhighlight lang="javascript">
 +
import React, { Component } from 'react'
 +
import {
 +
  StyleSheet,
 +
  TouchableOpacity,
 +
  Text,
 +
  View,
 +
} from 'react-native'
 +
 
 +
class App extends Component {
 +
   state = {
 +
    count: 0
 +
  }
 +
 
 +
  onPress = () => {
 +
    this.setState({
 +
      count: this.state.count + 1
 +
    })
 +
  }
 +
 
 +
render() {
 
     return (
 
     return (
       <View>
+
       <View style={styles.container}>
         <Text>Hello world!</Text>
+
         <TouchableOpacity
 +
        style={styles.button}
 +
        onPress={this.onPress}
 +
        >
 +
        <Text>Click me</Text>
 +
        </TouchableOpacity>
 +
        <View>
 +
          <Text>
 +
            You clicked { this.state.count } times
 +
          </Text>
 +
        </View>
 
       </View>
 
       </View>
     );
+
     )
 
   }
 
   }
 
}
 
}
</syntaxhighlight>
 
يمكنك تعديل عينة الشيفرة البرمجية مباشرة في [https://facebook.github.io/react-native/docs/tutorial محاكي الويب]. يمكنك أيضًا لصقها في ملف ‎<code>App.js</code>‎ لإنشاء تطبيق حقيقي على جهازك المحلي (اتبع الإرشادات في هذه الصفحة).
 
  
==شرح الشيفرة==
+
const styles = StyleSheet.create({
قد تبدو بعض الأجزاء في الشيفرة أعلاه مختلفة عن لغة JavaScript التي اعتدت عليها، لا تقلق، هذه شيفرة JavaScript بنسختها ES2015 (التي تعرف كذلك بالرمز ES6)، وهي نسخة جديدة من JavaScript تُضيف مجموعة من التحسينات التي أصبحت الآن جزءًا من معيار JavaScript الرسمي، لكنّها غير مدعومة على جميع المتصفّحات، لذا عادةً ما لا تُستخدَم في تطوير الويب. React Native يدعم ES2015 افتراضيًّا، لذا يُمكنك استخدام الميّزات الجديدة من JavaScript دون القلق بشأن التوافق. الجملُ ‎<code>from</code>‎، [[JavaScript/import|‎<code>import</code>‎]]  ، ‎<code>[[JavaScript/class|class]]</code>‎ و‎<code>extends</code>‎ في المثال أعلاه كلها ميزات ES2015. إذا كنت تجهل ميّزات النسخة الجديدة من JavaScript، فربّما يُمكنك تعلّمها فقط من خلال قراءة شيفراتٍ برمجيّةٍ مثل الشيفرة البرمجية أعلاه. أو انظر [https://academy.hsoub.com/tags/introduction%20to%20es6/ هذه السلسلة من الدروس]، إضافة إلى أنّ [[JavaScript|توثيق JavaScript]] في الموسوعة يُغطّي ميّزات ES6 كذلك (استعن بمربّع البحث للوصول إلى صفحات معيّنة).
+
  container: {
 +
    flex: 1,
 +
    justifyContent: 'center',
 +
    alignItems: 'center',
 +
  },
 +
  button: {
 +
    alignItems: 'center',
 +
    backgroundColor: '#DDDDDD',
 +
    padding: 10,
 +
    marginBottom: 10
 +
  }
 +
})
  
أما الشيء الآخر غير المعتاد في الشيفرة أعلاه فهو الجزء ‎<code><View><Text>Hello world!</Text></View></code>‎. هذه شيفرة JSX وهي بنيةٌ برمجيّةٌ (syntax) لتضمين XML داخل شيفرة JavaScript. تَستخدم العديد من أطر العمل لغة قوالب (templating language) خاصة تسمح لك بتضمين شيفرة برمجيّة داخل لغة هيكلة (markup language). وعكس ذلك يحدث في شيفرة React. إذ تتيح لك JSX كتابة لغة هيكلة داخل شيفرة برمجيّة. الشيفرة مشابهة للغة HTML على الويب، باستثناء أنّ عناصر الويب مثل ‎<code>[[HTML/div|<nowiki><div></nowiki>]]</code>‎  أو ‎<code>[[HTML/div|<nowiki><span></nowiki>]]</code>‎ تُستبدَل بمكونات React. في هذه الحالة، ‎<code>[[ReactNative/text|<Text>]]</code>‎ مكونٌ مُضمَّنٌ (built-in component) يُستخدَم لعرض مقطعٍ نصيٍّ، أمّا [[ReactNative/view|‎<code>View</code>‎]] فهو مكوّن يقوم مقام ‎<code><nowiki><div></nowiki></code>‎  أو ‎<code><nowiki><span></nowiki></code>‎.
+
export default App;
==المكوّنات==
+
</syntaxhighlight>
تُعرِّف الشيفرة أعلاه مكوّنًا جديدًا باسم ‎<code>HelloWorldApp</code>‎. ستُنشئُ العديد من المكونات الجديدة أثناء تطويرك للتطبيقات بإطار React Native. كلّ ما تراه على الشاشةِ مكوّنٌ من المكونات (مثل الأزرار، ومربعات الإدخال، والصور، والصناديق والتبويبات وغيرها). يمكن للمكون أن يكون بسيطًا جدًّا، المتطلّب الوحيد هو [[React/rendering elements|دالّةُ التصيير ‎<code>render</code>‎]] التي تُعيد شيفرة JSX لعرضها.
 
 
 
==الخطوة التالية==
 
التطبيق الذي أنشأناه أعلاه لا يؤدي أي وظيفة تُذكَر سوى عرض نص عاديّ، اطّلع على صفحة [[ReactNative/props|الخاصّيّات]] لجعل المكوّنات أنفع.
 
  
== مصادر ==
+
==مصادر==
* [https://facebook.github.io/react-native/docs/tutorial صفحة Learn the Basics في توثيق React Native الرسمي.]
+
* [https://reactnative.dev/docs/tutorial صفحة Learn the Basics في توثيق React Native الرسمي.]
 
[[تصنيف:ReactNative]]
 
[[تصنيف:ReactNative]]

مراجعة 01:59، 28 يونيو 2021

إطار العمل React Native يشبه React، لكنه يستخدم مكونات أصيلة بدلًا من مكونات الويب كعناصر أساسية. يجب أن تفهم أولًا بعضًا من مفاهيم React الأساسية، مثل JSX والمكوّنات والحالة ‎state والخاصيات ‎props‎، لفهم البنية الأساسية لتطبيق React Native. إذا كانت لديك خبرة سابقة مع React، فلا تزال بحاجة إلى معرفة بعض الأمور الخاصة بإطار عمل React Native، كالمكونات الأصيلة native components مثلًا. هذا الدليل التطبيقي موجّه إلى جميع الفئات، سواء كانت لديك تجربة مع React أو لا.

مرحبًا بالعالم Hello World

باتباع تقاليد من سبق، سنبدأ أولا ببناء تطبيقٍ الغرض الوحيد منه هو عرض جملة "مرحبًا بالعالم Hello World". إليك الشيفرة:

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

const HelloWorldApp = () => {
  return (
    <View
      style={{
        flex: 1,
        justifyContent: "center",
        alignItems: "center"
      }}>
      <Text>Hello, world!</Text>
    </View>
  )
}
export default HelloWorldApp;

يمكنك تعديل عينة الشيفرة البرمجية مباشرة في محاكي الويب. يمكنك أيضًا لصقها في ملف ‎App.js‎ لإنشاء تطبيق حقيقي على جهازك المحلي.

شرح الشيفرة

  1. نحتاج أولًا إلى استيراد React لنتمكّن من استخدام JSX، والتي ستُحوَّل بعد ذلك إلى المكونات الأصيلة لكل منصة.
  2. استوردنا المكوّنين Text و View من react-native في السطر الثاني من الشيفرة السابقة.

ثم ستجد الدالة HelloWorldApp، وهي مكون دالة functional component وتتصرف هذه الدالة بالطريقة نفسها في React للويب. تعيد هذه الدالة مكون View مع بعض الأنماط والمكوّن Text كابنٍ لها.

يسمح المكون Text بتصيير render نص، بينما يصيّر المكوّن View حاوية. طُبِّقت أنماط متعددة على هذه الحاوية، إذًا لنحلل عمل كل نمط منها.

النمط الأول هو flex: 1​​، حيث ستحدّد الخاصية flex كيف "تملأ" عناصرك المساحة المتوفرة اعتمادًا على المحور الرئيسي. بما أن لدينا حاوية واحدة فقط، لذلك ستشغل هذه الحاوية كل المساحة المتاحة للمكون الأب، وبما أنها المكون الوحيد في هذه الحالة، فستأخذ كل مساحة الشاشة المتاحة.

النمط التالي هو justifyContent: "center"‎. يؤدي هذا النمط إلى محاذاة العناصر الأبناء للحاوية في مركز محور الحاوية الرئيسي. أخيرًا، لدينا النمط alignItems: "center"‎، والذي يؤدي إلى محاذاة عناصر الحاوية في مركز محور الحاوية الأفقي.

قد تبدو بعض الأجزاء في الشيفرة أعلاه مختلفة عن لغة JavaScript التي اعتدت عليها، لا تقلق، فهذه شيفرة JavaScript بنسختها ES2015 (التي تعرف كذلك بالرمز ES6)، وهي نسخة جديدة من JavaScript تُضيف مجموعة من التحسينات التي أصبحت الآن جزءًا من معيار JavaScript الرسمي، لكنّها غير مدعومة على جميع المتصفّحات، لذلك لا تُستخدَم عادةً في تطوير الويب. React Native يدعم ES2015 افتراضيًّا، لذا يُمكنك استخدام الميّزات الجديدة من JavaScript دون القلق بشأن التوافق. الجملُ ‎from‎و import و ‎class‎ و‎extends‎ في المثال أعلاه كلها ميزات ES2015. إن لم تعرف ميّزات النسخة الجديدة من JavaScript، فربّما يُمكنك تعلّمها فقط من خلال قراءة شيفراتٍ برمجيّةٍ كالشيفرة البرمجية أعلاه. أو انظر هذه السلسلة من الدروس، إضافة إلى أنّ توثيق JavaScript في الموسوعة يُغطّي ميّزات ES6 كذلك (استعن بمربّع البحث للوصول إلى صفحات معيّنة).

أما الشيء الآخر غير المعتاد في الشيفرة أعلاه فهو الجزء ‎<View><Text>Hello world!</Text></View>‎. هذه شيفرة JSX وهي بنيةٌ برمجيّةٌ syntax لتضمين XML داخل شيفرة JavaScript. تَستخدم العديد من أطر العمل لغة قوالب templating language خاصة تسمح لك بتضمين شيفرة برمجيّة داخل لغة هيكلة markup language. ويحدث عكس ذلك في شيفرة React. إذ تتيح لك JSX كتابة لغة هيكلة داخل شيفرة برمجيّة. الشيفرة مشابهة للغة HTML على الويب، باستثناء أنّ عناصر الويب مثل ‎<div>‎ أو ‎<span>‎ تُستبدَل بمكونات React. في هذه الحالة، ‎<Text>‎ هو مكونٌ أساسي يُستخدَم لعرض مقطعٍ نصيٍّ، أمّا View فهو مكوّن يقوم مقام ‎<div>‎ أو ‎<span>‎.

المكوّنات Components

تُعرِّف الشيفرة أعلاه مكوّنًا جديدًا باسم ‎HelloWorldApp‎. ستُنشئ العديد من المكونات الجديدة أثناء تطويرك للتطبيقات بإطار عمل React Native. كلّ ما تراه على الشاشة هو مكوّنٌ من هذه المكونات (مثل الأزرار ومربعات الإدخال والصور وغيرها).

الخاصيات Props

يمكن تخصيص معظم المكونات عند إنشائها باستخدام معاملات مختلفة، حيث تسمّى معاملات الإنشاء هذه بالخاصيات props.

يمكن لمكوناتك الخاصة أيضًا استخدام الخاصيات props، إذ يتيح لك ذلك إنشاء مكون واحد يمكن استخدامه في أماكن مختلفة من تطبيقك، ومع خاصيات مختلفة قليلًا في كل مكان مختلف. يُشار إلى هذه الخاصيات بالشكل props.YOUR_PROP_NAME في مكونات الدالة أو بالشكل this.props.YOUR_PROP_NAME في مكونات الصنف الخاصة بك. اطّلع على المثال التالي:

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

const styles = StyleSheet.create({
  center: {
    alignItems: 'center'
  }
})

const Greeting = (props) => {
  return (
    <View style={styles.center}>
      <Text>Hello {props.name}!</Text>
    </View>
  );
}

const LotsOfGreetings = () => {
  return (
    <View style={[styles.center, {top: 50}]}>
      <Greeting name='Rexxar' />
      <Greeting name='Jaina' />
      <Greeting name='Valeera' />
    </View>
  );
}

export default LotsOfGreetings;

يسمح استخدام الاسم name كخاصية بتخصيص المكون Greeting، لنتمكّن من إعادة استخدام هذا المكون لكل التحيات greetings. يستخدم هذا المثال أيضًا المكوّن Greeting في JSX، وهذا ما يجعل React رائعةً للغاية.

الشيء الجديد الآخر هو المكون View الذي يُعَد مفيدًا كحاوية للمكونات الأخرى بهدف التحكم في النمط والتخطيط.

يمكنك إنشاء مجموعة متنوعة من الشاشات الثابتة باستخدام الخاصيات props ومكونات Text و Image و View الأساسية، لكن يجب أن تعرف المزيد حول الحالة State لمعرفة كيفية تغيير تطبيقك بمرور الوقت.

الحالة State

تسمح الحالة state لمكونات React بتغيير مخرجاتها بمرور الوقت استجابةً لإجراءات المستخدم واستجابات الشبكة وأي شيء آخر، بخلاف الخاصيات التي تكون قابلة للقراءة فقط ولا يجب تعديلها.

الفرق بين الحالة والخاصيات في React

الخاصيات في مكوِّن React هي المتغيرات التي نمررها من مكوّن أب إلى مكوّن ابن. أما الحالة فهي أيضًا متغيرات لكنها لا تُمرَّر كمعاملات حيث يهيّئها ويديرها المكوّن داخليًا.

هل توجد اختلافات بين React و React Native في التعامل مع الحالة؟

// ‫مثال ReactJS لعدّاد Counter باستخدام الخطّافات Hooks

import React, { useState } from 'react';



const App = () => {
  const [count, setCount] = useState(0);

  return (
    <div className="container">
      <p>You clicked {count} times</p>
      <button
        onClick={() => setCount(count + 1)}>
        Click me!
      </button>
    </div>
  );
};


// CSS
.container {
  display: flex;
  justify-content: center;
  align-items: center;
}
// ‫مثال React Native لعّداد Counter باستخدام الخطّافات Hooks

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

const App = () => {
  const [count, setCount] = useState(0);

  return (
    <View style={styles.container}>
      <Text>You clicked {count} times</Text>
      <Button
        onPress={() => setCount(count + 1)}
        title="Click me!"
      />
    </View>
  );
};

// React Native أنماط
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center'
  }
});

لا يوجد فرق في التعامل مع الحالة بين React و React Native كما هو موضح أعلاه. يمكنك استخدام حالة المكونات الخاصة بك في كل من مكونات الدالة ومكونات الصنف باستخدام الخطّافات hooks. سنعرض في المثال التالي مثال العدّاد counter نفسه ولكن باستخدام الأصناف classes:

import React, { Component } from 'react'
import {
  StyleSheet,
  TouchableOpacity,
  Text,
  View,
} from 'react-native'

class App extends Component {
  state = {
    count: 0
  }

  onPress = () => {
    this.setState({
      count: this.state.count + 1
    })
  }

 render() {
    return (
      <View style={styles.container}>
        <TouchableOpacity
         style={styles.button}
         onPress={this.onPress}
        >
         <Text>Click me</Text>
        </TouchableOpacity>
        <View>
          <Text>
            You clicked { this.state.count } times
          </Text>
        </View>
      </View>
    )
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
  button: {
    alignItems: 'center',
    backgroundColor: '#DDDDDD',
    padding: 10,
    marginBottom: 10
  }
})

export default App;

مصادر