[0.57]ReactNative-仿写Github客户端[二]

目标:
1.实现顶部导航动态配置功能,可滑动,设置相关样式,可传递参数。
2.实现底部标签栏动态配置功能,可进行主题切换。

1.我们首先要从react-navigation导入 createMaterialTopTabNavigator这个组件。
然后在要配置的页面进行初始化的属性设置,代码如下

export default class PopularPage extends Component<Props>{
     constructor(props){
         super(props);
         this.tabNames=['Java','Android','iOS','PHP','ReactNative'];

     }

     _genTabs(){
         const  tabs={};
         this.tabNames.forEach((item,index)=>{
            tabs[`tab${index}`]={


                // screen:TabTopBar,
                //可以给下面的页面传递参数
                screen:props=><TabTopBar{...props} tabLabel={item}/>,
                navigationOptions:{
                    title:item
                }
            }
         })
         return tabs;
     }



    render(){
        const TabNavigator=createAppContainer(createMaterialTopTabNavigator(
            this._genTabs(),{
                tabBarOptions:{
                    tabStyle: styles.tabStyle,
                    //标签非大写
                    upperCaseLabel:false,
                    //滚动标签
                    scrollEnabled:true,
                    //背景色
                    style:{
                        backgroundColor:'#678',
                    },
                    indicatorStyle: styles.indicatorStyle,
                    labelStyle: styles.labelStyle,
                }
            }
        ));
        return (
            <View style={styles.container}>
              <TabNavigator/>
            </View>

        );
    }
}

constructor中设置初始化的模块,此步骤真实开发中一般从网络中获取。
_genTabs()方法为配置其中的相关模块
screen:props=><TabTopBar{...props} tabLabel={item}/>,这里值得关注的是,可以通过这种方法给配置的顶部模块传递相关参数,我这里传递了模块的名字。
配置好后,在render方法中进行返回即可。

class TabTopBar extends Component<Props>{

    render(){
        const {tabLabel}=this.props;
        return(
            <View style={styles.container}>
                <Text style={{flex: 1,justifyContent: 'center'} } onPress={()=> {
                    NavigatorUtils.gotoPage({},'DetailInfoPage');
                }} >{tabLabel}点我进详情</Text>
            </View>
        );
    }
}

这个为配置的相关页面。

const styles = StyleSheet.create({
    container:{
        flex: 1,
        justifyContent: 'center',
        marginTop: 30
    },
    tabStyle:{
        minWidth: 50
    },
    indicatorStyle:{
        height: 2,
        backgroundColor: 'white',
    },
    labelStyle:{
        fontSize:13,
        marginTop: 6,
        marginBottom: 6,
    }
})

相关样式

二:如何自定义底部标签栏并且可以进行主题色切换?
首先创建一个自定义Js类。我这里定义为DynamicTabNavigator。
因为要自定义tabbar,这里需要几个组件
1.import {BottomTabBar} from 'react-navigation-tabs';这个是自定义底部标签栏必要的组件
2.import MaterialIcons from 'react-native-vector-icons/MaterialIcons'
这里的 materiallicons 是react-native-vector-icons下面的一个子组件。这个组件包含了很多矢量图和字体。然后就是一些我们需要包裹的页面
具体代码如下

//配置需要的页面
const TABS = {
    PopularPage: {
        screen: PopularPage,
        navigationOptions:{
            tabBarLabel:'最热',
            tabBarIcon:({tintColor,focused})=>(
                <MaterialIcons
                    name={'whatshot'}
                    size={26}
                    style={{color:tintColor}}
                />
            )
        }
    },
    TrendingPage:{
        screen: TrendingPage,
        navigationOptions:{
            tabBarLabel:'趋势',
            tabBarIcon:({tintColor,focused})=>(
                <MaterialIcons
                    name={'whatshot'}
                    size={26}
                    style={{color:tintColor}}
                />
            )


        }

    },
    FavouritePage:{
        screen:FavouritePage,
        navigationOptions:{
            tabBarLabel:'喜欢',
            tabBarIcon:({tintColor,focused})=>(
                <MaterialIcons
                    name={'whatshot'}
                    size={26}
                    style={{color:tintColor}}
                />
            )
        }
    },
    MyPage:{
        screen:MyPage,
        navigationOptions:{
            tabBarLabel:'我的',
            tabBarIcon:({tintColor,focused})=>(
                <MaterialIcons
                    name={'whatshot'}
                    size={26}
                    style={{color:tintColor}}
                />
            )
        }

    }
};

