RN筆記-TabNavigator隱藏Tabbar

rn頁面之間跳轉(zhuǎn)時(shí)默認(rèn)一直顯示tabbar,然而在開發(fā)過程中必須要切換tabbar的顯示和隱藏。在嘗試過很多次之后終于找到了解決辦法。解決的思路是,動態(tài)改變tabbar的高度。

定義tabbar的顯示高度tabBarHeight

  getInitialState() {
    return {
      selectedTab:'classCircle',
      tabBarHeight: 49
    }
  },

  handleTabBar(state){
    this.setState({
      tabBarHeight: state ? 49 : 0
    });
  },

設(shè)置TabNavigator 的tabBarStyle樣式,并在initialRoute 中定義tabar的 hideshow屬性。以班級圈模塊為例。

  render() {
    return (
      <TabNavigator
        tabBarStyle={{height: this.state.tabBarHeight, overflow: 'hidden'}}
        sceneStyle={{paddingBottom: this.state.tabBarHeight}}
        >
        { /*資源*/ }
        <TabNavigator.Item
          title="資源"
          renderIcon={() => <Image source={require('./../Source/tabbar_src.png')} style={styles.iconStyle} />}
          renderSelectedIcon={() => <Image source={require('./../Source/tabbar_src_h.png')} style={styles.iconStyle} />}
          onPress={() => {this.setState({ selectedTab: 'resource' })}}
          selected={this.state.selectedTab === 'resource'}
          >
          <Navigator
            initialRoute={{name:'資源',component:Resource}}
            configureScene={(route,navigator)=>{
              return Navigator.SceneConfigs.PushFromRight;
            }}
            renderScene={(route,navigator)=>{
              let Component = route.component;
              return <Component {...route.passProps} navigator={navigator}/>;
            }}
          />
        </TabNavigator.Item>
        { /*消息*/ }
        <TabNavigator.Item
          title="消息"
          renderIcon={() => <Image source={require('./../Source/tabbar_message.png')} style={styles.iconStyle} />}
          renderSelectedIcon={() => <Image source={require('./../Source/tabbar_message_h.png')} style={styles.iconStyle} />}
          onPress={() => {this.setState({ selectedTab: 'contact' })}}
          selected={this.state.selectedTab === 'contact'}
          >
            <Navigator
              initialRoute={{name:'消息',component:Contact}}
              configureScene={(route,navigator)=>{
                return Navigator.SceneConfigs.PushFromRight;
              }}
              renderScene={(route,navigator)=>{
                let Component = route.component;
                return <Component {...route.passProps} navigator={navigator}/>;
              }}
            />
        </TabNavigator.Item>
        { /*班級圈*/ }
        <TabNavigator.Item
          title="班級圈"
          renderIcon={() => <Image source={require('./../Source/tabbar_circle.png')} style={styles.iconStyle} />}
          renderSelectedIcon={() => <Image source={require('./../Source/tabbar_circle_h.png')} style={styles.iconStyle} />}
          onPress={() => {this.setState({ selectedTab: 'classCircle' })}}
          selected={this.state.selectedTab === 'classCircle'}>
          <Navigator
            initialRoute={{
              name:'班級圈',
              component:ClassCircle,
              passProps: {
                tabBar: {
                  hide: () => this.handleTabBar(false),
                  show: () => this.handleTabBar(true)
                }
              }
            }}
            configureScene={(route,navigator)=>{
              return Navigator.SceneConfigs.PushFromRight;
            }}
            renderScene={(route,navigator)=>{
              let Component = route.component;
              return <Component {...route.passProps} navigator={navigator}/>;
            }}
          />
        </TabNavigator.Item>
        { /*應(yīng)用*/ }
        <TabNavigator.Item
          title="應(yīng)用"
          renderIcon={() => <Image source={require('./../Source/tabbar_app.png')} style={styles.iconStyle} />}
          renderSelectedIcon={() => <Image source={require('./../Source/tabbar_app_h.png')} style={styles.iconStyle} />}
          onPress={() => {this.setState({ selectedTab: 'appCenter' })}}
          selected={this.state.selectedTab === 'appCenter'}
          >
            <Navigator
              initialRoute={{name:'應(yīng)用',component:AppCenter}}
              configureScene={(route,navigator)=>{
                return Navigator.SceneConfigs.PushFromRight;
              }}
              renderScene={(route,navigator)=>{
                let Component = route.component;
                return <Component {...route.passProps} navigator={navigator}/>;
              }}
            />
        </TabNavigator.Item>
        { /*我的*/ }
        <TabNavigator.Item
          title="我的"
          renderIcon={() => <Image source={require('./../Source/tabbar_mine_h.png')} style={styles.iconStyle} />}
          renderSelectedIcon={() => <Image source={require('./../Source/tabbar_mine.png')} style={styles.iconStyle} />}
          onPress={() => {this.setState({ selectedTab: 'mine' })}}
          selected={this.state.selectedTab === 'mine'}
          >
            <Navigator
              configureScene={ this._configureScene }
              initialRoute={{
                name:'我的',
                component:Mine,
                passProps: {
                  tabBar: {
                    hide: () => this.handleTabBar(false),
                    show: () => this.handleTabBar(true)
                  }
                }
              }}
              configureScene={(route,navigator)=>{
                return Navigator.SceneConfigs.PushFromRight;
              }}
              renderScene={(route,navigator)=>{
                let Component = route.component;
                return <Component {...route.passProps} navigator={navigator}/>;
              }}
            />
        </TabNavigator.Item>

      </TabNavigator>
    );
  }

至此Tabbar的隱藏和顯示屬性已經(jīng)定義完畢,接下來就要在push頁面時(shí)做如下操作。

  pushToDetail(url){
      if (url == 'Consult') {
        this.props.navigator.push(
          {
            component:Consult,//要跳轉(zhuǎn)的版塊
            passProps:{
              'url':url,
              tabBar: {
                hide: () => this.props.tabBar.hide(),
                show: () => this.props.tabBar.show()
              }
            }
          }
        );
      }
    },

需要了解Component組件的生命周期,componentWillMount方法是在組件將要被渲染時(shí)調(diào)用,componentWillUnmount方法是在組件將要被銷毀時(shí)調(diào)用。

  // 渲染組件時(shí)隱藏tabbar 
  componentWillMount(){
    this.props.tabBar.hide();
  },

  // 銷毀組件時(shí)顯示tabbar
  componentWillUnmount(){
    this.props.tabBar.show();
  },

附效果圖:

1.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容