ant-design-vue/components/vc-tabs/src/TabBarTabsNode.jsx

84 lines
2.6 KiB
Vue

import warning from 'warning';
import PropTypes from '../../_util/vue-types';
import BaseMixin from '../../_util/BaseMixin';
import { getComponent, getPropsData } from '../../_util/props-util';
import { isVertical } from './utils';
import createRefHooks from '../../_util/createRefHooks';
function noop() {}
export default {
name: 'TabBarTabsNode',
mixins: [BaseMixin],
props: {
activeKey: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
panels: PropTypes.any.def([]),
prefixCls: PropTypes.string.def(''),
tabBarGutter: PropTypes.any.def(null),
onTabClick: PropTypes.func,
saveRef: PropTypes.func.def(noop),
getRef: PropTypes.func.def(noop),
renderTabBarNode: PropTypes.func,
tabBarPosition: PropTypes.string,
direction: PropTypes.string,
},
render() {
const {
panels: children,
activeKey,
prefixCls,
tabBarGutter,
saveRef,
tabBarPosition,
direction,
} = this.$props;
const rst = [];
const renderTabBarNode = this.renderTabBarNode || this.$slots.renderTabBarNode;
children.forEach((child, index) => {
if (!child) {
return;
}
const props = getPropsData(child);
const key = child.key;
let cls = activeKey === key ? `${prefixCls}-tab-active` : '';
cls += ` ${prefixCls}-tab`;
const events = {};
const disabled = props.disabled;
if (disabled) {
cls += ` ${prefixCls}-tab-disabled`;
} else {
events.onClick = () => {
this.__emit('tabClick', key);
};
}
const tab = getComponent(child, 'tab');
let gutter = tabBarGutter && index === children.length - 1 ? 0 : tabBarGutter;
gutter = typeof gutter === 'number' ? `${gutter}px` : gutter;
const marginProperty = direction === 'rtl' ? 'marginLeft' : 'marginRight';
const style = {
[isVertical(tabBarPosition) ? 'marginBottom' : marginProperty]: gutter,
};
warning(tab !== undefined, 'There must be `tab` property or slot on children of Tabs.');
let node = (
<div
role="tab"
aria-disabled={disabled ? 'true' : 'false'}
aria-selected={activeKey === key ? 'true' : 'false'}
{...events}
class={cls}
key={key}
style={style}
{...createRefHooks(activeKey === key ? saveRef('activeTab') : noop)}
>
{tab}
</div>
);
if (renderTabBarNode) {
node = renderTabBarNode(node);
}
rst.push(node);
});
return <div {...createRefHooks(this.saveRef('navTabsContainer'))}>{rst}</div>;
},
};