PageHome.ets 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import { EventBus } from '../utils/EventBus'
  2. import { Storage } from '../utils/Storage'
  3. import { VMHome } from '../vm/VMHome'
  4. import { TabHome } from './PageHomeComponents/TabHome'
  5. import { TabJobs } from './PageHomeComponents/TabJobs'
  6. import { TabTasks } from './PageHomeComponents/TabTasks'
  7. import { TabSettings } from './PageHomeComponents/TabSettings'
  8. @Entry
  9. @Component
  10. struct PageHome {
  11. @State vm: VMHome = new VMHome()
  12. aboutToAppear(): void {
  13. const ctx = this.getUIContext()
  14. const router = ctx.getRouter()
  15. EventBus.on("EVENT_LOGOUT", () => {
  16. // 先解绑事件,再处理退出登录操作
  17. EventBus.off("EVENT_LOGOUT")
  18. // 标记当前账号为未登录状态
  19. Storage.setLogin(false)
  20. router.clear()
  21. router.replaceUrl({ url: "pages/PageLogin" }).catch()
  22. })
  23. }
  24. aboutToDisappear(): void {
  25. EventBus.off("EVENT_LOGOUT")
  26. }
  27. build() {
  28. Tabs({ barPosition: BarPosition.End, index: this.vm.tabIndex }) {
  29. TabContent() {
  30. TabHome({ vm: this.vm })
  31. }
  32. .tabBar(this.TabBuilder({
  33. label: "首页",
  34. icon: $r('app.media.home'),
  35. select: this.vm.tabIndex == 0,
  36. num: 0
  37. }))
  38. .clip(false)
  39. TabContent() {
  40. TabJobs({ vm: this.vm })
  41. }
  42. .tabBar(this.TabBuilder({
  43. label: "作业",
  44. icon: $r('app.media.jobs'),
  45. select: this.vm.tabIndex == 1,
  46. num: this.vm.jobProgressCount
  47. }))
  48. .clip(false)
  49. TabContent() {
  50. TabTasks({ vm: this.vm })
  51. }
  52. .tabBar(this.TabBuilder({
  53. label: "任务",
  54. icon: $r('app.media.tasks'),
  55. select: this.vm.tabIndex == 2,
  56. num: this.vm.taskProgressCount
  57. }))
  58. .clip(false)
  59. TabContent() {
  60. TabSettings({ vm: this.vm })
  61. }
  62. .tabBar(this.TabBuilder({
  63. label: "设置",
  64. icon: $r('app.media.settings'),
  65. select: this.vm.tabIndex == 3,
  66. num: 0
  67. }))
  68. .clip(false)
  69. }
  70. .width('100%')
  71. .height('100%')
  72. .barMode(BarMode.Fixed)
  73. .divider({ color: "#EEEEEE", strokeWidth: 1 })
  74. .scrollable(false)
  75. .animationMode(AnimationMode.NO_ANIMATION)
  76. .onChange((index: number) => {
  77. // 该方法实现双向绑定,以处理非用户点击导致的导航栏变化
  78. this.vm.updateTabIndex(index)
  79. })
  80. .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP])
  81. }
  82. @Builder
  83. TabBuilder(tab: HomeTabItem) {
  84. Stack() {
  85. Column() {
  86. Image(tab.icon).width(20).height(20).fillColor(tab.select ? "#1E90FF" : "#333333")
  87. Text(tab.label)
  88. .fontSize(12)
  89. .fontColor(tab.select ? "#1E90FF" : "#333333")
  90. .margin({ top: 5 })
  91. }.width("100%").height("100%").justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center)
  92. Text(tab.num > 99 ? "99+" : `${tab.num}`)
  93. .backgroundColor("#FF4500")
  94. .borderRadius("50%")
  95. .fontColor(Color.White)
  96. .fontSize(10)
  97. .padding({ left: 3, right: 3 })
  98. .position({ top: 2, left: "55%" })
  99. .constraintSize({ minWidth: 15, minHeight: 15 })
  100. .textAlign(TextAlign.Center)
  101. .visibility(tab.num <= 0 ? Visibility.Hidden : Visibility.Visible)
  102. }.width("100%").height(56)
  103. }
  104. }
  105. class HomeTabItem {
  106. public label: string = ""
  107. public icon: ResourceStr | undefined = undefined
  108. public select: boolean = false
  109. public num: number = 0
  110. }