RN پکیج های
#
React Native packages#
Navigationمی توان توسط این پکیج routing
را در react native
پیاده سازی کرد ک حتما داکیومنت اصلی آن خوانده شود:
حال اگر در expo
کار می کنیم باید موارد زیر را نیز نصب کنیم:
اما اگر از خود react native cli
استفاده می کنیم باید بجای دستور بالا از دستور زیر استفاده کنیم:
حال می توان در پروژه خود یک فولدر ب نام screens
(دلخواه) بسازیم و صفحاتی ک می خواهیم را در آن بسازیم و از این پکیج برای جابه جا شدن در آن ها استفاده کنیم.
🎉 در react native
به 2 صورت می توان از navigation
استفاده کرد ک 1. Drawer
و 2. stack
می باشد ک اولی به صورت منوی کشویی می باشد و دومی هم می توان ب صورت لینک در جاهای مختلف برنامه استفاده کرد.
#
Stackبرای استفاده از Stack
باید آن را نصب کنیم:
🎉 حتما بعد از نصب این پکیج باید پکیج زیر را نیز توسط خود expo
نصب کنیم تا بر اساس آخرین ورژن مورد نیاز برای expo sdk
آن را نصب کند:
حال باید ب صورت زیر عمل کرد:
- ابتدا باید کل برنامه را داخل
NavigationContainer
پیچید (مانندBrowserRouter
در ری اکت)
- حال باید از پکیج
stack
ک نصب کردیم استفاده کنیم وroute
هایمان را بسازیم ک ب صورت پیش فرض برای ما یکheader
می سازد:
ک در اینجا name
اجباری می باشد و در هر صفحه و کامپوننتی باید از نام آن ها برای جابه جا شدن کاربر استفاده کنیم.
🎉 همچنین یک پکیج دیگر ب نام react-navigation/native-stack
در داکیومنت های خود navigation
وجود دارد ک می توان بجای این پکیج استفاده کرد ک سرعت بالا تری دارد اما زیاد نمی توان آن را شخصی سازی کرد.
- حال در هر کدام از صفحات می توان از
props
هایی ک خودNavigationContainer
می فرستد استفاده کرد و دکمه برای جابه جایی بین صفحات قرار داد:
🎉 مواردی ک ارسال می شود توسط NavigationContainer
شامل موارد بسیاری می باشد ک اگر لاگ بگیریم، موارد زیادی دارد ک همه تابع هستند:
canGoBack
:
برای چک کردن زمانی ک آیا می توان ب صفحه قبل بازگشت یا خیر
goBack
:
زمانی ک بخواهیم ب یک صفحه قبل بگردیم
isFocused
:
زمانی ک بخواهیم چک کنیم ک آیا کاربر در صفحه مورد نظر ما است
navigate
:
برای جابه جا شدن ب صفحه ای ک ما مشخص می کنیم
pop
:
برای حذف یک صفحه ک به stack
پوش شده است (در واقع stack
یک استوانه است ک صفحات ب آن push
می شوند و صفحات جدید روی صفحات قبلی قرار می گیرند یعنی از ته پر می شود. )
popToTop
:
برای زمانی ک بخواهیم کل موارد داخل stack
را حذف کنیم و مستقیما ب آخرین صفحه برویم ک همان صفحه اول می باشد(یعنی اولین push
).
🎉 اگر از push
استفاده کنیم، در واقع ب stack
یک صفحه ای را اضافه کرده ایم و فرق این با navigate
در این است ک push
می تواند صفحه ای ک در آن هستیم را دوباره ب stack
ب تعداد دلخواه اضافه کند و صفحه را reload
می کند ک در این حالت می توان توسط goBack
در صفحات اضافه شده در stack
جابه شویم و همان صفحه را دوباره ببینیم فقط با این فرق ک انگار صفحه reload
می شود.
replace
:
زمانی استفاده می شود ک بخواهیم مثلا در صفحه لاگین، بعد از ورود کاربر، دیگر دکمه بازگشتی نمایش داده نشود و صفحه مورد نظر ما بشود اولین صفحه stack
مان
#
send prop to another pageما می توانیم به صورت بین صفحات، داده ارسال کنیم:
و ب این شکل داده را در صفحه مورد نظر توسط route
آن را دریافت کنیم:
🎉 همچنین می توان در app.jsx
نیز هنگام تعریف stack
مورد نظر، برای آن یک initialParams
نیز تعریف کنیم ک اگر داده ما وجود نداشت، داده ثابت ما نمایش داده شود:
#
header styleما می توانیم به صورت زیر ب header
صفحاتمان استایل بدهیم و این استایل را می توان صفحه ب صفحه بدهیم و یا ب صورت کلی یک استایل را برای همه اعمال کنیم:
🎉 می توان استایل های screenOptions
را ک ب صورت عمومی ب همه ی صفحات اعمال می شود را برداریم و برای هر صفحه در قسمت options
آن استایل ها را بدهیم و هر کدام را متفاوت قرار دهیم.
همچنین موارد بیشتری برای تغییر دادن وجود دارد ک می توانیم خودمان تست کنیم و یا از مستندات استفاده کنیم.
🎉 همچنین استایل هایی ک برای هر route
قرار می دهیم، بر استایل هایی ک در screenOptions
قرار می دهیم ارجعیت دارد.
🎉 همچنین می توان از مواردی ک props.navigation
در صفحات ب ما می دهد نیز برای تغییر header
هر صفحه استفاده کنیم، مثلا با کلیک روی یک دکمه، رنگ و یا نوشته هدر ما تغییر کند:
🎉 همچنین می توان در سمت راست یا چپ header
نیز از یک کامپوننت استفاده کرد یا یک jsx
خاص قرار داد تا نمایش دهد و حتی یک کار خاصی انجام دهد:
🎉 همچنین ما می توانیم یک کامپوننت را بجای headerTitle
و جاهای دیگر نیز قرار دهیم و تمامی props
هایی ک آن قسمت دارد را نیز برای آن کامپوننت بفرستیم تا در آنجا از آن ها استفاده کنیم:
#
Drawerبرای استفاده از drawer
باید مانند stack
ابتدا پکیج مربوط ب آن را از navigation
نصب کنیم:
🎉 حتما بعد از نصب این پکیج باید پکیج های زیر را نیز توسط خود expo
نصب کنیم تا بر اساس آخرین ورژن مورد نیاز برای expo sdk
آن ها را نصب کند:
سپس بعد از نصب این 2 پکیج باید babel.config.json
را نیز تغییر دهیم:
🎉 اگر با ارور زیر مواجه شدیم، باید دستور "مرحله آخر" را بزنیم:
Reanimated 2 failed to create a worklet, maybe you forgot to add Reanimated's babel plugin
و در مرحله آخر نیز باید یک بار سرور metro
را نیز ریست کنیم:
حال می توان از این پکیج استفاده کرد:
🎉 مابقی موارد دقیقا مانند stack
می باشد.
#
Bottom tab navigationابتدا باید پکیج مربوط ب آن را نصب کنیم:
🎉 فرم کلی استفاده از این 3 حالت برای navigate
کردن شبیه ب هم هستند.
حال می توان مانند بقیه حالت ها موارد لازم را استفاده کنیم:
که در قسمت پایین صفحه برای ما یک قسمت برای navigate
می آورد ک آیکون هایش باید عوض شود و می توان آن را کامل شخصی سازی کرد:
🎉 همچنین میتوان برای تغییر آیکون ها از options
تک تک route
ها نیز استفاده کرد.
#
nested navigationمی توان برای اینکه از چند مدل navigation
استفاده کنیم ب صورت زیر عمل کنیم:
حال می توان در یکی از این صفحات اصلی، از یکی دیگر از navigation
ها استفاده کنیم:
ب این صورت وقتی وارد صفحه Home
می شویم، در قسمت پایینی صفحه می توان Tab navigation
را ببینیم.
همچنین میتوان در صفحه Settings
یک دکمه قرار دهیم ک مارا ب Information
ک در Stack
می باشد ببرد:
🎉 باید حواسمان باشد ک اگر از nested navigation
استفاده کردیم، باید در نظر داشته باشیم ک history
هر navigation
( دراور یا استک یا ... ) برای خودش است و تاریخچه هر تبی ک جابه جا می شویم در همان navigation
ذخیره می شود پس نمی توان در navigation
های دیگر ب آن یکی دسترسی داشته باشیم.
🎉 باید حواسمان باشد ک هر navigation
آپشن های مختص ب خودش را دارد
🎉 همچنین ما نمی توانیم از screen
استفاده شده در یک navigation
به یک screen
در یک navigation
دیگر مقداری بفرستیم و برای حل این موضوع می توان از context
یا redux
استفاده کرد.
🎉 در nested navigation
در واقع navigation
های فرزند، رویداد های navigation
والد را ارثبری نمی کنند.
🎉 همچنین UI
نویگیتور والد بالای UI
نویگیتور فرزند رندر می شود، به طور مثال اگر یک Drawer
فرزند یک Stack
باشد، هنگام باز شدن، زیر Stack
باز می شود
🎉 همچنین ما میتوانیم ب صورت زیر از حالت nested
استفاده کنیم و برای هر چند صفحه، یک والد در نظر بگیریم:
در این حالت history
هر بخش درون همان تابع و navigation
ذخیره می شود، یعنی اگر درون یک والد، به یکی از صفحات زیر مجموعه آن برویم و سپس وارد یک صفحه دیگر از یک والد دیگر شویم، هنگام برگشت باز در همان صفحه ک رفته بودیم، خواهیم رفت.
🎉 همچنین می توان درون هر کامپوننت با navigate
ب هر کدام از صفحات دیگر رفت.
🎉 سعی شود ک خیلی navigation
ها را nested
نکنیم.
#
navigation life cycleبرای اینکه هنگام هربار ورود کاربر ب یک صفحه، یک تابعی یا کدی را اجرا کنیم، چند راه وجود دارد
اما خود navigation
این کد را پیشنهاد نمی دهد و خودش برای اینکار هوک های مجزا دارد:
#
fullscreen modalمی توان توسط کد های زیر یک صفحه خاص را ب حالت مودال تمام صفحه تبدیل کرد:
🎉 همچنین می توان توسط Stack.Group
صفحات را گروه بندی کرد و استایل های خاصی را ب هر گروه بدهیم
#
react-native-community/hooks@یکی از پکیج های عالی برای دسترسی ب موارد زیر در React Native
می باشد:
#
useDimensions & useDeviceOrientationبرای اینکه ابعاد گوشی و حالت افقی یا عمودی بودن آن را ب دست بیاوریم، می توان به صورت زیر از آن ها استفاده کرد: