React-Navigation 使用

未完待續(xù)....
前言

學(xué)習(xí)導(dǎo)航的時(shí)候麸折,網(wǎng)上的文章很多锡凝,但是看起來也越亂,學(xué)著學(xué)著就搞混了垢啼。沒有一個(gè)系統(tǒng)的從淺到深的學(xué)習(xí)窜锯。知識(shí)點(diǎn)也容易遺漏张肾。根據(jù)官網(wǎng)一步一步來,反而能夠快速掌握衬浑。
(什么英文看不懂捌浩?)我剛開始也是看著迷糊,但是下載一個(gè)有道翻譯工秩,不明白的單詞或者句子使用他翻譯下,慢慢就習(xí)慣啦

先上效果圖:
GIF.gif

參考react-nvigation 2x文檔進(jìn)行學(xué)習(xí)进统。
官網(wǎng)資料

1)起步
2)create StackNavigator
3)config StackNavigator
4)界面跳轉(zhuǎn)助币,navigate,poptoTop,pop等
5)路由傳參
6)配置 head bar,導(dǎo)航
7)導(dǎo)航傳參
8)setParams傳參
9)自定義頭部樣式 header styles
10)分享公共的navigationOptions 配置
11)自定義組件代替標(biāo)題
12)header跳轉(zhuǎn)button
13)頭部按鈕訪問組件實(shí)例函數(shù)
14)full-screen model


1.起步

安裝指定版本 :npm install react-navigation@2.9.1

2.create StackNavigator
import React from 'react';
import { View, Text } from 'react-native';
import { createStackNavigator } from 'react-navigation';

class HomeScreen extends React.Component {
  render() {
    return (
      <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
        <Text>Home Screen</Text>
      </View>
    );
  }
}
export default createStackNavigator({
  Home: {
    screen: HomeScreen
  },
});

這樣就能簡單實(shí)現(xiàn)一個(gè)首頁啦。當(dāng)然這樣代碼多了就不好啦螟碎。每個(gè)界面寫成.js眉菱,在導(dǎo)入。增加一個(gè)details.js,自己動(dòng)手創(chuàng)建一個(gè)吧掉分,我們就可以這樣寫啦

3.config StackNavigator
const RootStack = createStackNavigator(
  {
    Home: HomeScreen,
    Details: DetailsScreen,
  },
  {
    initialRouteName: 'Home',
  }
);
export default class App extends React.Component {
  render() {
    return <RootStack />;
  }
}
界面跳轉(zhuǎn)俭缓,navigate,poptoTop,pop等

在首頁中增加一個(gè)按鈕,點(diǎn)擊按鈕跳轉(zhuǎn)到詳情

class HomeScreen extends React.Component {
  render() {
    return (
      <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
        <Text>Home Screen</Text>
        <Button
          title="Go to Details"
          onPress={() => this.props.navigation.navigate('Details')}
        />
      </View>
    );
  }
}

在詳情界面酥郭,我們也增加一個(gè)按鈕华坦,來跳轉(zhuǎn)到首頁,看看啥效果不从?
DetailsScreen

...
<Button
          title="Go to Details... again"
          onPress={() => this.props.navigation.navigate('Details')}
        />
...

發(fā)現(xiàn)點(diǎn)擊跳轉(zhuǎn)不了惜姐。這里就涉及到其他知識(shí)點(diǎn):

 navigate(‘name’),跳轉(zhuǎn)到新界面,如果已在當(dāng)前name界面椿息,就不在跳轉(zhuǎn)了,跳轉(zhuǎn)的的界面會(huì)有返回箭頭
 
 push('name') 跳轉(zhuǎn)到新界面歹袁,如果已在當(dāng)前name界面,會(huì)繼續(xù)創(chuàng)建新的screen,進(jìn)行跳轉(zhuǎn)

 goback(),銷毀當(dāng)前界面

 popToTop(),銷毀所有界面回到初始化的第一個(gè)路由界面

自己試一試吧寝优。這樣下來条舔,我們能進(jìn)行界面切換啦,但是參數(shù)呢乏矾,參數(shù)怎么傳

5路由傳參
this.props.navigation.navigate('Details', {
             data:"消息"
            });

接收:
this.props.navigation.getParam('data',"默認(rèn)數(shù)據(jù)")這樣可以獲得
另外一種方式
let {data} = this.props.navigation.state.params;

6.配置 headbar標(biāo)題
class HomeScreen extends React.Component {
  static navigationOptions = {
    title: 'Home',
  };
}

class DetailsScreen extends React.Component {
  static navigationOptions = {
    title: 'Details',
  };
}

像這樣固定的寫法孟抗,就能給相應(yīng)的界面加上title啦。這樣的優(yōu)先級(jí)是最高的

7導(dǎo)航傳參妻熊,就是標(biāo)題中獲取或者傳遞參數(shù)

寫法就要變化啦

class DetailsScreen extends React.Component {
  static navigationOptions = ({ navigation }) => {
    return {
      title: navigation.getParam('data', '默認(rèn)值'),
    };
  };
}
8.setParams

...
 /* Inside of render() */
  <Button
    title="Update the title"
    onPress={() => this.props.navigation.setParams({data: '更新!'})}
  />

經(jīng)歷過這樣的處理夸浅,headerbar的中關(guān)于navigation相關(guān)才能被識(shí)別出來

