React Native + Ant Design 的 Tabs组件问题

Tabs 标签页

1.主要用来做选项切换作用


Tabs样式
  • ant design官方文档中有一个简单的例子 ,
import React from 'react';
import { ScrollView, Text, View } from 'react-native';
import { Tabs } from '@ant-design/react-native';
const renderContent = (tab, index) => {
  const style = {
    paddingVertical: 40,
    justifyContent: 'center',
    alignItems: 'center',
    margin: 10,
    backgroundColor: '#ddd',
  };
  const content = [1, 2, 3, 4, 5, 6, 7, 8].map(i => {
    return (
      <View key={`${index}_${i}`} style={style}>
        <Text>
          {tab.title} - {i}
        </Text>
      </View>
    );
  });
  return <ScrollView style={{ backgroundColor: '#fff' }}>{content}</ScrollView>;
};
export default class BasicTabsExample extends React.Component {
  render() {
    const tabs = [
      { title: 'First Tab' },
      { title: 'Second Tab' },
      { title: 'Third Tab' },
    ];
    const tabs2 = [
      { title: '1st Tab' },
      { title: '2nd Tab' },
      { title: '3rd Tab' },
      { title: '4th Tab' },
      { title: '5th Tab' },
      { title: '6th Tab' },
      { title: '7th Tab' },
      { title: '8th Tab' },
      { title: '9th Tab' },
    ];
    const style = {
      alignItems: 'center',
      justifyContent: 'center',
      height: 150,
      backgroundColor: '#fff',
    };
    return (
      <View style={{ flex: 1 }}>
        <Tabs tabs={tabs}>
          <View style={style}>
            <Text>Content of First Tab</Text>
          </View>
          <View style={style}>
            <Text>Content of Second Tab</Text>
          </View>
          <View style={style}>
            <Text>Content of Third Tab</Text>
          </View>
        </Tabs>
        <View style={{ flex: 2 }}>
          <Tabs tabs={tabs2} initialPage={1} tabBarPosition="top">
            {renderContent}
          </Tabs>
        </View>
      </View>
    );
  }
}
export const title = 'Tabs';
export const description = 'Tabs example';

renderTabBar 自定义TabBar

renderTabBar官方文档说明

1.目的:使用tabs组件 ,自定义renderTabBar


修改TabBar最终效果

2.引用组件展示出的默认效果 ,默认效果很好,但是tabbar无法该表 ,你要改变效果,就要用到renderTabBar属性


默认效果
import React from 'react';
import { Text, View  , StyleSheet } from 'react-native';
import { Tabs } from '@ant-design/react-native';
import globalStyle from '../../../globalStyle'

export default class BasicTabsExample extends React.Component {
   constructor(props) {
       super(props)
       this.state = {
           tabs: [
               { title: '学习总时长' },
               { title: '单词速记' },
               { title: '同步课程' },
               { title: '互动语法' },
               { title: '习题冲刺' },
           ]
       }
   }

   render() {
       const { tabs } = this.state
       return (
           <View style={{ flex: 1 }}>
               <Tabs tabs={tabs} >                   
                   <View style={styles.learnView}>
                       <Text>Content of 学习总时长</Text>
                   </View>
                   <View style={styles.learnView}>
                       <Text>Content of  单元速记</Text>
                   </View>
                   <View style={styles.learnView}>
                       <Text>Content of 同步课程</Text>
                   </View>
                   <View style={styles.learnView}>
                       <Text>Content of 互动语法</Text>
                   </View>
                   <View style={styles.learnView}>
                       <Text>Content of 习题冲洗</Text>
                   </View>
               </Tabs>
           </View>
       );
   }
}
const styles = StyleSheet.create({
   learnView: {
       alignItems: 'center',
       justifyContent: 'center',
       height: 150,
       backgroundColor: '#fff',
   },
   container: {
       flexDirection: "row",
       alignItems: "center",
       justifyContent: "center",
       paddingVertical: 10
   },
   tabBtn: {
       width: "25%",
       paddingVertical: 5,
       paddingHorizontal: 40,
       alignItems: "center",
       borderWidth: 1,
       borderColor: globalStyle.color.primary
   },
})



export const title = 'Tabs';
export const description = 'Tabs example';

