談?wù)勎覍?RN Navigator的理解

React Native的Navigator,理解起來相對來說不太容易炊苫,經(jīng)過一些實踐之后談?wù)勎业睦斫馑目怠⒖嫉氖?a target="_blank" rel="nofollow">這篇文章的代碼

首先從原理上,Navigator是用來作為組件之間的導(dǎo)航器灰追。而缺乏類似Router性質(zhì)的東西時,最簡單的辦法是將下個組件(也叫場景Scene)狗超,直接告訴導(dǎo)航器监嗜。所以就需要在頁面的上面引入下個組件。 另外就是不要忘記引入 Navigator抡谐。

export default class SampleComponent extends React.Component {
        render() {
            let defaultName = 'FirstPageComponent';// 第一個要展示的組件
            let defaultComponent = FirstPageComponent;
            return (
            <Navigator
              initialRoute={{ name: defaultName, component: defaultComponent }}
              configureScene={(route) => {
                return Navigator.SceneConfigs.VerticalDownSwipeJump;
              }}
              renderScene={(route, navigator) => {
                let Component = route.component;
                return <Component {...route.params} navigator={navigator} />
              }} />
            );
        }
    } 

initialRoute={{ name: defaultName, component: defaultComponent }}
Navigator實現(xiàn)跳轉(zhuǎn)裁奇,是通過Push和Pop方法,相當(dāng)于是一個數(shù)組麦撵,每要跳到下個Scene(場景)刽肠,就把下個頁面push到這個數(shù)組中,當(dāng)想要后退的時候免胃,再把這個Pop出去音五。所以這個數(shù)組里存放的肯定是能索引到這個Scene的數(shù)據(jù),所以理所應(yīng)當(dāng)存放一個Component鍵是合理的羔沙。這里initialRoute的時候除了Component還引入了一個name躺涝,這個是可選的,不要也行扼雏。
defaultNamedefaultComponent存放的就是你要render的第一個Scene坚嗜,相當(dāng)于跳轉(zhuǎn)的起點夯膀,不一定是就是要點擊的那個組件,但必須是包含在里面的苍蔬。

configureScene={(route) => { return Navigator.SceneConfigs.VerticalDownSwipeJump; }}

這里定義了跳轉(zhuǎn)的過渡動畫诱建,如果你的編輯器支持的話,可以刪掉最后一節(jié)碟绑,看看最其他的選項俺猿。
renderScene={(route, navigator) => { let Component = route.component; return <Component {...route.params} navigator={navigator} /> }}
這個段代碼執(zhí)行過后,就將你的“defaultComponent”渲染出來了格仲,其中route.componet就是在initialRoute里寫進去的component押袍。
return <Component {...route.params} navigator={navigator} />

渲染了你要展示的第一個頁面,還順便把幾個參數(shù)寫了進去凯肋,...route.params這個語法是要展開所有params伯病,現(xiàn)在你initialRoute的時候沒有寫 params,但是以后在頁面之間傳遞參數(shù)的時候就會要寫的否过。假如,InitialRoute的時候?qū)懥耍?/p>

initialRoute={{ name: defaultName, component: defaultComponent params:{ id:123} }}

這就相當(dāng)于 :

return <Component id={route.params.id} navigator={navigator} />

對惭蟋,就是這么神奇苗桂。你會發(fā)現(xiàn)就可以在你渲染的頁面里,通過this.props.id找到這個參數(shù)了告组,當(dāng)然還有后面?zhèn)魅氲膎avigator煤伟,你也可以在props中找到。

現(xiàn)在只是剛剛定義好了導(dǎo)航器而已木缝,在現(xiàn)在這個渲染的組件里便锨,找一個可以Touchable開頭的組件,在屬性里寫個onPress={}屬性我碟。假設(shè)點擊這個組件放案,就要前往下個頁面。

此時導(dǎo)航器需要知道下一個Scene是哪里矫俺,所以先在頭部將需要跳轉(zhuǎn)的Scene引入吱殉。

在點擊事件的回調(diào)函數(shù)里,

 _pressButton(id) {
    const {navigator} = this.props;
    if (navigator) {
      navigator.push({
        name: 'StoryTeller',
        component: StoryTeller,
        params: {
          id: id
        }
      })
    }
  }

const {navigator} = this.props; 這么寫相當(dāng)于 const navigator = this.props.navigator

