react-onsenui
Version:
Onsen UI - React Components for Hybrid Cordova/PhoneGap Apps with Material Design and iOS UI components
224 lines (198 loc) • 5.5 kB
JSX
import React from 'react';
import PropTypes from 'prop-types';
import 'onsenui/esm/elements/ons-tabbar';
import onsCustomElement from '../onsCustomElement';
const deprecated = {
index: 'activeIndex'
};
const Element = onsCustomElement('ons-tabbar', {deprecated});
/**
* @original ons-tabbar
* @category tabbar
* @tutorial react/Reference/tabbar
* @description
* [en] Component to display a tabbar on either the top or the bottom of a page.
* To define the tabs and the content the property renderTabs need to be implemented, that returns an array of tabs and their content. See the example for specifics. [/en]* [ja][/ja]
* @example
<Page>
<Tabbar
onPreChange={({index}) => this.setState(index)}
onPostChange={() => console.log('postChange')}
onReactive={() => console.log('postChange')}
position='bottom'
index={this.state.index}
renderTabs={(activeIndex, tabbar) => [
{
content: <TabPage title="Home" active={activeIndex === 0} tabbar={tabbar} />,
tab: <Tab label="Home" icon="md-home" />
},
{
content: <TabPage title="Settings" active={activeIndex === 1} tabbar={tabbar} />,
tab: <Tab label="Settings" icon="md-settings" />
}]
}
/>
</Page>
*/
const Tabbar = React.forwardRef((props, ref) => {
const {visible, hideTabs, renderTabs, ...rest} = props;
const tabs = renderTabs(props.activeIndex, ref);
// visible is deprecated in favour of hideTabs, but if visible is defined and
// hideTabs is not, we use its negation as the value of hideTabs
let reallyHideTabs;
if (hideTabs === undefined && visible !== undefined) {
reallyHideTabs = !visible;
} else {
reallyHideTabs = hideTabs;
}
return (
<Element
hideTabs={reallyHideTabs}
{...rest}
ref={ref}
>
<div className='tabbar__content'>
<div>
{tabs.map(tab => tab.content)}
</div>
<div></div>
</div>
<div className='tabbar'>
{tabs.map(tab => tab.tab)}
<div className='tabbar__border'></div>
</div>
</Element>
);
});
Tabbar.propTypes = {
/**
* @name activeIndex
* @type number
* @description
* [en]The index of the tab to highlight.[/en]
* [ja][/ja]
*/
activeIndex: PropTypes.number,
/**
* @name index
* @type number
* @description
* [en]DEPRECATED! Use `activeIndex` instead.[/en]
* [ja][/ja]
*/
index: PropTypes.number,
/**
* @name renderTabs
* @type function
* @description
* [en]Function that returns an array of objects with the keys `content` and `tab`.[/en]
* [ja][/ja]
*/
renderTabs: PropTypes.func.isRequired,
/**
* @name position
* @type string
* @description
* [en]Tabbar's position. Available values are `"bottom"` and `"top"`. Use `"auto"` to choose position depending on platform (iOS bottom, Android top). [/en]
* [ja][/ja]
*/
position: PropTypes.string,
/**
* @name swipeable
* @type bool
* @description
* [en]Enable swipe interaction.[/en]
* [ja][/ja]
*/
swipeable: PropTypes.bool,
/**
* @name ignoreEdgeWidth
* @type number
* @description
* [en]Distance in pixels from both edges. Swiping on these areas will prioritize parent components such as `Splitter` or `Navigator`.[/en]
* [ja][/ja]
*/
ignoreEdgeWidth: PropTypes.number,
/**
* @name animation
* @type string
* @description
* [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
* [ja][/ja]
*/
animation: PropTypes.oneOf(['none', 'slide']),
/**
* @name animationOptions
* @type object
* @required false
* @description
* [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
* [ja][/ja]
*/
animationOptions: PropTypes.object,
/**
* @name tabBorder
* @type bool
* @description
* [en]If true, the tabs show a dynamic bottom border. Only works for iOS since the border is always visible in Material Design.[/en]
* [ja][/ja]
*/
tabBorder: PropTypes.bool,
/**
* @name onPreChange
* @type function
* @description
* [en]Called just before the tab is changed.[/en]
* [ja][/ja]
*/
onPreChange: PropTypes.func,
/**
* @name onPostChange
* @type function
* @description
* [en]Called just after the tab is changed.[/en]
* [ja][/ja]
*/
onPostChange: PropTypes.func,
/**
* @name onReactive
* @type function
* @description
* [en]Called if the already open tab is tapped again.[/en]
* [ja][/ja]
*/
onReactive: PropTypes.func,
/**
* @name onSwipe
* @type function
* @description
* [en]Hook called whenever the user slides the tabbar. It gets a decimal index and an animationOptions object as arguments.[/en]
* [ja][/ja]
*/
onSwipe: PropTypes.func,
/**
* @name visible
* @type bool
* @description
* [en]If true, the tabbar is not shown on the screen. Otherwise, the tabbar is shown.[/en]
* [ja][/ja]
*/
hideTabs: PropTypes.bool,
/**
* @name visible
* @type bool
* @description
* [en]DEPRECATED! Use `hideTabs` instead.[/en]
* [ja][/ja]
*/
visible: PropTypes.bool,
/**
* @name modifier
* @type string
* @description
* [en]The appearance of the tabbar.[/en]
* [ja][/ja]
*/
modifier: PropTypes.string
};
export default Tabbar;