React-Native 開發(fā)篇一底部導航菜單

接著上一篇【React-Native 開發(fā)篇一React-Native+Redux開發(fā)框架搭建】溉愁,本文記錄使用react-native-router-flux組件實現(xiàn)rn開發(fā)時最常見的底部導航菜單饲趋!

實現(xiàn)效果如下圖:

效果預覽

1.組件安裝

npm install react-native-router-flux --save

2.定義菜單圖標及文字(tabIcon.js)

import React, { Component } from 'react';
import { View, Image, Text, StyleSheet,Dimensions } from 'react-native';
class TabIcon extends Component {
    constructor(props){
        super(props);       
    }

    render(){
        let selected=this.props.focused;
        let data={
            home:{
                title:"首頁",
                icon:!selected?require("../resource/images/home.png"):require("../resource/images/home_selected.png")
            },
            movies:{
                title:"電影",
                icon:!selected?require("../resource/images/movies.png"):require("../resource/images/movies_selected.png")
            },
            theaters:{
                title:"影院",
                icon:!selected?require("../resource/images/theater.png"):require("../resource/images/theater_selected.png")
            },
            me:{
                title:"我",
                icon:!selected?require("../resource/images/me.png"):require("../resource/images/me_selected.png")
            }
      }
      let param=data[this.props.navigation.state.key];
      return  <View style={styles.tabbarContainer}>
                <Image style={{ width: 25, height: 25,resizeMode:'contain' }} source={param.icon} />
                <Text style={[styles.tabbarItem,selected&&{color:'#F08519'}]}>{param.title}</Text>
              </View>
    }
}

const styles = StyleSheet.create({
    tabbarContainer:{
      flex:1,
      alignItems:"center",
      justifyContent:"center",
      width:Dimensions.get('window').width/4
    },
    tabbarItem:{  
      marginTop:5,    
      textAlign:"center"
    }
});

module.exports = TabIcon;

注意事項:

  • 定義菜單標題和圖標的data數(shù)據(jù)的key(即例子中的home/movies/theaters/me)和步驟3中每一個Scene的key一一對應堂污;
  • 判斷菜單是否被選中this.props.focused在老版本的react-native-router-flux使用this.props.selected;
  • 取當前菜單this.props.navigation.state.key在老版本的react-native-router-flux使用this.props.sceneKey龄砰。

3.定義底部導航欄(appRoot.js)

import React, { Component } from 'react';
import { Provider } from 'react-redux';
import PropTypes from 'prop-types';
import {
    View,
    Text,
    BackAndroid,
    StyleSheet
} from 'react-native';
import { Scene, Router, TabBar, Modal, Schema, Actions, Reducer, ActionConst } from 'react-native-router-flux';
import { connect } from 'react-redux';
import LoginPage from './modules/auth/containers/loginPage';
import HomeIndex from './modules/home/containers/indexPage';
import TabIcon from './common/tabIcon';

class AppRoot extends Component {
    static propTypes = {
        dispatch: PropTypes.func
    }

    constructor(props) {
        super(props);
    }

    createReducer(params) {
        const defaultReducer = Reducer(params);
        return (state, action) => {
          this.props.dispatch(action);
          return defaultReducer(state, action);
        };
    }

    onExitApp(){
        BackAndroid.exitApp();
        return true;
    }
    render() {
        return (
            <Router onExitApp={this.onExitApp} 
                    createReducer={ this.createReducer.bind(this) }
                    scenes={ scenes }
             >          
            </Router >
        )
    }    
}

const styles = StyleSheet.create({
    tabBarStyle: {
        backgroundColor: '#fff',
        height:64
    },
    tabBarSelectedItemStyle: {
        backgroundColor: '#fff'
    },
    titleStyle: {
        color: '#fff'
    },
})

const scenes = Actions.create(
    <Scene key="root" hideNavBar={true}>
        <Scene key="login" component={LoginPage} title="登錄" hideNavBar={true} />
        <Scene key="tabbar"
                initial
                tabs={true}
                tabBarPosition="bottom"
                showLabel={false}
                tabBarStyle={styles.tabBarStyle}
                tabBarSelectedItemStyle={styles.tabBarSelectedItemStyle}
                titleStyle={styles.titleStyle}>
                <Scene key="home"
                    hideNavBar={true}
                    component={HomeIndex}
                    icon={TabIcon}
                    titleStyle={styles.titleStyle}/>

                <Scene key="movies"
                    hideNavBar={true}
                    component={HomeIndex}      
                    icon={TabIcon}                
                    titleStyle={styles.titleStyle} />

                <Scene key="theaters"
                    hideNavBar={true}
                    component={HomeIndex}                           
                    icon={TabIcon}
                    titleStyle={styles.titleStyle} />

                <Scene key="me"
                    hideNavBar={true}
                    component={LoginPage}                    
                    icon={TabIcon}
                    titleStyle={styles.titleStyle} />
            </Scene>
    </Scene>
)
export default connect()(AppRoot);

注意事項:

  • 引入步驟2中定義的tabIcon(import TabIcon from './common/tabIcon')式镐;
  • 定義一個Scene使其initial={true} tabs={true}作為底部菜單容器;
  • 定義若干(一舨2-4個)個菜單項娘汞,使其key與tabIcon中的key相對于你弦,設置icon={TabIcon}, component為該菜單選中時默認的組件。

此外禽作,由于此示例基于redux,為完整項目結(jié)構(gòu),還需做以下處理:

  • 定義dispatch
import PropTypes from 'prop-types';
...
class AppRoot extends Component {
  static propTypes = {
        dispatch: PropTypes.func
   }
...
}
  • 使用connect連接React組件
export default connect()(AppRoot);

GIT源碼地址:react-native-demo 分支名稱:tabbar

個人博客:有恒則成

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狸捅,一起剝皮案震驚了整個濱河市累提,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斋陪,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缔赠,死亡現(xiàn)場離奇詭異友题,居然都是意外死亡,警方通過查閱死者的電腦和手機踢匣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門戈抄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人输莺,你說我怎么就攤上這事∧O校” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵啰脚,是天一觀的道長实夹。 經(jīng)常有香客問我,道長亮航,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任准给,我火速辦了婚禮重抖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘畔规。我一直安慰自己恨统,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布莫绣。 她就那樣靜靜地躺著悠鞍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狞玛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天锭亏,我揣著相機與錄音硬鞍,去河邊找鬼戴已。 笑死锅减,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的怔匣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼金闽,長吁一口氣:“原來是場噩夢啊……” “哼剿骨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起浓利,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤贷掖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后羽资,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遵班,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡狭郑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了脏答。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡殖告,死狀恐怖雳锋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情爽丹,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布粤蝎,位于F島的核電站,受9級特大地震影響秸应,放射性物質(zhì)發(fā)生泄漏谤狡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一焰宣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捕仔,春花似錦、人聲如沸榜跌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽础浮。三九已至,卻和暖如春豆同,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芹务。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工鸭廷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辆床。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓佛吓,卻偏偏與公主長得像宵晚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子晒他,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

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