點擊事件發(fā)生后厘托,需要要把下個Scene給Push到navigator中友雳,同樣還有看起來沒什么用的name。注意這里同樣傳了params铅匹,在這里不用手動return出來要加載的頁面了押赊,navigator會依照之前的模式,直接開始渲染包斑。相當(dāng)于:
<StoryTeller id={id} name='StoryTeller' navigator={this.props.navigator} />

跳回來流礁,使用的是Pop方法涕俗。和Push類似,不過不用寫參數(shù):

  onBackAndroid = ()=> {
    const nav = this.props.navigator;
    const routers = nav.getCurrentRoutes();
    if (routers.length > 1) {
      nav.pop();
    }
  };

navigator 對象里最后進去的崇棠,一定是當(dāng)前的頁面咽袜,所以初始化的時候數(shù)組的長度為1,這里有一個判斷枕稀,當(dāng)這個數(shù)組的=1的時候询刹,就不再跳轉(zhuǎn),直接執(zhí)行退出應(yīng)用萎坷。這里適合具有多次點擊返回時候(例如安卓返回鍵)凹联,一般的點擊返回直接執(zhí)行navigator的Pop方法即可。

  _pressButton() {
        const { navigator } = this.props;
        if(navigator) {
            navigator.pop();
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哆档,一起剝皮案震驚了整個濱河市蔽挠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瓜浸,老刑警劉巖澳淑,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異插佛,居然都是意外死亡杠巡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門雇寇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氢拥,“玉大人,你說我怎么就攤上這事锨侯∧酆#” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵囚痴,是天一觀的道長叁怪。 經(jīng)常有香客問我,道長深滚,這世上最難降的妖魔是什么骂束? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮成箫,結(jié)果婚禮上展箱,老公的妹妹穿的比我還像新娘。我一直安慰自己蹬昌,他們只是感情好混驰,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般栖榨。 火紅的嫁衣襯著肌膚如雪昆汹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天婴栽,我揣著相機與錄音满粗,去河邊找鬼。 笑死愚争,一個胖子當(dāng)著我的面吹牛映皆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播轰枝,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捅彻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鞍陨?” 一聲冷哼從身側(cè)響起步淹,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤垦写,失蹤者是張志新(化名)和其女友劉穎犁珠,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渤昌,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡寿烟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年澈驼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片韧衣。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖购桑,靈堂內(nèi)的尸體忽然破棺而出畅铭,到底是詐尸還是另有隱情,我是刑警寧澤勃蜘,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布硕噩,位于F島的核電站,受9級特大地震影響缭贡,放射性物質(zhì)發(fā)生泄漏炉擅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一阳惹、第九天 我趴在偏房一處隱蔽的房頂上張望谍失。 院中可真熱鬧,春花似錦莹汤、人聲如沸快鱼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抹竹。三九已至线罕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窃判,已是汗流浹背钞楼。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留袄琳,地道東北人询件。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像跨蟹,于是被迫代替她去往敵國和親雳殊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

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

  • 前言 學(xué)習(xí)本系列內(nèi)容需要具備一定 HTML 開發(fā)基礎(chǔ)窗轩,沒有基礎(chǔ)的朋友可以先轉(zhuǎn)至 HTML快速入門(一) 學(xué)習(xí) 本人...
    珍此良辰閱讀 7,286評論 33 15
  • 重新排版 理解navigator 這是一個簡單的例子夯秃,用Navigator來跳轉(zhuǎn)頁面,頁面之間傳遞參數(shù) (代碼是E...
    lyzaijs閱讀 1,002評論 0 3
  • 接觸了RN之后痢艺,必不可免得要接觸界面之間跳轉(zhuǎn)之類的需求仓洼,而這一類需求的實現(xiàn)必須要使用到Navigator這個導(dǎo)航器...
    AnonyPer閱讀 1,180評論 0 0
  • 大家學(xué)習(xí)完了一些常用組件的應(yīng)用及其布局,現(xiàn)在我們來了解一個單頁面app才有的導(dǎo)航navigation react-...
    洪都拉斯的春天閱讀 1,701評論 0 0
  • NO.1 鴨梨 每個人面臨壓力的身體反應(yīng)各異: @達達令:我是天生的悲觀者,一直在跟自己的隱形壓力做斗爭舌缤,從前沒意...
    高跟鞋戰(zhàn)士閱讀 366評論 0 0