3.引用tabbar组件, 在此我是把组件单独的抽离出来了 , 如果简单的话,也可以不抽离 , 但是ReactNative是推荐使用组建化的。

使用renderTabBar后的效果
import ChartTabBar from "../childrenPages/learnReport/ChartTabBar";

render() {
       const { tabs } = this.state
       return (
           <View style={{ flex: 1 }}>
               <Tabs tabs={tabs}
                   renderTabBar={(props) =>
                       <ChartTabBar
                         {...props} 
                         goToTab={(index) => true} 
                       >
                       </ChartTabBar>
                   }
               >
                   <View style={styles.learnView}>
                       <Text>Content of 学习总时长</Text>
                   </View>
                   <View style={styles.learnView}>
                       <Text>Content of  单元速记</Text>
                   </View>
                   <View style={styles.learnView}>
                       <Text>Content of 同步课程</Text>
                   </View>
                   <View style={styles.learnView}>
                       <Text>Content of 互动语法</Text>
                   </View>
                   <View style={styles.learnView}>
                       <Text>Content of 习题冲洗</Text>
                   </View>
               </Tabs>
           </View>
       );
   }
  • ChartTabbar 组件 (名称自拟)
import React, { Component } from "react";
import { View, TouchableOpacity, StyleSheet, Text } from "react-native";
import globalStyle from "../../../../globalStyle";
/**
 * 学习统计中的TabBar , 删除了些样式的代码
 */
export default class ChartTabBar extends Component {
  constructor(props) {
      super(props);
      this.state = {
    }
  }
  _renderTabs=(item, index)=> {    
    const {  goToTab } = this.props;
    return (
      <TouchableOpacity
        key={index}
        onPress={() => goToTab(index)}
        style={[
          styles.tabBtn,
        ]}
      >
        <Text style={{ color: textColor }}>{item.title}</Text>
      </TouchableOpacity>
    );
  }

  render() {
    /**
     * tabs 存放每一项内容的标题的数组
     */
    const { tabs } = this.props;
    return (
      <View style={styles.container}>
        {tabs.map(this._renderTabs)}
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flexDirection: "row",
    alignItems: "center",
    justifyContent: "center",
    paddingVertical: 10
  },
  tabBtn: {
    paddingVertical: 5,
    paddingHorizontal: 40,
    alignItems: "center",
    borderWidth: 1,
    borderColor: globalStyle.color.primary
  },
 
});

Tabs.DefaultTabBar
  • goToTab 用法
    >tabs.DefaultTabBar中的属性都能在此引用,相当于传参 ,传到tabbar页面


    goToTab
  • 1.bug 你可能发生 当代码能够运行的时候 , 可能会出现点击TabBar时不能切换下面的内容,但是左右滑动的下面的时候,上面的tabbar会跟着动,

  • 1.解决:应该是因为渲染的的顺序的问题,改变一下渲染的位置问题得以解决,(反正我是)

 <Tabs tabs={tabs}
                    renderTabBar={(props) =>
                        <ChartTabBar
                            goToTab={(index) => true}
                            {...props}
                        >
                        </ChartTabBar>
                    }
                >

4.把3中的tabBar下划线去掉 , 使用 tabBarUnderlineStyle 属性 发现不行 ,因为这可以去掉默认renderTabBar的下滑线 ,但是自定义的去不掉 。
所以使用 renderUnderline

 <Tabs tabs={tabs}
                    renderTabBar={(props) =>
                        <ChartTabBar
                            goToTab={(index) => true}
                            {...props}
                        >
                        </ChartTabBar>
                    }
                    renderUnderline={() => null}
                    styles={{
                        topTabBarSplitLine: {
                            borderBottomWidth: 0,
                        },
                    }}
                >
完成
总代码

index.js

import React from 'react';
import { Text, View } from 'react-native';
import { Tabs } from '@ant-design/react-native';
import StyleSheet from '../../../globalStyle/StyleSheet'
import globalStyle from '../../../globalStyle'
import ChartTabBar from "../childrenPages/learnReport/ChartTabBar";

export default class BasicTabsExample extends React.Component {
    constructor(props) {
        super(props)
        this.state = {
            tabs: [
                { title: '学习总时长' },
                { title: '单词速记' },
                { title: '同步课程' },
                { title: '互动语法' },
                { title: '习题冲刺' },
            ]
        }
    }