export default class DynamicTabNavigator extends Component {
//底部样式方法
     _tabNavigator() {
//将配置的模块导出
        const {PopularPage,TrendingPage,FavouritePage,MyPage}=TABS
//配置需要的模块
        const tabs = {PopularPage,TrendingPage,FavouritePage,MyPage};
        //动态设置底部标题
        PopularPage.navigationOptions.tabBarLabel='最热';
        return createAppContainer( createBottomTabNavigator(tabs,{
//这里通过这个属性设置来自定义模块中的item
                tabBarComponent:TabBarComponent
            }

            ))

    }
    render(){
        const Tab = this._tabNavigator();
        return <Tab/>;
    }


}

//底部标签栏组件
class TabBarComponent extends  React.Component{
    constructor(props){
        super(props);
//设置主体颜色
        this.theme = {
            tintColor:props.activeTintColor,
            updateTime:new Date().getTime(),
        }
    }
    render(){
        //取出当前路由的数组和index
        const {routes,index}=this.props.navigation.state;
        if (routes[index].params){
            const {theme}=routes[index].params;
            //设置主题。如果当前时间大于之前的时间。 就更新
            if (theme&&theme.updateTime>this.theme.updateTime){
                this.theme = theme;
            }
        }
        return <BottomTabBar
            {...this.props}
            activeTintColor={this.theme.tintColor||this.props.activeTintColor}
        />
    }
}


const styles = StyleSheet.create({
    container:{
        flex: 1,
        justifyContent: 'center'
    }
})

在其他页面改变主题颜色

import React,{Component} from 'react';
import {Text,StyleSheet,View,Button} from 'react-native';
export default  class TrendingPage extends Component{
    render(){
        const {navigation}= this.props;
        return (
            <View style={styles.container}>
                <Text>
                    TrendingPage!
                </Text>
                <Button title={'改变主题参数'} onPress={()=>{
                    navigation.setParams({
                        theme:{
                            tintColor:'red',
                            updateTime: new Date().getTime()
                        }
                    })
                }}/>
            </View>

        );
    }
}

const styles = StyleSheet.create({
    container:{
        flex: 1,
        justifyContent: 'center'
    }
})

这里是通过navigation.setPatams方法来进行主题色更改。

Github地址:https://github.com/yanhuaxuanlan/RN_Github.git

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • 终于你还是要走,可我还没学会放手 强装的笑容没撑多久 躲在自己背后,我在哭 为何最初我们选择牵手 许过我们天长地久...
    清勇卢追阅读 161评论 0 1
  • 又是一年春来到,又是一台单位新年晚会,两年前亲临现场感受着你的绚烂和磅礴,如今只能在微信朋友圈里看到你的光彩...
    星辰_star阅读 402评论 0 0
  • 别说你没有时间学习英语! 每天只要一杯咖啡的时间, savvy带你用朗读全方位逆袭英语!
    一心研阅读 639评论 2 2
  • 周瑜带领着30万人马火烧赤壁,杀得曹操大败曹操,连跑了三天三夜一路上遇到了关羽张飞和赵云,后出赵云的时候就...
    冰箱静音99阅读 177评论 0 0
  • 因为秋天可以放风筝。寒可以吃到很多的苹果和梨。我越来越喜欢听天啦。
    窦鑫新阅读 192评论 0 1