React Dynamic Tabs with full API
- Based on React hook
- Open & Close & Select & Refresh
- lazy/eager loading
- Customizable style
- Full API
- Return to last used tab when closing selected tab
- PanelList can be rendered outside the TabList container
- ARIA accessible
- Supporting custom Tab component
$ npm install react-dyn-tabs --save
import React from 'react';
import useDynTabs from 'react-dyn-tabs';
import 'react-dyn-tabs/style/react-dyn-tabs.css';
import 'react-dyn-tabs/themes/default.css';
import ContactComponent from './contact-component';
export default () => {
const options = {
tabs: [
{
id: '1',
title: 'home',
closable: false,
panelComponent: porps => <p> home content </p>
},
{
id: '2',
title: 'contact',
panelComponent: ContactComponent // or can be <ContactComponent />
}
],
selectedTabID: '1'
};
const [TabList, PanelList, api] = useDynTabs(options);
return (
<div>
<TabList></TabList>
<PanelList></PanelList>
</div>
);
};
NOTE :
api Object will not be changed after re-rendering multiple times. Its value always refers to same reference.
type | default value | required | description |
---|---|---|---|
Array of tabData |
[] |
false | initial opened tabs |
Example
const [ TabList , PanelList , api ] = useDynTabs({
tabs : [
{
id: '1',
title: 'home',
iconClass : 'fa fa-home',
closable: true,
panelComponent: porps => <p> home content </p>
},
{
id: '2',
title: 'contact',
tooltip: 'contact',
disable: true,
closable: false,
panelComponent: porps => <p> contact content </p>
}
]
});
type | default value | required | description |
---|---|---|---|
string | ' ' | false | initial selected tab id |
Example
const [ TabList , PanelList , api ] = useDynTabs({
tabs : [
{
id: '1',
title: 'home',
iconClass : 'fa fa-home',
closable: true,
panelComponent: porps => <p> home content </p>
},
{
id: '2',
title: 'contact',
tooltip: 'contact',
disable: true,
closable: false,
panelComponent: porps => <p> contact content </p>
}
],
selectedTabID : '2'
});
type | default value | required | description |
---|---|---|---|
string | 'ltr' | false | can be either of 'ltr' or 'rtl' |
Example
const [ TabList , PanelList , api ] = useDynTabs({ direction : 'rtl' });
or
if( api.getOption('direction') !== 'ltr') {
api.setOption('direction','ltr');
api.refresh();
}
type | required | description |
---|---|---|
React component | false | custom tab component |
Example
const [ TabList , PanelList , api ] = useDynTabs({
tabComponent : props => {
const { id , isSelected , api } = props;
return (
<button {...props.tabProps}>
{props.children}
{
props.iconProps &&
<span {...props.iconProps}></span>
}
</button>
);
}
});
or
const CustomTabComponent = props => {
const { id, isSelected, api } = props;
return (
<button {...props.tabProps}>
{props.children}
{
props.iconProps &&
<span {...props.iconProps}></span>
}
</button>
);
};
api.setOption('tabComponent', CustomTabComponent);
api.refresh();
type | required | description |
---|---|---|
React component | React element | false |
Example
const [ TabList , PanelList , api ] = useDynTabs({
defaultPanelComponent : props => {
const { id , isSelected , api } = props;
return <div></div>
}
});
or
api.setOption('defaultPanelComponent', props => <p></p>);
api.refresh();
type | default value | required | description |
---|---|---|---|
boolean | true | false |
Example
const [ TabList , PanelList , api ] = useDynTabs({ accessibility : false });
or
if( api.getOption('accessibility') == true ){
api.setOption('accessibility',false).refresh();
}
NOTE :
This option assigns id attribute on panel element and text element inside the tab. for having elements without id attribute, set this option to false.
type | required | description |
---|---|---|
function | false | This event is fired only once |
Example
const [ TabList , PanelList , api ] = useDynTabs({ onLoad : function() {
// you can use 'this' here which refers to the api
} });
// or
api.setOption('onLoad', () => { } ).refresh();
type | required | description |
---|---|---|
function | false | This event is executed after every execution of useDynTabs hook. |
Example
const [ TabList , PanelList , api ] = useDynTabs({ onInit : function() {
// you can use 'this' here which refers to the api
} });
// or
api.setOption('onInit', () => { } ).refresh();
type | required | description |
---|---|---|
function | false | fires when we open|close|select a tab. |
Example
const [ TabList , PanelList , api ] = useDynTabs({ onChange : function({ currentData , perviousData }) {
// you can use 'this' here which refers to the api
} });
// or
api.setOption('onChange', ({ currentData , perviousData }) => { } ).refresh();
type | required | description |
---|---|---|
function | false | fires when the user click on the tab, but before select them. This event should return boolean true or false, If the event return false the tab is not selected. |
Example
const [ TabList , PanelList , api ] = useDynTabs({ beforeSelect : function(e, id) {
// you can use 'this' here which refers to the api
} });
// or
api.setOption('beforeSelect', (e, id) => { } ).refresh();
type | required | description |
---|---|---|
function | false | fires after selecting tabs |
Example
const [ TabList , PanelList , api ] = useDynTabs({
onSelect : function({currentSelectedTabId , perviousSelectedTabId}) {
// you can use 'this' here which refers to the api
}
});
// or
api.setOption('onSelect', ({currentSelectedTabId , perviousSelectedTabId}) => { } ).refresh();
type | required | description |
---|---|---|
function | false | fires after opening tabs |
Example
const [ TabList , PanelList , api ] = useDynTabs({ onOpen : function(openedTabIDs) {
// you can use 'this' here which refers to the api
}});
// or
api.setOption('onOpen', (openedTabIDs) => { } ).refresh();
type | required | description |
---|---|---|
function | false | fires when the user click on the close icon, but before close them. This event should return boolean true or false, If the event return false the tab is not closed. |
Example
const [ TabList , PanelList , api ] = useDynTabs({ beforeClose : function(e, id) {
// you can use 'this' here which refers to the api
} });
// or
api.setOption('beforeClose', (e, id) => { } ).refresh();
type | required | description |
---|---|---|
function | false | fires after closing tabs |
Example
const [ TabList , PanelList , api ] = useDynTabs({ onClose : function(closedTabIDs) {
// you can use 'this' here which refers to the api
}});
// or
api.setOption('onClose', closedTabIDs => { } ).refresh();
Return value : boolean
Parameters:
id: String
Example
const result = api.isOpen('tab ID');
Return value : Promise
Parameters:
tabData: Object
Example
if( api.isOpen('2') == false ){
api.open({
id: '2',
title: 'contact',
tooltip: 'contact',
disable: false,
closable: true,
iconClass: '',
panelComponent: <ContactPanel></ContactPanel>
}).then(()=>{
//do sth here
});
}
Return value : boolean
Parameters:
id: String
Example
const result = api.isSelected('tab ID');
Return value : Promise
Parameters:
id: string
Example
if( api.isSelected('your tab id') == false ){
api.select('your tab id').then(()=>{
//do sth here
});
}
Return value : Promise
Parameters:
id: string
Example
if( api.isOpen('2') == true ){
api.close('2').then(()=>{
//do sth here
});
}
Return value : Promise
Example
api.refresh().then(()=>{
//do sth here
});
Parameters:
optionName : String
Example
const direction = api.getOption('direction');
const onSelect = api.getOption('onSelect');
for re-rendering immediately after this function, you should call refresh method after it.
Return value : api
Parameters:
optionName : String
optionValue : string|boolean|object|function
Example
api.setOption('direction','rtl');
api.setOption('onSelect',()=>{});
get tabData by id
Return value : tabData object
Parameters:
id : String
Example
const tabData = api.getTab('3');
console.log(tabData.id); // 3
set tabData by id for re-rendering immediately after this function, you should call refresh method after it.
Return value : api
Parameters:
optionName : String
optionValue : string|boolean|object|function
Example
api.setTab('disable',true);
api.setTab('panelComponent' , props => <p/>);
Attach an event handler function for one event.
Return value : api
Parameters:
event Name : String (can be either of of onSelect|onClose|onOpen|onInit|onChange|onDestroy)
handler : function
Example
api.on('onSelect',function(params){
const {currentSelectedTabId , perviousSelectedTabId} = params;
// can use 'this' here which refers to the api
});
Attach a handler to an event. The handler is executed at most once.
Return value : api
Parameters:
event Name : String (can be either of of onSelect|onClose|onOpen|onInit|onChange|onDestroy)
handler : function
Example
api.one('onSelect',function({currentSelectedTabId , perviousSelectedTabId}){
// can use 'this' here which refers to the api
});
Remove an event handler.
Return value : api
Parameters:
event Name : String (can be either of of onSelect|onClose|onOpen|onInit|onChange|onDestroy)
handler : function (A handler function previously attached for the event)
Example
const onSelectHandler = function(params){
const {currentSelectedTabId , perviousSelectedTabId} = params;
// can use 'this' here which refers to the api
this.off('onSelect', onSelectHandler);
};
api.on('onSelect', onSelectHandler);
property name | type | default value | required |
---|---|---|---|
id | string | false | |
title | string | ' ' | false |
tooltip | string | ' ' | false |
panelComponent | can be either of React Element or React Component | false | |
closable | boolean | true | false |
iconClass | string | ' ' | false |
disable | boolean | false | false |
Example
const tabData = {
id: 'contactID',
title: 'contactTitle',
tooltip: 'contactTooltip',
disable: true,
iconClass : 'fa fa-home',
closable: false,
panelComponent: porps => <p> contact content </p>
};
const [ TabList , PanelList , api ] = useDynTabs( { tabs : [tabData] } );
// or
if(api.isOpen(tabData.id) == false ){
api.open(tabData).then(()=>{});
}
upcoming...
react-dyn-tabs does not include any style loading by default. Default stylesheets and themes are provided and can be included in your application if desired.
import 'react-dyn-tabs/style/react-dyn-tabs.css';
import 'react-dyn-tabs/themes/default.css';
$ npm run test
MIT