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

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
سطر 4: سطر 4:
 
يغطي هذا الدليل مكونات التنقّل المتوفرة في React Native. إذا كان مفهوم التنقّل جديدًا عليك، فربما  من الأفضل أن تستخدم مكتبة [https://facebook.github.io/react-native/docs/navigation#react-navigation React Navigation] التي توفّر حلًّا سهل الاستخدام لإدارة التنقّل بين الشاشات، مع القدرة على استخدام نمطي التنقل المُكدَّس (stack navigation) والتنقل المبوب (tabbed navigation) الشائعين على كل من نظامي التشغيل iOS وAndroid.
 
يغطي هذا الدليل مكونات التنقّل المتوفرة في React Native. إذا كان مفهوم التنقّل جديدًا عليك، فربما  من الأفضل أن تستخدم مكتبة [https://facebook.github.io/react-native/docs/navigation#react-navigation React Navigation] التي توفّر حلًّا سهل الاستخدام لإدارة التنقّل بين الشاشات، مع القدرة على استخدام نمطي التنقل المُكدَّس (stack navigation) والتنقل المبوب (tabbed navigation) الشائعين على كل من نظامي التشغيل iOS وAndroid.
  
إذا كنت تستهدف نظام التشغيل iOS فقط، فانظر NavigatorIOS لطريقةٍ توفِّر مظهرًا أصيلًا سهلَ الإعداد، إذ يُوفّر غلافًا (wrapper) حول الصّنف الأصيل ‎<code>UINavigationController</code>‎. لكنّ هذا المكون لن يعمل على Android.
+
إذا كنت تستهدف نظام التشغيل iOS فقط، فانظر <code>[[ReactNative/navigatorios|NavigatorIOS]]</code> لطريقةٍ توفِّر مظهرًا أصيلًا سهلَ الإعداد، إذ يُوفّر غلافًا (wrapper) حول الصّنف الأصيل ‎<code>UINavigationController</code>‎. لكنّ هذا المكون لن يعمل على Android.
  
إذا أردت مظهرًا أصيلًا على كل من نظامي التشغيل iOS وAndroid، أو إذا كنت بصدد دمج React Native مع تطبيق أصيل يعمل بالفعل على إدارة التنقّل، فمكتبةreact-native-navigation توفر تنقّلًا أصيلًا على كلا النظامين.
+
إذا أردت مظهرًا أصيلًا على كل من نظامي التشغيل iOS وAndroid، أو إذا كنت بصدد دمج React Native مع تطبيق أصيل يعمل بالفعل على إدارة التنقّل، فمكتبة [https://github.com/wix/react-native-navigation react-native-navigation] توفر تنقّلًا أصيلًا على كلا النظامين.
  
 
==React Navigation==
 
==React Navigation==
سطر 45: سطر 45:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
تُسهِّل موجّهات (routers) مكتبة React Navigation الهيمنة على (override) آليّة عمل التنقل. ولأنّ الموجّهات قابلة للتّداخل (nested) داخل بعضها البعض، فيمكن للمطورين تغيير منطق التنقل في منطقة واحدة من التطبيق دون إجراء تغييرات واسعة النطاق.
+
تُسهِّل موجّهات (routers) مكتبةِ [https://facebook.github.io/react-native/docs/navigation#react-navigation React Navigation] الهيمنة على (override) آليّة عمل التنقل. ولأنّ الموجّهات قابلة للتّداخل (nested) داخل بعضها البعض، فيمكن للمطورين تغيير منطق التنقل في منطقة واحدة من التطبيق دون إجراء تغييرات واسعة النطاق.
  
تستخدم عروضُReact Navigation مكوّنات أصيلة مع مكتبة التحريك ‎<code>Animated</code>‎ لتقديم تحريكاتِ 60 إطارًا في الثانية (60fps) تُشغَّل على السلسلة الأصيلة (native thread). إضافةً إلى إمكانيّة تخصيص التحريكات والإيماءات بسهولة.
+
تستخدم عروضُ React Navigation مكوّناتٍ أصيلة مع مكتبة التحريك [[ReactNative/animated|‎<code>Animated</code>‎]] لتقديم تحريكاتِ 60 إطارًا في الثانية (60fps) تُشغَّل على السلسلة الأصيلة (native thread). إضافةً إلى إمكانيّة تخصيص التحريكات والإيماءات بسهولة.
  
 
لمقدمة كاملة حول React Navigation، اتبع [https://reactnavigation.org/docs/getting-started.html دليل React Navigation]، أو تصفح توثيقات أخرى [https://expo.io/@react-navigation/NavigationPlayground كهذه الصفحة].
 
لمقدمة كاملة حول React Navigation، اتبع [https://reactnavigation.org/docs/getting-started.html دليل React Navigation]، أو تصفح توثيقات أخرى [https://expo.io/@react-navigation/NavigationPlayground كهذه الصفحة].
سطر 53: سطر 53:
 
==المكوّن ‎<code>NavigatorIOS</code>‎==
 
==المكوّن ‎<code>NavigatorIOS</code>‎==
 
يبدو المكوّن ‎<code>NavigatorIOS</code>‎ مطابقًا للصنف [https://developer.apple.com/documentation/uikit/uinavigationcontroller ‎<code>UINavigationController</code>‎]، وهذا لأنه مبنيّ عليه.
 
يبدو المكوّن ‎<code>NavigatorIOS</code>‎ مطابقًا للصنف [https://developer.apple.com/documentation/uikit/uinavigationcontroller ‎<code>UINavigationController</code>‎]، وهذا لأنه مبنيّ عليه.
[[ملف:NavigationStack-NavigatorIOS.gif|مركز|لاإطار]]
+
[[ملف:NavigationStack-NavigatorIOS.gif|مركز|لاإطار]]مثال:<syntaxhighlight lang="javascript">
 
 
<syntaxhighlight lang="javascript">
 
 
<NavigatorIOS
 
<NavigatorIOS
 
   initialRoute={{
 
   initialRoute={{
سطر 66: سطر 64:
 
يستخدم ‎<code>NavigatorIOS</code>‎ الموجّهات (routes) لتمثيل الشاشات بشكل مشابهٍ لأنظمة التنقل الأخرى، مع بعض الاختلافات المهمة. يمكن تحديد المكون الفعلي الذي سيُصيَّر بمفتاح ‎<code>component</code>‎ في الموجّه، ويمكن تحديد أي خاصيّاتٍ لتُمرَّر إلى هذا المكون داخل ‎<code>passProps</code>‎. سيُمرَّرُ كائنُ ‎<code>navigator</code>‎ تلقائيًا كخاصيّةٍ للمكوّن، ما يسمح لك باستدعاء كل من ‎<code>push</code>‎ و‎<code>pop</code>‎ حسب الحاجة.
 
يستخدم ‎<code>NavigatorIOS</code>‎ الموجّهات (routes) لتمثيل الشاشات بشكل مشابهٍ لأنظمة التنقل الأخرى، مع بعض الاختلافات المهمة. يمكن تحديد المكون الفعلي الذي سيُصيَّر بمفتاح ‎<code>component</code>‎ في الموجّه، ويمكن تحديد أي خاصيّاتٍ لتُمرَّر إلى هذا المكون داخل ‎<code>passProps</code>‎. سيُمرَّرُ كائنُ ‎<code>navigator</code>‎ تلقائيًا كخاصيّةٍ للمكوّن، ما يسمح لك باستدعاء كل من ‎<code>push</code>‎ و‎<code>pop</code>‎ حسب الحاجة.
  
لأنّ المكوّن ‎<code>NavigatorIOS</code>‎ يعتمد على آليات التّنقل التي توفِّرها أدواتUIKit الأصيلة، فسيعرض تلقائيًا شريط تنقّلٍ مع عنوانٍ وزر رجوع.
+
لأنّ المكوّن ‎<code>NavigatorIOS</code>‎ يعتمد على آليات التّنقل التي توفِّرها أدوات UIKit الأصيلة، فسيعرض تلقائيًا شريط تنقّلٍ مع عنوانٍ وزر رجوع.
 
<syntaxhighlight lang="javascript">
 
<syntaxhighlight lang="javascript">
 
import React from 'react';
 
import React from 'react';
سطر 123: سطر 121:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
انظر توثيق ‎<code>NavigatorIOS</code>‎  للمزيد من المعلومات حول هذا المكون.
+
انظر توثيق [[ReactNative/navigatorios|‎<code>NavigatorIOS</code>‎]] للمزيد من المعلومات حول هذا المكون.
 
== مصادر ==
 
== مصادر ==
 
* [https://facebook.github.io/react-native/docs/navigation صفحة Navigating Between Screens في توثيق React Native الرسمي.]
 
* [https://facebook.github.io/react-native/docs/navigation صفحة Navigating Between Screens في توثيق React Native الرسمي.]
 
[[تصنيف:ReactNative]]
 
[[تصنيف:ReactNative]]

مراجعة 13:07، 26 يناير 2019

نادرًا ما تتكون تطبيقات الجوال من شاشة واحدة فقط. عادةً ما يُدار عرض شاشاتٍ متعدّدة والتحويل بينها بما يعرف بالمتنقّل (navigator).

يغطي هذا الدليل مكونات التنقّل المتوفرة في React Native. إذا كان مفهوم التنقّل جديدًا عليك، فربما من الأفضل أن تستخدم مكتبة React Navigation التي توفّر حلًّا سهل الاستخدام لإدارة التنقّل بين الشاشات، مع القدرة على استخدام نمطي التنقل المُكدَّس (stack navigation) والتنقل المبوب (tabbed navigation) الشائعين على كل من نظامي التشغيل iOS وAndroid.

إذا كنت تستهدف نظام التشغيل iOS فقط، فانظر NavigatorIOS لطريقةٍ توفِّر مظهرًا أصيلًا سهلَ الإعداد، إذ يُوفّر غلافًا (wrapper) حول الصّنف الأصيل ‎UINavigationController‎. لكنّ هذا المكون لن يعمل على Android.

إذا أردت مظهرًا أصيلًا على كل من نظامي التشغيل iOS وAndroid، أو إذا كنت بصدد دمج React Native مع تطبيق أصيل يعمل بالفعل على إدارة التنقّل، فمكتبة react-native-navigation توفر تنقّلًا أصيلًا على كلا النظامين.

React Navigation

الحل الذي يتبنّاه مجتمع المطورين هو مكتبةٌ قائمة بذاتها تسمح للمطورين بإعداد شاشات التطبيق باستخدام بضعة أسطر من الشيفرة.

الخطوة الأولى هي تثبيتها في مشروعك:

npm install --save react-navigation

يمكنك بعد ذلك إنشاء تطبيقٍ بسرعة باستخدام شاشة رئيسية وشاشة ملف شخصي كالتالي:

import {createStackNavigator, createAppNavigator} from 'react-navigation';

const MainNavigator = createStackNavigator({
  Home: {screen: HomeScreen},
  Profile: {screen: ProfileScreen},
});

const App = createAppNavigator(MainNavigator);

export default App;

يمكن لكل مكوّن شاشةٍ تعيين خيارات التنقل مثل عنوان الترويسة (header). يمكن للمكتبة استخدام منشئي تأثيرات (action creators) على خاصيّة ‎navigation‎ لإنشاء روابط توصِل إلى شاشاتٍ أخرى (انظر الدالةَ ‎navigate()‎‎ التي استُخرِجَت من ‎this.props.navigation‎ أسفله):

class HomeScreen extends React.Component {
  static navigationOptions = {
    title: 'Welcome',
  };
  render() {
    const {navigate} = this.props.navigation;
    return (
      <Button
        title="Go to Jane's profile"
        onPress={() => navigate('Profile', {name: 'Jane'})}
      />
    );
  }
}

تُسهِّل موجّهات (routers) مكتبةِ React Navigation الهيمنة على (override) آليّة عمل التنقل. ولأنّ الموجّهات قابلة للتّداخل (nested) داخل بعضها البعض، فيمكن للمطورين تغيير منطق التنقل في منطقة واحدة من التطبيق دون إجراء تغييرات واسعة النطاق.

تستخدم عروضُ React Navigation مكوّناتٍ أصيلة مع مكتبة التحريك Animated لتقديم تحريكاتِ 60 إطارًا في الثانية (60fps) تُشغَّل على السلسلة الأصيلة (native thread). إضافةً إلى إمكانيّة تخصيص التحريكات والإيماءات بسهولة.

لمقدمة كاملة حول React Navigation، اتبع دليل React Navigation، أو تصفح توثيقات أخرى كهذه الصفحة.

المكوّن ‎NavigatorIOS

يبدو المكوّن ‎NavigatorIOS‎ مطابقًا للصنف UINavigationController، وهذا لأنه مبنيّ عليه.

NavigationStack-NavigatorIOS.gif

مثال:

<NavigatorIOS
  initialRoute={{
    component: MyScene,
    title: 'My Initial Scene',
    passProps: {myProp: 'foo'},
  }}
/>

يستخدم ‎NavigatorIOS‎ الموجّهات (routes) لتمثيل الشاشات بشكل مشابهٍ لأنظمة التنقل الأخرى، مع بعض الاختلافات المهمة. يمكن تحديد المكون الفعلي الذي سيُصيَّر بمفتاح ‎component‎ في الموجّه، ويمكن تحديد أي خاصيّاتٍ لتُمرَّر إلى هذا المكون داخل ‎passProps‎. سيُمرَّرُ كائنُ ‎navigator‎ تلقائيًا كخاصيّةٍ للمكوّن، ما يسمح لك باستدعاء كل من ‎push‎ و‎pop‎ حسب الحاجة.

لأنّ المكوّن ‎NavigatorIOS‎ يعتمد على آليات التّنقل التي توفِّرها أدوات UIKit الأصيلة، فسيعرض تلقائيًا شريط تنقّلٍ مع عنوانٍ وزر رجوع.

import React from 'react';
import PropTypes from 'prop-types';
import {Button, NavigatorIOS, Text, View} from 'react-native';

export default class NavigatorIOSApp extends React.Component {
  render() {
    return (
      <NavigatorIOS
        initialRoute={{
          component: MyScene,
          title: 'My Initial Scene',
          passProps: {index: 1},
        }}
        style={{flex: 1}}
      />
    );
  }
}

class MyScene extends React.Component {
  static propTypes = {
    route: PropTypes.shape({
      title: PropTypes.string.isRequired,
    }),
    navigator: PropTypes.object.isRequired,
  };

  constructor(props, context) {
    super(props, context);
    this._onForward = this._onForward.bind(this);
  }

  _onForward() {
    let nextIndex = ++this.props.index;
    this.props.navigator.push({
      component: MyScene,
      title: 'Scene ' + nextIndex,
      passProps: {index: nextIndex},
    });
  }

  render() {
    return (
      <View>
        <Text>Current Scene: {this.props.title}</Text>
        <Button
          onPress={this._onForward}
          title="Tap me to load the next scene"
        />
      </View>
    );
  }
}

انظر توثيق NavigatorIOS للمزيد من المعلومات حول هذا المكون.

مصادر