编程语言
292
自定义 TabBar
tabs 容器有一个默认的 TabBar, 支持未读消息数,小红点提示等功能。它是由原生组件实现的,性能优越,满足 80% 常用场景。如果你希望对 TabBar 有更多的控制权,譬如实现如下效果:
那么你需要使用 tabBarModuleName
选项来指定你的 TabBar 组件。
左图效果的实现,请参看 example/src/CustomTabBar.js,右图效果的实现,请参看 example/src/BulgeTabBar.js。
此外,需要注意以下若干事项:
注册
TabBar 组件和普通页面组件一样,需要注册
import CustomTabBar from './src/CustomTabBar' import BulgeTabBar from './src/BulgeTabBar' ReactRegistry.registerComponent('CustomTabBar', () => CustomTabBar) ReactRegistry.registerComponent('BulgeTabBar', () => BulgeTabBar)
启用
在布局对象中,通过 tabBarModuleName
启用自定义 TabBar 组件。
如果不需要中间按钮凸起效果,sizeIndeterminate
需要设置为 false
,同时指定 TabBar 的宽高。
Navigator.setRoot({ tabs: { children: [], options: { tabBarModuleName: 'CustomTabBar', sizeIndeterminate: false, }, }, })
tabBar: { // 56 和 48 是原生 TabBar 容器的实际高度,是固定值。 height: Platform.OS === 'android' ? 56 : 48, width: Dimensions.get('window').width, flexDirection: 'row', justifyContent: 'center', alignItems: 'stretch', },
如果需要实现中间按钮凸起效果,sizeIndeterminate
需要设置为 true
,同时指定 TabBar 期待的(包含凸起按钮后的)宽高,以及 TabBar 的实际宽高。
Navigator.setRoot({ tabs: { children: [], options: { tabBarModuleName: 'BulgeTabBar', sizeIndeterminate: true, }, }, })
container: { // TabBar 期待的宽高 height: Platform.OS === 'android' ? 78 : 72, width: Dimensions.get('window').width, justifyContent: 'flex-start', alignItems: 'center', }, bulge: { justifyContent: 'center', alignItems: 'center', }, // TabBar 的实际宽高以及相对于父组件的位置 tabBar: { // TabBar 原生底层容器的高度,这个高度是固定的。 height: Platform.OS === 'android' ? 56 : 48, position: 'absolute', bottom: 0, left: 0, right: 0, flexDirection: 'row', justifyContent: 'center', alignItems: 'stretch', },
属性
通过 props 来获取自定义 TabBar 相关属性。
可以通过 props.selectedIndex 来获取当前选中的 tab 的索引。props 还有许多有用的信息,它的数据结构如下:
{ "sceneId": "82a466fb-4a33-452d-b53e-d5122bf93078", "moduleName": "CustomTabBar", "navigator": { "sceneId": "82a466fb-4a33-452d-b53e-d5122bf93078", "moduleName": "CustomTabBar" }, "garden": { "sceneId": "82a466fb-4a33-452d-b53e-d5122bf93078" }, "selectedIndex": 1, "itemColor": "#8BC34A", "unselectedItemColor": "#BDBDBD", "badgeColor": "#FF3B30", "tabs": [ { "index": 0, "sceneId": "86195762-DB47-4354-AE62-753D308818BC", "moduleName": "Navigation", "title": "Navigation", "dot": false, "icon": "font://FontAwesome//24/#FFFFFF", "unselectedIcon": null }, { "index": 1, "sceneId": "F28EB922-FDC3-426F-B572-F1E90EFC47F8", "moduleName": "Options", "title": "Options", "badgeText": "99", "icon": "flower", "unselectedIcon": null } ] }
其中 sceneId 是 tabs 容器的 sceneId,navigator 是 tabs 容器的 navigator,如果你希望获取某个 tab 页面的 navigator,可以通过如下方式:
const navigator = Navigator.of(this.props.tabs[0].sceneId)
TabBar 的背景颜色,分割线,仍然由原生控制。