react-native-router-flux使用技巧(API篇)

強烈推薦使用該三方

如果在使用過程中遇到什么問題,可以加入react-native興趣交流群群號:397885169一起討論學習,也歡迎在評論區(qū)評論缔恳。

RN項目模板,還未完成洁闰,但react-native-router-flux的Demo在里面

本文會持續(xù)更新歉甚,只要該庫作者不停止更新,那么我也不會停下腳步扑眉。

可能很多人之前就用過這個三方纸泄,也可能有些人聽過沒用過赖钞。在這系列文章中,有這樣幾方面原因:

  1. 通用性:在最新的V4版本中是基于react-navigation實現(xiàn)的聘裁,如果使用過react-native-router-flux那么使用新版本的學習成本會低很多雪营;

  2. 實用性:react-navigation雖然是官方推薦的導航庫,但其庫內(nèi)部提供的衡便,可以直接使用的功能很簡單献起,有些還需要配合redux來實現(xiàn)需要的功能。而react-native-router-flux基于react-navigation實現(xiàn)其沒有提供的APIpopTo(跳回指定頁面)镣陕,refresh(刷新頁面)谴餐,replaceModal(類似iOS從底部彈出個新頁面的效果)等常用到的功能茁彭,在下面的翻譯中有詳細說明总寒;

  3. 更新維護:這點上我很佩服庫的作者,從V1更新到V4理肺,從未背離作者的初衷摄闸,一直在對react-native的導航進行優(yōu)化、封裝妹萨,而且最讓我佩服的一點是年枕,作者好似將react-navigationIssues全都翻看過,庫里面將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 導航欄中的圖像中覆蓋titleImage
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)交給Scenecomponent

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 抽屜是在右邊還是左邊癌幕⊙酶可選屬性rightleft
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)和簸。如果要pushstatusModalerrorModal或者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)蜂挪。如果要pushloginLightbox,他們將呈現(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è)您的RouterScenes配置正確严肪,請使用下列屬性在場景之間導航。 有些提供添加的功能谦屑,將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配對,這可能有一個urlhttps://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 })

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末疲牵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子榆鼠,更是在濱河造成了極大的恐慌纲爸,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妆够,死亡現(xiàn)場離奇詭異识啦,居然都是意外死亡,警方通過查閱死者的電腦和手機神妹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門颓哮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鸵荠,你說我怎么就攤上這事冕茅。” “怎么了蛹找?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵姨伤,是天一觀的道長。 經(jīng)常有香客問我庸疾,道長乍楚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任届慈,我火速辦了婚禮徒溪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘金顿。我一直安慰自己词渤,他們只是感情好,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布串绩。 她就那樣靜靜地躺著缺虐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪礁凡。 梳的紋絲不亂的頭發(fā)上高氮,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音顷牌,去河邊找鬼剪芍。 笑死,一個胖子當著我的面吹牛窟蓝,可吹牛的內(nèi)容都是我干的罪裹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼状共!你這毒婦竟也來了套耕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤峡继,失蹤者是張志新(化名)和其女友劉穎冯袍,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碾牌,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡康愤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了舶吗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片征冷。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖誓琼,靈堂內(nèi)的尸體忽然破棺而出资盅,到底是詐尸還是另有隱情,我是刑警寧澤踊赠,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布呵扛,位于F島的核電站,受9級特大地震影響筐带,放射性物質(zhì)發(fā)生泄漏今穿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一伦籍、第九天 我趴在偏房一處隱蔽的房頂上張望蓝晒。 院中可真熱鬧,春花似錦帖鸦、人聲如沸芝薇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洛二。三九已至,卻和暖如春攻锰,著一層夾襖步出監(jiān)牢的瞬間晾嘶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工娶吞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留垒迂,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓妒蛇,卻偏偏與公主長得像机断,于是被迫代替她去往敵國和親楷拳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容