9自定義頭部樣式 header styles
class HomeScreen extends React.Component {
  static navigationOptions = {
    title: 'Home',
    headerStyle: {
      backgroundColor: '#f4511e',
    },
    headerTintColor: '#fff',
    headerTitleStyle: {
      fontWeight: 'bold',
    },
  };

  /* render function, etc */
}

更多的設(shè)置api,請(qǐng)查看官方文檔api

10分享公共的navigationOptions 配置,headerbar設(shè)置

比如每個(gè)界面的樣色樣式都差不多扔役,那么就可以在createStackNavigator中去添加公共配置帆喇。

const RootStack = createStackNavigator(
  {
    Home: HomeScreen,
    Details: DetailsScreen,
  },
  {
    initialRouteName: 'Home',
    /* The header config from HomeScreen is now here */
    navigationOptions: {
      headerStyle: {
        backgroundColor: '#f4511e',
      },
      headerTintColor: '#fff',
      headerTitleStyle: {
        fontWeight: 'bold',
      },
    },
  }
);

如果每個(gè)界面有自己的navigationOptions,那這個(gè)相同的就不能起作用亿胸。這是設(shè)置共同的坯钦,那分享是什么意思呢预皇?比如首頁,和詳情界面本來都一樣婉刀,但是這是你想改下詳情中的一些樣式吟温,沿用公共設(shè)置中的屬性數(shù)據(jù)

class DetailsScreen extends React.Component {
  static navigationOptions = ({ navigation, navigationOptions }) => {
    const { params } = navigation.state;

    return {
      title: params ? params.otherParam : 'A Nested Details Screen',
      /* These values are used instead of the shared configuration! */
      headerStyle: {
        backgroundColor: navigationOptions.headerTintColor,
      },
      headerTintColor: navigationOptions.headerStyle.backgroundColor,
    };
  };

  /* render function, etc */
}

感覺用處不大

自定義組件代替標(biāo)題

用圖片logo來替換標(biāo)題

class LogoTitle extends React.Component {
  render() {
    return (
      <Image
        source={require('./spiro.png')}
        style={{ width: 30, height: 30 }}
      />
    );
  }
}

class HomeScreen extends React.Component {
  static navigationOptions = {
    // headerTitle instead of title
    headerTitle: <LogoTitle />,
  };

  /* render function, etc */
}
12 header中的button
class HomeScreen extends React.Component {
  static navigationOptions = {
    headerTitle: <LogoTitle />,
    headerRight: (
      <Button
        onPress={() => alert('This is a button!')}
        title="Info"
        color="#fff"
      />
    ),
  };
}
13)頭部按鈕訪問組件實(shí)例函數(shù)
class HomeScreen extends React.Component {
  static navigationOptions = ({ navigation }) => {
    return {
      headerTitle: <LogoTitle />,
      headerRight: (
        <Button
          onPress={navigation.getParam('increaseCount')}
          title="+1"
          color="#fff"
        />
      ),
    };
  };

  componentDidMount() {
    this.props.navigation.setParams({ increaseCount: this._increaseCount });
  }

  state = {
    count: 0,
  };

  _increaseCount = () => {
    this.setState({ count: this.state.count + 1 });
  };

  /* later in the render function we display the count */
}

參考

14)creact a model stack

一你要有個(gè)model界面。

class ModalScreen extends React.Component {
  render() {
    return (
      <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
        <Text style={{ fontSize: 30 }}>This is a modal!</Text>
        <Button
          onPress={() => this.props.navigation.goBack()}
          title="Dismiss"
        />
      </View>
    );
  }
}

這個(gè)model路由是跟首頁和詳情是一個(gè)級(jí)的突颊。

const MainStack = createStackNavigator(
  {
    Home: {
      screen: HomeScreen,
    },
    Details: {
      screen: DetailsScreen,
    },
  },
  {
    /* Same configuration as before */
  }
);

const RootStack = createStackNavigator(
  {
    Main: {
      screen: MainStack,
    },
    MyModal: {
      screen: ModalScreen,
    },
  },
  {
    mode: 'modal',
    headerMode: 'none',
  }
);

在你想要展示的地方
onPress={() => navigation.navigate('MyModal')

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鲁豪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子律秃,更是在濱河造成了極大的恐慌爬橡,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棒动,死亡現(xiàn)場離奇詭異糙申,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)船惨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門柜裸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粱锐,你說我怎么就攤上這事疙挺。” “怎么了卜范?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵衔统,是天一觀的道長。 經(jīng)常有香客問我海雪,道長锦爵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任奥裸,我火速辦了婚禮险掀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘湾宙。我一直安慰自己樟氢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布侠鳄。 她就那樣靜靜地躺著埠啃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伟恶。 梳的紋絲不亂的頭發(fā)上碴开,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼潦牛。 笑死眶掌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的巴碗。 我是一名探鬼主播朴爬,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼橡淆!你這毒婦竟也來了召噩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤逸爵,失蹤者是張志新(化名)和其女友劉穎蚣常,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痊银,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年施绎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了溯革。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谷醉,死狀恐怖致稀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俱尼,我是刑警寧澤抖单,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站遇八,受9級(jí)特大地震影響矛绘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刃永,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一货矮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧斯够,春花似錦囚玫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至束亏,卻和暖如春铃在,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枪汪。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工涌穆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怔昨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓宿稀,卻偏偏與公主長得像趁舀,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子祝沸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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