談?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方法,相當于是一個數(shù)組,每要跳到下個Scene(場景),就把下個頁面push到這個數(shù)組中,當想要后退的時候,再把這個Pop出去。所以這個數(shù)組里存放的肯定是能索引到這個Scene的數(shù)據(jù),所以理所應(yīng)當存放一個Component鍵是合理的。這里initialRoute的時候除了Component還引入了一個name,這個是可選的,不要也行。
defaultNamedefaultComponent存放的就是你要render的第一個Scene,相當于跳轉(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} }}

這就相當于 :

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

對,就是這么神奇。你會發(fā)現(xiàn)就可以在你渲染的頁面里,通過this.props.id找到這個參數(shù)了,當然還有后面?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; 這么寫相當于 const navigator = this.props.navigator

點擊事件發(fā)生后,需要要把下個Scene給Push到navigator中,同樣還有看起來沒什么用的name。注意這里同樣傳了params,在這里不用手動return出來要加載的頁面了,navigator會依照之前的模式,直接開始渲染。相當于:
<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 對象里最后進去的,一定是當前的頁面,所以初始化的時候數(shù)組的長度為1,這里有一個判斷,當這個數(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容