构建TabBar布局

许多项目需要使用TABBAR作为主要布局方式,推荐第三方控件:

REACT-NATIVE-TAB-NAVIGATOR

https://js.coach/react-native/react-native-tab-navigator?search=react-native-tab-navigator

创建Tabbar控件:

render() {
        const {selectedColor} = this.props;
        const {tabName} = this.state;
        return (
            <TabNavigator
                hidesTabTouch={true}
                tabBarStyle={styles.tabbar}
                sceneStyle={{ paddingBottom: styles.tabbar.height }}>
                <TabNavigator.Item
                    tabStyle={styles.tabStyle}
                    title={tabName[0]}
                    selected={this.state.selectedTab === 'home'}
                    selectedTitleStyle={{ color: selectedColor }}
                    renderIcon={() => <Image style={styles.tab} source={require("../image/tab_home.png")} />}
                    renderSelectedIcon={() => <Image style={styles.tab} source={require("../image/tab_home_sg.png")} />}
                    onPress={() => this.setState({ selectedTab: 'home' })}>
                    {<HomePage navigator={this.props.navigator} />}
                </TabNavigator.Item>
                <TabNavigator.Item
                    tabStyle={styles.tabStyle}
                    title={tabName[1]}
                    selected={this.state.selectedTab === 'company'}
                    selectedTitleStyle={{ color: selectedColor }}
                    renderIcon={() => <Image style={styles.tab} source={require("../image/tab_appeal.png")} />}
                    renderSelectedIcon={() => <Image style={styles.tab} source={require("../image/tab_appeal_sg.png")}/>}
                    onPress={() => this.setState({ selectedTab: 'company' })}>
                    {<CompanyRequestPage navigator={this.props.navigator}/>}
                </TabNavigator.Item>
                <TabNavigator.Item
                    tabStyle={styles.tabStyle}
                    title={tabName[2]}
                    selected={this.state.selectedTab === 'myinfo'}
                    selectedTitleStyle={{ color: selectedColor }}
                    renderIcon={() => <Image style={styles.tab} source={require("../image/tab_person.png")} />}
                    renderSelectedIcon={() => <Image style={styles.tab} source={require("../image/tab_person_sg.png")} />}
                    onPress={() => this.setState({ selectedTab: 'myinfo' })}>
                    {<MyPageNavigator navigator={this.props.navigator} />}
                </TabNavigator.Item>
            </TabNavigator>
        );
    }

对于我们所关心的页面切换,在TabNavigator.Item中,可将其置于<TabNavigator.Item>{<View/>}</TabNavigator.Item>之中,即作为Item的子元素存在,这里请注意:如果添加了一个Item,必须为其添加一个View,否则将无法运行!

这里还需要传入navigator,在入口文件(如果tabbar页面处于打开应用的第一个页面的话)创建navigator如下:

export default class Navigation extends Component {

    render() {
        return (
            <Navigator
                initialRoute={{ component: MainScene }}
                renderScene={(route, navigator) => {
                    return <route.component navigator={navigator} {...route.args} />
                }
                } />
        );
    }

    componentDidMount() {
    }
}

MainScene为初始页面,在此页面内加入Tabbar:

render() {
        return (
            <View style={styles.screen}>
                <TabBar navigator={this.props.navigator} />
            </View>
        )
    }

这样就完成了三个页面的TABBAR布局。

页面中需要跳转的话调用navigator.push的方法。这里有两种情况,第一种即跳转后页面不需要显示tabbar,直接调用即可:

_applyButtonCallback() {  //按钮点击的事件
        Keyboard.dismiss();  //关闭软键盘再跳转
        this.props.navigator.push({
            component: ApplyPage   //需要import
        });
    }

还有一种情况为跳转后希望tabbar依然显示,这种我们需要在tabbar的item页面里重新定义一个navigator,例如上面代码里第三个item:MyPageNavigator,其代码为:

export default class MyPageNavigator extends Component {


    render() {
        return (
            <Navigator
                initialRoute={{ component: MyPage }}
                renderScene={(route, navigator) => {
                    return <route.component navigator={navigator} {...route.args} />
                }
                } />
        );
    }

    componentDidMount() {
    }
}

MyPage就是我们点击第三个标签后显示的页面,在MyPage里我们应对两种跳转方式需要获取不同的navigator,因为MyPage已经处于新的navigator下,这时调用this.props.navigator获取的是MyPageNavigator(class MyPageNavigator里这个),这样在PUSH后tabbar依然显示。如果不想要tabbar显示,我们需要获取我们在入口文件里定义的navigator(class Navigation里那个),所以需要暴露一个方法,我们在mainScene这个页面里有这样的代码:<TabBar navigator={this.props.navigator} />,这个this.props.navigator就是我们需要的,所以在同一文件下export一个方法返回这个navigator就行了:

'use strict';

import React, { Component } from 'react';
import { Text, View, BackAndroid, Platform, StyleSheet } from 'react-native';
import TabBar from '../component/TabBar';

var MainNavigator;  //定义变量用来保存navigator

export default class MainScene extends Component {
    constructor(props) {
        super(props);
    }

    componentDidMount() {  //在组件挂载的时候将需要的navigator传给MainNavigator
        MainNavigator= this.props.navigator;
        BackAndroid.addEventListener('hardwareBackPress', function () {  //顺带处理一下android回退按钮的点击事件
            BackAndroid.exitApp(0);
            return true;
        });
    }

    render() {
        return (
            <View style={styles.screen}>
                <TabBar navigator={this.props.navigator} />
            </View>
        )
    }
}

export function getNavigator(){  //将初始化后的MainNavigator暴露出来
    return MainNavigator;  
}

const styles = StyleSheet.create({
    screen:{
        flex:1, 
        justifyContent: 'flex-end'  //主轴
    }
});

在MyPage里首先import { getNavigator } from './MainScene',然后使用这个方法拿到navigator后再push,这样新页面就没有tabbar了。

getNavigator().push({
                    component: LoginPage
                });

results matching ""

    No results matching ""