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#
برای اینکه ابعاد گوشی و حالت افقی یا عمودی بودن آن را ب دست بیاوریم، می توان به صورت زیر از آن ها استفاده کرد: