強烈推薦使用該三方
如果在使用過程中遇到什么問題,可以加入react-native興趣交流群
群號:397885169
一起討論學習,也歡迎在評論區(qū)評論缔恳。
RN項目模板,還未完成洁闰,但react-native-router-flux的Demo在里面
本文會持續(xù)更新歉甚,只要該庫作者不停止更新,那么我也不會停下腳步扑眉。
可能很多人之前就用過這個三方纸泄,也可能有些人聽過沒用過赖钞。在這系列文章中,有這樣幾方面原因:
通用性:在最新的V4版本中是基于
react-navigation
實現(xiàn)的聘裁,如果使用過react-native-router-flux
那么使用新版本的學習成本會低很多雪营;實用性:
react-navigation
雖然是官方推薦的導航庫,但其庫內(nèi)部提供的衡便,可以直接使用的功能很簡單献起,有些還需要配合redux來實現(xiàn)需要的功能。而react-native-router-flux
基于react-navigation
實現(xiàn)其沒有提供的APIpopTo(跳回指定頁面)
镣陕,refresh(刷新頁面)
谴餐,replace
,Modal(類似iOS從底部彈出個新頁面的效果)
等常用到的功能茁彭,在下面的翻譯中有詳細說明总寒;更新維護:這點上我很佩服庫的作者,從V1更新到V4理肺,從未背離作者的初衷摄闸,一直在對
react-native
的導航進行優(yōu)化、封裝妹萨,而且最讓我佩服的一點是年枕,作者好似將react-navigation
的Issues
全都翻看過,庫里面將react-navigation
可能存在或者已經(jīng)存在的坑都填上了乎完,而且實時更新熏兄。如果有時間,可以查看一下CHANGELOG.md树姨,里面有著全部的更新記錄摩桶。
稍后我會提供一個相對完整的Demo來作為對本文的補充,當然帽揪,其實作者提供的Demo已經(jīng)很棒了硝清,但作者將很多功能放在了一起,第一次接觸的時候转晰,很可能會被繞進去芦拿。
Available imports
Router
Scene
Tabs
Stack
Tabbed Scene
Drawer
Modal
Lightbox
Actions
ActionConst
Router:
Property | Type | Default | Description |
---|---|---|---|
children | required | 頁面根組件 | |
wrapBy |
Function |
允許集成諸如Redux(connect)和Mobx(observer)之類的狀態(tài)管理方案 | |
sceneStyle |
Style |
適用于所有場景的Style(可選) | |
backAndroidHandler |
Function |
允許在Android中自定義控制返回按鈕(可選)。有關(guān)更多信息查邢,請查看BackHandler | |
uriPrefix |
string |
通過uri來深層鏈接蔗崎,從App外跳入App內(nèi)的某個頁面,如果您想支持www.example.com/user/1234/ 的深度鏈接扰藕,可以通過example.com 將路徑匹配到/user/1234/
|
backAndroidHandler用法:
const onBackPress = () => {
if (Actions.state.index !== 0) {
return false
}
Actions.pop()
return true
}
backAndroidHandler={onBackPress}
Scene:
此路由器的最重要的組件缓苛, 所有 <Scene>
組件必須要有一個唯一的 key
。父節(jié)點<Scene>
不能將component
作為prop
邓深,因為它將作為其子節(jié)點的組件未桥。
Property | Type | Default | Description |
---|---|---|---|
key |
string |
required |
將用于標識頁面番官,例如Actions.name(params) 。必須是獨一無二的 |
path |
string |
將被用來匹配傳入的深層鏈接和傳遞參數(shù)钢属,例如:/user/:id/ 將從/user/1234/ 用params {id:1234}調(diào)用場景的操作徘熔。接受uri的模板標準https://tools.ietf.org/html/rfc6570
|
|
component |
React.Component |
semi-required |
要顯示的組件,定義嵌套時不需要Scene 淆党,參見示例酷师。 |
back |
boolean |
false |
如果是true ,則顯示后退按鈕染乌,而不是由上層容器定義的左側(cè)/drawer按鈕山孔。 |
backButtonImage |
string |
設(shè)置返回按鈕的圖片 | |
backButtonTintColor |
string |
自定義后退按鈕色調(diào) | |
init |
boolean |
false |
如果是true 后退按鈕不會顯示 |
clone |
boolean |
false |
標有clone 的場景將被視為模板,并在被推送時克隆到當前場景的父節(jié)點中荷憋。詳情請參見示例台颠。 |
contentComponent |
React.Component |
用于呈現(xiàn)抽屜內(nèi)容的組件(例如導航)。 | |
drawer |
boolean |
false |
載入DrawerNavigator內(nèi)的子頁面 |
failure |
Function |
如果on 返回一個“falsey”值勒庄,那么failure 將被調(diào)用串前。 |
|
backTitle |
string |
指定場景的后退按鈕標題 | |
backButtonTextStyle |
Style |
用于返回按鈕文本的樣式 | |
rightTitle |
string |
為場景指定右側(cè)的按鈕標題 | |
headerMode |
string |
float |
指定標題應(yīng)該如何呈現(xiàn):(float渲染單個標題,保持在頂部实蔽,動畫隨著屏幕的變化荡碾,這是iOS上的常見樣式。)screen(每個屏幕都有一個標題局装,并且標題淡入坛吁,與屏幕一起出現(xiàn),這是Android上的常見模式)如果為none(不會顯示標題) |
hideNavBar |
boolean |
false |
隱藏導航欄 |
hideTabBar |
boolean |
false |
隱藏標簽欄(僅適用于擁有tabs 指定的場景) |
hideBackImage |
boolean |
false |
隱藏返回圖片 |
initial |
boolean |
false |
設(shè)置為true 后铐尚,會默認顯示該頁面 |
leftButtonImage |
Image |
替換左側(cè)按鈕圖片 | |
leftButtonTextStyle |
Style |
左側(cè)按鈕的文字樣式 | |
leftButtonStyle |
Style |
左側(cè)按鈕的樣式 | |
leftButtonIconStyle |
Style |
左側(cè)按鈕的圖標樣式 | |
modal |
boolean |
false |
將場景容器定義為modal 拨脉,即所有子場景都將從底部彈起到頂部。它僅適用于containers(與v3版本的語法不同) |
navBar |
React.Component |
可以使用自定義的React組件來定義導航欄 | |
navBarButtonColor |
string |
設(shè)置導航欄返回按鈕的顏色 | |
navigationBarStyle |
Style |
導航欄的樣式 | |
navigationBarTitleImage |
Object |
導航欄中的圖像中覆蓋title 的Image
|
|
navigationBarTitleImageStyle |
object |
navigationBarTitleImage 的樣式 |
|
navTransparent |
boolean |
false |
導航欄是否透明 |
on |
Function |
又名 onEnter
|
|
onEnter |
Function |
當Scene 要被跳轉(zhuǎn)時調(diào)用宣增。props 將被作為參數(shù)提供玫膀。只支持定義了'component'的場景。 |
|
onExit |
Function |
當Scene 要跳轉(zhuǎn)離開時調(diào)用统舀。只支持定義了'component'的場景匆骗。 |
|
onLeft |
Function |
當導航欄左側(cè)按鈕被點擊時調(diào)用劳景。 | |
onRight |
Function |
當導航欄右側(cè)按鈕被點擊時調(diào)用誉简。 | |
renderTitle |
React.Component |
使用React組件顯示導航欄的title | |
renderLeftButton |
React.Component |
使用React組件顯示導航欄的左側(cè)按鈕 | |
renderRightButton |
React.Component |
使用React組件顯示導航欄的右側(cè)按鈕 | |
renderBackButton |
React.Component |
使用React組件顯示導航欄的返回按鈕 | |
rightButtonImage |
Image |
設(shè)置右側(cè)按鈕的圖片 | |
rightButtonTextStyle |
Style |
右側(cè)按鈕文字的樣式 | |
success |
Function |
如果on 返回一個"真實"的值,那么success 將被調(diào)用盟广。 |
|
tabs |
boolean |
false |
將子場景加載為TabNavigator闷串。其他標簽導航器屬性也是適用的。 |
title |
string |
要顯示在導航欄中心的文本筋量。 | |
titleStyle |
Style |
title的樣式 | |
type |
string |
push |
可選的導航操作烹吵。你可以使用replace 來替換此場景中的當前場景 |
all other props | 此處未列出的其他屬性將轉(zhuǎn)交給Scene 的component
|
Tabs (<Tabs>
or <Scene tabs>
)
標簽欄組件碉熄。
你可以使用<Scene>
中的所有props
來作為<Tabs>
的屬性。 如果要使用該組件需要設(shè)置 <Scene tabs={true}>
肋拔。
Property | Type | Default | Description |
---|---|---|---|
wrap |
boolean |
true |
自動使用自己的導航欄包裝每個場景(如果不是另一個容器)锈津。 |
activeBackgroundColor |
string |
指定焦點的選項卡的選中背景顏色 | |
activeTintColor |
string |
指定標簽欄圖標的選中色調(diào)顏色 | |
inactiveBackgroundColor |
string |
指定非焦點的選項卡的未選中背景顏色 | |
inactiveTintColor |
string |
指定標簽欄圖標的未選中色調(diào)顏色 | |
labelStyle |
object |
設(shè)置tabbar上文字的樣式 | |
lazy |
boolean |
false |
在選項卡處于活動狀態(tài)之前,不會渲染選項卡場景(推薦設(shè)置成true) |
tabBarComponent |
React.Component |
使用React組件以自定義標簽欄 | |
tabBarPosition |
string |
指定標簽欄位置凉蜂。iOS上默認為bottom 琼梆,安卓上是top 。 |
|
tabBarStyle |
object |
標簽欄演示 | |
tabStyle |
object |
單個選項卡的樣式 | |
showLabel |
boolean |
true |
是否顯示標簽欄文字 |
swipeEnabled |
boolean |
true |
是否可以滑動選項卡窿吩。 |
animationEnabled |
boolean |
true |
切換動畫 |
tabBarOnPress |
function |
自定義tabbar點擊事件 | |
backToInitial |
boolean |
false |
如果選項卡圖標被點擊茎杂,返回到默認選項卡。 |
Stack (<Stack>
)
將場景組合在一起的組件纫雁,用于自己的基于堆棧實現(xiàn)的導航煌往。使用它將為此堆棧創(chuàng)建一個單獨的navigator,因此轧邪,除非您添加hideNavBar
刽脖,否則將會出現(xiàn)兩個導航條。
Tab Scene (child <Scene>
within Tabs
)
用于實現(xiàn)Tabs
的效果展示忌愚,可以自定義icon和label曾棕。
Property | Type | Default | Description |
---|---|---|---|
icon |
component |
undefined |
作為選項卡圖標放置的RN組件 |
tabBarLabel |
string |
tabbar上的文字 |
Drawer (<Drawer>
or <Scene drawer>
)
用于實現(xiàn)抽屜的效果,如果要使用該組件需要設(shè)置 <drawer tabs={true}>
菜循。
Property | Type | Default | Description |
---|---|---|---|
drawerImage |
Image |
替換抽屜'hamburger'圖標翘地,你必須把它與drawer 一起設(shè)置 |
|
drawerIcon |
React.Component |
用于抽屜'hamburger'圖標的任意組件,您必須將其與drawer 道具一起設(shè)置 |
|
hideDrawerButton |
boolean |
false |
是否顯示drawerImage 或者drawerIcon
|
drawerPosition |
string |
抽屜是在右邊還是左邊癌幕⊙酶可選屬性right 或left
|
|
drawerWidth |
number |
抽屜的寬度(以像素為單位)(可選) | |
drawerLockMode |
enum('unlocked', 'locked-closed', 'locked-open') |
指定抽屜的鎖模式(https://facebook.github.io/react-native/docs/drawerlayoutandroid.html#drawerlockmode) |
Modals (<Modal>
or <Scene modal>
)
想要實現(xiàn)模態(tài),您必須將其<Modal>
作為您Router
的根場景勺远。在Modal
將正常呈現(xiàn)第一個場景(應(yīng)該是你真正的根場景)橙喘,它將渲染第一個元素作為正常場景,其他所有元素作為彈出窗口(當它們 被push)胶逢。
示例:在下面的示例中厅瞎,root
場景嵌套在<Modal>
中,因為它是第一個嵌套Scene
初坠,所以它將正常呈現(xiàn)和簸。如果要push
到statusModal
,errorModal
或者loginModal
碟刺,他們將呈現(xiàn)為Modal
锁保,默認情況下會從屏幕底部向上彈出。重要的是要注意,目前Modal
不允許透明的背景爽柒。
//... import components
<Router>
<Modal>
<Scene key="root">
<Scene key="screen1" initial={true} component={Screen1} />
<Scene key="screen2" component={Screen2} />
</Scene>
<Scene key="statusModal" component={StatusModal} />
<Scene key="errorModal" component={ErrorModal} />
<Scene key="loginModal" component={LoginModal} />
</Modal>
</Router>
Lightbox (<Lightbox>
)
Lightbox
是用于將組件渲染在當前組件上Scene
的組件 吴菠。與Modal
不同,它將允許調(diào)整大小和背景的透明度浩村。
示例:
在下面的示例中做葵,root
場景嵌套在中<Lightbox>,因為它是第一個嵌套Scene
心墅,所以它將正常呈現(xiàn)蜂挪。如果要push
到loginLightbox
,他們將呈現(xiàn)為Lightbox
嗓化,默認情況下將放置在當前場景的頂部棠涮,允許透明的背景。
//... import components
<Router>
<Lightbox>
<Scene key="root">
<Scene key="screen1" initial={true} component={Screen1} />
<Scene key="screen2" component={Screen2} />
</Scene>
{/* Lightbox components will lay over the screen, allowing transparency*/}
<Scene key="loginLightbox" component={loginLightbox} />
</Lightbox>
</Router>
Actions
該對象的主要工具是為您的應(yīng)用程序提供導航功能刺覆。 假設(shè)您的Router
和Scenes
配置正確严肪,請使用下列屬性在場景之間導航。 有些提供添加的功能谦屑,將React道具傳遞到導航場景驳糯。
這些可以直接使用,例如氢橙,Actions.pop()
將在源代碼中實現(xiàn)的操作酝枢,或者,您可以在場景類型中設(shè)置這些常量悍手,當您執(zhí)行Actions.main()
時帘睦,它將根據(jù)您的場景類型或默認值來執(zhí)行動作。
Property | Type | Parameters | Description |
---|---|---|---|
[key] |
Function |
Object |
Actions 將'自動'使用路由器中的場景key 進行導航坦康。如果需要跳轉(zhuǎn)頁面竣付,可以直接使用Actions.key() 或Actions[key].call()
|
currentScene |
String |
返回當前活動的場景 | |
jump |
Function |
(sceneKey: String, props: Object) |
用于切換到新選項卡. For Tabs only. |
pop |
Function |
回到上一個頁面 | |
popTo |
Function |
(sceneKey: String, props: Object) |
返回到指定的頁面 |
push |
Function |
(sceneKey: String, props: Object) |
跳轉(zhuǎn)到新頁面 |
refresh |
Function |
(props: Object) |
重新加載當前頁面 |
replace |
Function |
(sceneKey: String, props: Object) |
從堆棧中彈出當前場景,并將新場景推送到導航堆棧滞欠。沒有過度動畫古胆。 |
reset |
Function |
(sceneKey: String, props: Object) |
清除路由堆棧并將場景推入第一個索引. 沒有過渡動畫。 |
drawerOpen |
Function |
如果可用筛璧,打開Drawer
|
|
drawerClose |
Function |
如果可用逸绎,關(guān)閉Drawer
|
ActionConst
鍵入常量以確定Scene轉(zhuǎn)換,這些是優(yōu)先于手動鍵入其值夭谤,因為項目更新時可能會發(fā)生更改棺牧。
Property | Type | Value | Shorthand |
---|---|---|---|
ActionConst.JUMP |
string |
'REACT_NATIVE_ROUTER_FLUX_JUMP' | jump |
ActionConst.PUSH |
string |
'REACT_NATIVE_ROUTER_FLUX_PUSH' | push |
ActionConst.PUSH_OR_POP |
string |
'REACT_NATIVE_ROUTER_FLUX_PUSH_OR_POP' | push |
ActionConst.REPLACE |
string |
'REACT_NATIVE_ROUTER_FLUX_REPLACE' | replace |
ActionConst.BACK |
string |
'REACT_NATIVE_ROUTER_FLUX_BACK' | pop |
ActionConst.BACK_ACTION |
string |
'REACT_NATIVE_ROUTER_FLUX_BACK_ACTION' | pop |
ActionConst.POP_TO |
string |
'REACT_NATIVE_ROUTER_FLUX_POP_TO' | popTo |
ActionConst.REFRESH |
string |
'REACT_NATIVE_ROUTER_FLUX_REFRESH' | refresh |
ActionConst.RESET |
string |
'REACT_NATIVE_ROUTER_FLUX_RESET' | reset |
ActionConst.FOCUS |
string |
'REACT_NATIVE_ROUTER_FLUX_FOCUS' | N/A |
ActionConst.BLUR |
string |
'REACT_NATIVE_ROUTER_FLUX_BLUR' | N/A |
ActionConst.ANDROID_BACK |
string |
'REACT_NATIVE_ROUTER_FLUX_ANDROID_BACK' | N/A |
Universal and Deep Linking
用例
- 考慮這樣一個web應(yīng)用程序和app配對,這可能有一個url
https://thesocialnetwork.com/profile/1234/.
- 如果我們同時構(gòu)建一個web應(yīng)用程序和一個移動應(yīng)用程序,我們希望能夠通過path
/profile/:id/
沮翔。 - 在web上陨帆,我們可能想要用一個路由器來打開我們的
<Profile />
和參數(shù){ id: 1234 }
- 在移動設(shè)備上,如果我們正確地設(shè)置了Android / iOS環(huán)境來啟動我們的應(yīng)用程序并打開RNRF
<Router />,
采蚀,那么我們還需要導航到我們的移動<Profile />
場景和參數(shù){ id: 1234 }
使用
<Router uriPrefix={'thesocialnetwork.com'}>
<Scene key="root">
<Scene key={'home'} component={Home} />
<Scene key={'profile'} path={"/profile/:id/"} component={Profile} />
<Scene key={'profileForm'} path={"/edit/profile/:id/"} component={ProfileForm} />
</Scene>
</Router>
如果用戶點擊http://thesocialnetwork.com/profile/1234/
在他們的設(shè)備,他們會打開<Router/ >
,然后調(diào)用操作Actions.profile({ id:1234 })