React-Native中使用Navigatior和自定義NavigationBar

上一次我在這里記錄了我是如何處理上拉加載更多和下拉刷新的氢架,這次是應用中的導航功能以及自定義導航欄NavigationBar

源碼還在這里

Navigator(RN提供的組件)

只要App不止有一個場景,那么這個App肯定少不了一個導航控制器 (iOS中的NavigationController) Navigator是RN提供的官方組件朋魔,兼顧了iOS和Android岖研,這里有一個關于Navigator很詳細的教程

目標

用Navigator實現(xiàn) 【首頁(商品列表) --> 圖片詳情頁 --> 圖文詳情頁】這一系列的場景切換,另外在“圖文詳情”頁實現(xiàn)了通過滾動視圖的偏移量控制NavigationBar漸隱警检、漸現(xiàn)`

關鍵代碼
  • root.js

    'use strict';
    import React from 'react'
     import { Provider } from 'react-redux'
     import configureStore from './store/store.js'
     import App from './containers/app.js'
     const store = configureStore();
     export default class Root extends React.Component {
            constructor(props) {
                   super(props);
                }
            render() {
                   return (
                          <Provider store={ store }>
                                 <App />
                          </Provider>
                      );
          }
    }
    
  • app.js

      把`ProductListContainer`設置為根視圖孙援,
    
      import React from 'react';
      import {
          View,
          Navigator
      } from 'react-native';
      import ProductListContainer from './ProductListContainer'
      export default class App extends React.Component {
          render() {
              let defaultComponent = ProductListContainer;
              return (
              <Navigator 
                  initialRoute={{ component: defaultComponent }}
                  configureScene={(route) => {
                      return Navigator.SceneConfigs.FloatFromRight;
                  }}
                  renderScene={(route, navigator) => {
                      let Component = route.component;
                      return <Component {...route.params} navigator={navigator} />
                      //  上面的route.params 是為了方便后續(xù)界面間傳遞參數(shù)用的
                  }} />
              );
          }
      } 
    
  • 自定義NavitagionBar NavBarCommon.js(名字以后肯能會改)

    ListViewLoadMore/app/common/NavBarCommon.js

      render() {
          // leftTitle和leftImage 優(yōu)先判斷l(xiāng)eftTitle (即 文本按鈕和圖片按鈕優(yōu)先顯示文本按鈕)
          const { title, leftTitle, leftImage, leftAction, rightTitle, rightImage, rightAction } = this.props;
          return (
              <View style={[styles.barView, this.props.style]}>
                  <View style={ styles.showView }>
                      {
                          (()=>{
                              if (leftTitle) {
                                  return <TouchableOpacity style={styles.leftNav} onPress={ ()=>{leftAction()} }>
                                          <View style={{alignItems: 'center'}}>
                                              <Text style={styles.barButton}>{leftTitle}</Text>
                                          </View>
                                      </TouchableOpacity>
                              } else if (leftImage) {
                                  return <TouchableOpacity style={styles.leftNav} onPress={ ()=>{leftAction()} }>
                                          <View style={{alignItems: 'center'}}>
                                              <Image source={ leftImage }/>
                                          </View>
                                      </TouchableOpacity>
                              };
                          })()
                      }
                      {
                          (()=>{
                              if (title) {
                                  return <Text style={styles.title}>{title || ''}</Text>              
                              }
                          })()
                      }
                      {
                          (()=>{
                              if (rightTitle) {
                                  return <TouchableOpacity style={styles.rightNav} onPress={ ()=>{rightAction()} }>
                                          <View style={{alignItems: 'center'}}>
                                              <Text style={styles.barButton}>{rightTitle}</Text>
                                          </View>
                                      </TouchableOpacity>
                              } else if (rightImage) {
                                  return <TouchableOpacity style={styles.rightNav} onPress={ ()=>{rightAction()} }>
                                          <View style={{alignItems: 'center'}}>
                                              <Image source={ rightImage }/>
                                          </View>
                                      </TouchableOpacity>
                              }
                          })()
                      }
                      
                  </View>
              </View>
          )
      }
    
調用的方法和示例:

首先引入組件

import NavigationBar from '../common/NavBarCommon.js'

1、 最簡單的樣式 只有標題

<NavigationBar title={'首頁'}/>

2扇雕、 標題赃磨、左邊按鈕

<NavigationBar style={{opacity: this.state.navOpacity}} title={'圖文詳情'} leftImage={ backIcon } leftAction={ this._backToFront.bind(this) }/>

3、 標題洼裤、左邊按鈕邻辉、右邊按鈕

<NavigationBar title={'圖片詳情'} leftImage={ backIcon } leftAction={ this._backToFront.bind(this) } rightTitle={'去看圖文詳情'} rightImage={ backIcon } rightAction={ this._toAnotherDetail.bind(this) } />

NavigationBar上的所有部分都是可選項,可以什么都不設置腮鞍,那就是一個空白的導航欄
那么對應的只要設置相應的文本或圖片(文本優(yōu)先)以及相應的響應事件值骇,就可以實現(xiàn)想要的效果

效果圖
導航欄使用
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市移国,隨后出現(xiàn)的幾起案子吱瘩,更是在濱河造成了極大的恐慌,老刑警劉巖迹缀,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件使碾,死亡現(xiàn)場離奇詭異蜜徽,居然都是意外死亡,警方通過查閱死者的電腦和手機票摇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門拘鞋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人矢门,你說我怎么就攤上這事盆色。” “怎么了祟剔?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵隔躲,是天一觀的道長。 經常有香客問我物延,道長宣旱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任叛薯,我火速辦了婚禮响鹃,結果婚禮上,老公的妹妹穿的比我還像新娘案训。我一直安慰自己买置,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布强霎。 她就那樣靜靜地躺著忿项,像睡著了一般。 火紅的嫁衣襯著肌膚如雪城舞。 梳的紋絲不亂的頭發(fā)上轩触,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音家夺,去河邊找鬼脱柱。 笑死,一個胖子當著我的面吹牛拉馋,可吹牛的內容都是我干的榨为。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼煌茴,長吁一口氣:“原來是場噩夢啊……” “哼随闺!你這毒婦竟也來了?” 一聲冷哼從身側響起蔓腐,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤矩乐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后回论,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體散罕,經...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡分歇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了欧漱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片职抡。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖硫椰,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情萨蚕,我是刑警寧澤靶草,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站岳遥,受9級特大地震影響奕翔,放射性物質發(fā)生泄漏。R本人自食惡果不足惜浩蓉,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一派继、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捻艳,春花似錦驾窟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嘁字,卻和暖如春恩急,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纪蜒。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工衷恭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纯续。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓随珠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親猬错。 傳聞我的和親對象是個殘疾皇子牙丽,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內容