TopNavigationComponent.ets 2.52 KB
import { GroupDTO, TopNavBean } from 'wdBean';
import { LazyDataSource, Logger } from 'wdKit';
import { PageComponent } from './PageComponent';

const TAG = 'TopNavigationComponent';

/**
 * 顶部页签导航栏/顶导
 */
@Component
export struct TopNavigationComponent {
  // 顶导当前选中/焦点下标
  @State currentTopNavSelectedIndex: number = 0;
  // 顶导数据
  @State @Watch('onTopNavigationDataUpdated') topNavList: TopNavBean[] = []
  @State groupList: LazyDataSource<GroupDTO> = new LazyDataSource();
  readonly MAX_LINE: number = 1;

  build() {
    Tabs() {
      ForEach(this.topNavList, (navItem: TopNavBean, index: number) => {
        TabContent() {
          PageComponent({ groupList: this.groupList, currentTopNavSelectedIndex:index})
        }
        .tabBar(this.tabBarBuilder(navItem, index))
      }, (navItem: TopNavBean) => JSON.stringify(navItem));
    }
    .barHeight($r('app.float.top_tab_bar_height'))
    .barMode(BarMode.Scrollable)
    .vertical(false)
    .onChange((index: number) => {
      Logger.info(TAG, `onChange index : ${index}`);
      this.currentTopNavSelectedIndex = index;
    })
  }

  @Builder
  tabBarBuilder(item: TopNavBean, index: number) {
    Column() {
      Text(item.name)
        .fontSize(this.currentTopNavSelectedIndex === index ? $r('app.float.selected_text_size') : $r('app.float.normal_text_size'))
        .fontWeight(this.currentTopNavSelectedIndex === index ? FontWeight.Bold : FontWeight.Normal)
        .fontColor(Color.Black)
        .padding({ top: $r('app.float.top_tab_item_padding_top') })
        .maxLines(this.MAX_LINE)
      Divider()
        .width(16)
        .strokeWidth(2) // 分割线粗细度。
        .padding({top:2})
        .color(Color.Red)
        .opacity(this.currentTopNavSelectedIndex === index ? 1 : 0)
    }
    .hoverEffect(HoverEffect.Highlight)
    .constraintSize({
      minWidth: $r('app.float.top_tab_item_min_width'),
      maxWidth: $r('app.float.top_tab_item_max_width')
    })
    // .backgroundColor(Color.Black)
    .padding({
      left: $r('app.float.top_tab_item_padding_horizontal'),
      right: $r('app.float.top_tab_item_padding_horizontal'),
      bottom: $r('app.float.top_tab_item_padding_bottom')
    })
    .id(`col_tabBar${index}`)
  }

  aboutToAppear() {
    Logger.info(TAG, `aboutToAppear this.topNavList : ${JSON.stringify(this.topNavList)}`);
  }

  onTopNavigationDataUpdated() {
    Logger.info(TAG, `onTopNavigationDataUpdated currentTopNavIndex: ${this.currentTopNavSelectedIndex},topNavList.length:${this.topNavList.length}`);
  }
}