    render() {
        const { tabs } = this.state
        return (
            <View style={{ flex: 1 }}>
                <Tabs tabs={tabs}
                    renderTabBar={(props) =>
                        <ChartTabBar
                            goToTab={(index) => true}
                            {...props}
                        >
                        </ChartTabBar>
                    }
                    renderUnderline={() => null}
                    styles={{
                        topTabBarSplitLine: {
                            borderBottomWidth: 0,
                        },
                    }}
                >
                    <View style={styles.learnView}>
                        <Text>Content of 学习总时长</Text>
                    </View>
                    <View style={styles.learnView}>
                        <Text>Content of  单元速记</Text>
                    </View>
                    <View style={styles.learnView}>
                        <Text>Content of 同步课程</Text>
                    </View>
                    <View style={styles.learnView}>
                        <Text>Content of 互动语法</Text>
                    </View>
                    <View style={styles.learnView}>
                        <Text>Content of 习题冲洗</Text>
                    </View>
                </Tabs>
            </View>
        );
    }
}
const styles = StyleSheet.create({
    learnView: {
        alignItems: 'center',
        justifyContent: 'center',
        height: 150,
        backgroundColor: '#fff',
    },
    container: {
        flexDirection: "row",
        alignItems: "center",
        justifyContent: "center",
        paddingVertical: 10
    },
    tabBtn: {
        width: "25%",
        paddingVertical: 5,
        paddingHorizontal: 40,
        alignItems: "center",
        borderWidth: 1,
        borderColor: globalStyle.color.primary
    },
})
export const title = 'Tabs';
export const description = 'Tabs example';

ChartTabBar页面

import React, { Component } from "react";
import { View, TouchableOpacity, StyleSheet, Text } from "react-native";
import globalStyle from "../../../../globalStyle";
/**
 * 学习统计中的TabBar
 */
export default class ChartTabBar extends Component {
  constructor(props) {
      super(props);
      this.state = {
    }
  }
  _renderTabs=(item, index)=> {    
    const { activeTab, goToTab  , tabs} = this.props;
    let borderStyle = null;
    let backgroundColor = null;
    let textColor = null;
    if (index === 0) {
      borderStyle = styles.rightBorder;
    } else if (index === tabs.length -1) {
      borderStyle = styles.leftBorder;
    } else {
      borderStyle = styles.centerBorder;
    }    
    if (activeTab === index) {
      backgroundColor = globalStyle.color.primary;
      textColor = '#fff';
    } else {
      backgroundColor = "#fff";
      textColor = globalStyle.color.primary;
    }
    return (
      <TouchableOpacity
        key={index}
        onPress={() => goToTab(index)}
        style={[
          styles.tabBtn,
          borderStyle,
          { backgroundColor: backgroundColor }
        ]}
      >
        <Text style={{ color: textColor }}>{item.title}</Text>
      </TouchableOpacity>
    );
  }

  render() {
    /**
     * tabs 存放每一项内容的标题的数组
     */
    const { tabs } = this.props;
    return (
      <View style={styles.container}>
        {tabs.map(this._renderTabs)}
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flexDirection: "row",
    alignItems: "center",
    justifyContent: "center",
    paddingVertical: 10
  },
  tabBtn: {
    paddingVertical: 5,
    paddingHorizontal: 40,
    alignItems: "center",
    borderWidth: 1,
    borderColor: globalStyle.color.primary
  },
  centerBorder: {
    borderWidth: 1,
    borderLeftWidth:0
  },
  leftBorder: {
    borderTopRightRadius: 5,
    borderBottomRightRadius: 5,
    borderLeftWidth: 0
  },
  rightBorder: {
      borderTopLeftRadius: 5,
      borderBottomLeftRadius: 5,
      borderRightWidth: 1.01,
  }
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • 因新工作主要负责微信小程序这一块,最近的重心就移到这一块,该博客是对微信小程序整体的整理归纳以及标明一些细节点,初...
    majun00阅读 7,308评论 0 9
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,076评论 1 32
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,718评论 2 9
  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 8,410评论 1 33
  • 1 我记性不太好,所以常常忘记事情,昨天还因为忘记做X展架被总经理骂了一顿。也常常忘记人情。 我不挑,别人欠我的,...
    卢尼莫阅读 1,423评论 0 1