快速搭建fineui开发环境。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

134 lines
3.4 KiB

import { ButtonGroup } from '@fui/core';
import { shortcut } from '@core/decorator';
import { NavItem } from './item/item';
import './nav.less';
// 导航选项信息
export interface NavItemInfo {
value: string;
text: string;
closable: boolean;
}
// 导航选项风格
export enum NavItemStyle {
Block,
Underline,
}
// 导航选项风格与class的映射关系
export const NAV_ITEM_STYLE_CLASSES_MAP = {
[NavItemStyle.Block]: 'bi-list-item-select',
[NavItemStyle.Underline]: 'app-list-item-underline',
};
@shortcut()
export class Nav extends BI.Widget {
static xtype = 'app.base.nav';
static EVENT = {
CHANGE: 'EVENT_CHANGE',
CLOSE: 'EVENT_CLOSE',
};
public props: NavProps = {
baseCls: 'app-base-nav',
height: 36,
value: '',
itemInfos: [],
itemStyle: NavItemStyle.Block,
};
private navRef: ButtonGroup;
/**
* 获取导航菜单选项组件集合
* @returns 导航菜单选项组件集合
*/
private getNavItems(): NavItem[] {
const { height, itemInfos, itemStyle } = this.options;
return BI.map(itemInfos, (_index, itemInfo) => {
const { value, text, closable } = itemInfo;
return (
<NavItem
height={height}
value={value}
text={text}
closable={closable}
style={itemStyle}
listeners={[
{
eventName: NavItem.EVENT.CLOSE,
action: value => {
this.fireEvent(Nav.EVENT.CLOSE, value);
},
},
]}
/>
);
});
}
/**
* 设置itemInfos,并根据其值更新navRef
* @param itemInfos 要设置的itemInfos
*/
public setItemInfos(itemInfos: NavItemInfo[]) {
this.options.itemInfos = itemInfos;
const navItems = this.getNavItems();
this.navRef.populate(navItems);
}
/**
* 设置itemStyle,并根据其值更新navRef
* @param itemStyle 要设置的itemStyle
*/
public setItemStyle(itemStyle: NavItemStyle) {
this.options.itemStyle = itemStyle;
const navItems = this.getNavItems();
this.navRef.populate(navItems);
}
/**
* 设置value
* @param value 要设置的value值
*/
public setValue(value: string) {
this.options.value = value;
this.navRef.setValue(value);
}
public render() {
const { value } = this.options;
const navItems = this.getNavItems();
return (
<BI.ButtonGroup
ref={ref => {
this.navRef = ref;
}}
layouts={[<BI.VerticalAdaptLayout />]}
listeners={[
{
eventName: BI.ButtonGroup.EVENT_CHANGE,
action: value => {
this.fireEvent(Nav.EVENT.CHANGE, value);
},
},
]}
items={navItems}
value={value}
/>
);
}
}
interface NavProps {
baseCls: string;
height: number;
value: string;
itemInfos: NavItemInfo[];
itemStyle: NavItemStyle;
}