日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

ArkUI如何實現增刪Tab頁簽

來源: 責編: 時間:2024-05-16 09:00:50 196觀看
導讀部分應用在使用過程中需要自定義添加或刪除標簽的場景,比如在瀏覽器中的頂部標簽欄中需要新打開或關閉網頁頁簽,而這種場景與Tabs組件效果類似,但Tabs組件不提供增加或刪除頁簽的功能,不能自由的增加刪除頁簽,需要開發者自

X7d28資訊網——每日最新資訊28at.com

部分應用在使用過程中需要自定義添加或刪除標簽的場景,比如在瀏覽器中的頂部標簽欄中需要新打開或關閉網頁頁簽,而這種場景與Tabs組件效果類似,但Tabs組件不提供增加或刪除頁簽的功能,不能自由的增加刪除頁簽,需要開發者自己實現Tabs中增刪頁簽功能。本文以瀏覽器中增加或刪除頁簽為例,實現Tabs中頁簽的增刪功能。X7d28資訊網——每日最新資訊28at.com

效果呈現

如下動圖所示:X7d28資訊網——每日最新資訊28at.com

圖片X7d28資訊網——每日最新資訊28at.com

環境要求

本例基于以下環境開發,開發者也可以基于其他適配的版本進行開發:X7d28資訊網——每日最新資訊28at.com

  • IDE: DevEco Studio 4.0 Release
  • SDK: Ohos_sdk_public 4.0.10.13 (API Version 10 Release)

實現原理

本例涉及的關鍵特性以及實現方案如下:X7d28資訊網——每日最新資訊28at.com

  • 通過@Builder自定義封裝一個導航頁簽欄,并通過ForEach完成對Tabs組件的內容頁和導航頁簽欄的動態渲染。
  • 通過TabsController的changeIndex可實現頁面的跳轉,傳入的index是數組中對應的索引值。
  • 頁簽的增加通過數組的push方法,增加數組元素。
  • 刪除頁簽通過通過刪除頁面對應數組的索引值處的數據完成,刪除后頁面跳轉位置根據業務邏輯要求確定跳轉頁面對應的索引值。

開發步驟

整體布局分為兩部分:頁面內容和頁簽部分。頁面視圖部分使用Tabs,其中頁簽對應顯示的內容需要放入TabContent組件中。頁簽部分通過@Builder自定義封裝一個tabBar組件,放入Tabs中的tabBar屬性中。X7d28資訊網——每日最新資訊28at.com

頁面視圖代碼塊:X7d28資訊網——每日最新資訊28at.com

Tabs({ barPosition: BarPosition.Start, controller: this.controller }) {  ForEach(this.tabArray, (item: number) => {    TabContent() {      Text('我是頁面 ' + item + " 的內容")        .height('100%')        .width('100%')        .fontSize(30)        .backgroundColor("#ffffffff")    }.tabBar(this.Tab(item))  }, (item: number) => item.toString() + util.generateRandomUUID())}.barMode(BarMode.Scrollable, { margin: 30 }).onChange((index) => {  this.focusIndex = index}).barHeight(30)

自定義tabBar代碼塊:X7d28資訊網——每日最新資訊28at.com

//控制頁簽渲染的數組@State tabArray: Array<number> = [0]//Tabs組件當前顯示的頁簽@State focusIndex: number = 0//創建頁簽時的頁簽index@State pre: number = -1//Tabs組件控制器,根據組件下標控制tab跳轉private controller: TabsController = new TabsController()//自定義導航頁簽欄@BuilderTab(tabNumber: number) {  Row({ space: 20 }) {    Text("頁簽 " + tabNumber).fontSize(18)    Image($r('app.media.ic_public_cancel_filled')).width(20).height(20)  }  .justifyContent(FlexAlign.Center)  .constraintSize({ minWidth: 35 })  .width(120)  .height(30)  .borderRadius({ topLeft: 10, topRight: 10 })  .backgroundColor(this.tabArray.indexOf(tabNumber) === this.focusIndex ? "#ffffffff" : "#ffb7b7b7")}

實現頁簽和頁面視圖的聯動:這里主要通過TabsController的changeIndex來實現對應的試圖跳轉,但需要注意由于之后會增刪數組元素的操作,所以此處傳入的index值是選擇頁面的tabNumber在數組中的索引值。X7d28資訊網——每日最新資訊28at.com

this.focusIndex = this.tabArray.indexOf(tabNumber)

增添數組元素實現增加頁簽的效果:增添數組元素使用數組的push方法在tabArray添加數據即可,但由于此demo原始定義的數組是連續的自然數,后續增刪數組會打亂原有順序,所以此處處理為先判斷最后一個元素的值再加1,由于TabBar的渲染是通過ForEach被@State修飾的數組,因此當tabArray中添加數據后系統會通知ForEach便利數組重新渲染頁面。X7d28資訊網——每日最新資訊28at.com

this.tabArray.push(this.tabArray[this.tabArray.length - 1] + 1)

通常在添加新頁面后,瀏覽器會將頁面跳轉到新添加的頁面,因此在向tabArray中完成數據推送后,需要將頁簽通過TabsController中的changeIndex方法跳轉到最后一個。X7d28資訊網——每日最新資訊28at.com

this.focusIndex = this.tabArray.length - 1this.controller.changeIndex(this.focusIndex)

當用戶選擇另一個頁簽時,可通過自定義頁簽中通用事件onClick進行控制,當用戶點擊待選擇的頁簽后,獲取當前頁簽對應的下標,然后通過TabsController中的changeIndex方法進行跳轉,此外可以通過更改頁簽背景顏色標識被選中頁簽的。X7d28資訊網——每日最新資訊28at.com

.backgroundColor(this.tabArray.indexOf(tabNumber) === this.focusIndex ? "#ffffffff" : "#ffb7b7b7").onClick(() => {  this.focusIndex = this.tabArray.indexOf(tabNumber)  this.controller.changeIndex(this.focusIndex)})

刪除頁面有三種情況(刪除不同位置的頁面)。X7d28資訊網——每日最新資訊28at.com

  • 第一種情況是被關閉頁面為最后一個頁面,且當前選中的頁面為最后一個頁面,如果當前被選中頁面是剛剛被其他頁面創建的情況,因此頁面需要跳回到創建被刪除頁簽的頁簽(邏輯參考chrome瀏覽器)
if (this.pre >= 0) {  this.focusIndex = this.pre} this.tabArray.splice(this.tabArray.indexOf(tabNumber), 1)

如果不是的話直接將當前顯示頁簽下下標設置為前一個頁簽下標,tabArray數組通過splice方法刪除頁簽,并通過TabsController完成跳轉,此外頁面只要有關閉操作,頁面就不可以跳回打開該頁面的頁面,即將 pre設置為-1。X7d28資訊網——每日最新資訊28at.com

this.focusIndex = this.focusIndex - 1this.tabArray.splice(this.tabArray.indexOf(tabNumber), 1)this.pre = -1this.controller.changeIndex(this.focusIndex)
  • 第二種情況,當用戶當前選擇的不是最后一個標簽,然后直接刪除其他頁簽時,可以直接刪除刪除,但是需要重新計算當前選中頁簽在tabArray中的實時位置,到新注意需要排除用戶在最后一個頁簽刪除當前頁簽的情況。
//當前選擇頁面的對應數組中的數據值let focusNumber = this.tabArray[this.focusIndex]//用于判斷是否是用戶在最后一個頁簽刪除當前頁簽的情況if (this.tabArray.indexOf(focusNumber) >= 0) {  this.focusIndex = this.tabArray.indexOf(focusNumber)}this.controller.changeIndex(this.focusIndex)
  • 第三種情況,當用戶當前選擇的不是最后一個標簽,且刪除被選中頁面,直接刪除,然后通過TabsController完成跳轉,不需要額外操作。

說明

  • 由于Tabs組件中的導航頁簽欄會占滿屏幕,導致添加按鈕無法直接添加到與頁簽直接平齊的位置,因此通過層疊布局(Stack)的方式,將添加頁簽按鈕覆蓋到Tabs組件上,通過Stack中的對齊方式將添加按鈕調整到合適位置。
  • 用于Tabs添加或刪除子節點時,ForEach需要重新將所有頁簽進行重新渲染,如果在添加或刪除完頁簽后直接調用TabsController中的changeIndex進行跳轉,頁面無法調到指定頁簽。這是由于ForEach還未將組件渲染完成,將子組件掛載到Tabs中,因此建議通過setTimeOut延遲一段時間再進行跳轉,經過驗證大概50ms后即可,開發者可再自行驗證。
setTimeout(() => {  this.controller.changeIndex(this.focusIndex)}, 50)

完整實例

完整示例代碼如下:

import util from '@ohos.util'@Entry@Componentstruct Drag {  //控制頁簽渲染的數組  @State tabArray: Array<number> = [0]  //Tabs組件當前顯示的頁簽下標  @State focusIndex: number = 0  //創建頁簽時的頁簽index  @State pre: number = -1  //Tabs組件控制器,根據組件下標控制tab跳轉  private controller: TabsController = new TabsController()  // 單獨的頁簽  @Builder  Tab(tabNumber: number) {    Row({ space: 20 }) {      Text("頁簽 " + tabNumber).fontSize(18)      Image($r('app.media.ic_public_cancel_filled')).width(20).height(20).onClick(() => {        //獲取Tabs組件當前顯示的頁簽中顯示的數字        let focusNumber = this.tabArray[this.focusIndex]        //被刪除的頁簽是否是當前選中的頁簽,且是最后一個頁簽        if (this.focusIndex === this.tabArray.indexOf(tabNumber) && this.focusIndex == this.tabArray.length - 1) {          //判斷是否需要跳回到創建該頁簽時的頁簽,如果不需要直接跳轉到前一個頁簽          if (this.pre >= 0) {            this.focusIndex = this.pre          } else {            this.focusIndex = this.focusIndex - 1          }        }        this.tabArray.splice(this.tabArray.indexOf(tabNumber), 1)        this.pre = -1        //對應刪除頁面中的第二種情況        if (this.tabArray.indexOf(focusNumber) >= 0) {          this.focusIndex = this.tabArray.indexOf(focusNumber)        }        //設置50ms 延遲跳轉        setTimeout(() => {          this.controller.changeIndex(this.focusIndex)        }, 50)      })    }    .justifyContent(FlexAlign.Center)    .constraintSize({ minWidth: 35 })    .width(120)    .height(30)    .borderRadius({ topLeft: 10, topRight: 10 })    .backgroundColor(this.tabArray.indexOf(tabNumber) === this.focusIndex ? "#ffffffff" : "#ffb7b7b7")    .onClick(() => {      this.focusIndex = this.tabArray.indexOf(tabNumber)      setTimeout(() => {        this.controller.changeIndex(this.focusIndex)      }, 50)    })  }  build() {    Column() {      Column() {        // 頁簽        // Row() {        Stack() {          Row({ space: 7 }) {            //tabs            Tabs({ barPosition: BarPosition.Start, controller: this.controller }) {              ForEach(this.tabArray, (item: number) => {                TabContent() {                  Text('我是頁面 ' + item + " 的內容")                    .height('100%')                    .width('100%')                    .fontSize(30)                    .backgroundColor("#ffffffff")                }.tabBar(this.Tab(item))              }, (item: number) => item.toString() + util.generateRandomUUID())            }            .barMode(BarMode.Scrollable, { margin: 30 })            .onChange((index) => {              this.focusIndex = index            })            .barHeight(30)          }.width("100%")          Row() {            Image($r('app.media.ic_public_add_filled')).onClick(() => {              if (this.tabArray.length === 0) {                this.tabArray.push(0)                this.focusIndex = this.tabArray.length - 1              } else {                this.pre = this.focusIndex                this.tabArray.push(this.tabArray[this.tabArray.length - 1] + 1)                this.focusIndex = this.tabArray.length - 1              }              setTimeout(() => {                this.controller.changeIndex(this.focusIndex)              }, 50)            }).width(20).height(20)          }.height(30).width(30).backgroundColor("#ffb7b7b7")          .justifyContent(FlexAlign.Center)        }        .alignContent(Alignment.TopEnd)        .width('100%')        .backgroundColor("#ffb7b7b7")      }      .alignItems(HorizontalAlign.Start)      .width('100%')    }    .height('100%')  }}

本文鏈接:http://m.www897cc.com/showinfo-26-88313-0.htmlArkUI如何實現增刪Tab頁簽

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: SpringBoot項目中這10個開發技巧你都知道嗎?

下一篇: 盤點GoLang中的三方庫:fsnotify、Viper、Logrus、Carbon

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
91久久精品一区二区三区| 国产精品资源| 免费欧美日韩国产三级电影| 欧美不卡在线| 欧美天堂在线观看| 国产美女精品一区二区三区| 永久91嫩草亚洲精品人人| 亚洲精选国产| 午夜精品一区二区三区在线视 | 欧美成人精品| 欧美mv日韩mv国产网站| 欧美亚韩一区| 一区二区在线不卡| 一本色道久久综合亚洲精品婷婷| 欧美永久精品| 欧美久久精品午夜青青大伊人| 国产精品久久久久久久app| 一区二区在线观看视频在线观看| 9i看片成人免费高清| 欧美综合国产精品久久丁香| 免费欧美日韩国产三级电影| 国产精品天天看| 91久久一区二区| 性欧美精品高清| 欧美极品aⅴ影院| 国产一区久久| 夜夜嗨av一区二区三区网页| 久久久亚洲精品一区二区三区| 欧美日韩一区二| 136国产福利精品导航网址应用| 亚洲尤物视频网| 欧美韩国日本综合| 国产一区二区三区黄| 夜夜躁日日躁狠狠久久88av| 久久久噜久噜久久综合| 国产精品国产三级国产专播精品人 | 91久久精品国产| 欧美一级午夜免费电影| 欧美理论电影在线播放| 在线不卡视频| 欧美中文字幕视频| 国产精品九九| 亚洲人成77777在线观看网| 久久国产精品第一页| 国产精品成人在线| 亚洲日本成人网| 久久频这里精品99香蕉| 国产欧美一区二区精品性| 一区二区日韩精品| 欧美激情精品久久久久久大尺度| 国产在线不卡精品| 欧美一级视频精品观看| 国产精品久久久久久久久婷婷| 亚洲人午夜精品| 麻豆精品精品国产自在97香蕉| 国产日韩欧美在线一区| 亚洲综合三区| 国产精品扒开腿爽爽爽视频| 日韩五码在线| 欧美激情综合在线| 亚洲经典三级| 你懂的国产精品| 在线免费观看视频一区| 久久精品国亚洲| 国产一区导航| 欧美在线三区| 国产午夜精品美女视频明星a级| 一区二区三区精品国产| 欧美日韩国产三级| 亚洲免费不卡| 欧美福利在线| 亚洲精品美女91| 女生裸体视频一区二区三区| 韩国av一区二区三区| 欧美在线首页| 国产午夜精品视频免费不卡69堂| 亚洲一区二区视频| 国产精品户外野外| 亚洲欧美韩国| 国产精品爽爽ⅴa在线观看| 亚洲主播在线播放| 国产精品亚洲综合天堂夜夜 | 性欧美激情精品| 国产精品久久久久国产a级| 亚洲少妇一区| 国产精品看片资源| 午夜老司机精品| 国产视频在线一区二区| 欧美怡红院视频| 狠狠色2019综合网| 美女网站在线免费欧美精品| 1769国产精品| 欧美另类视频在线| 宅男66日本亚洲欧美视频| 国产精品久久精品日日| 亚洲综合成人婷婷小说| 国产日韩精品久久| 久久国产一区二区三区| 经典三级久久| 欧美激情一区二区三区四区| 99re6这里只有精品视频在线观看| 欧美日韩亚洲一区三区| 亚洲欧美日韩系列| 黄色一区二区三区四区| 欧美电影在线观看| 一区二区三区视频观看| 国产精品日本欧美一区二区三区| 欧美一区二区三区久久精品| 亚洲电影免费观看高清完整版| 欧美精品精品一区| 亚洲欧美成人精品| 狠狠色综合色区| 欧美国产高清| 亚洲欧美国产精品专区久久| 国产综合色在线| 欧美精品18+| 亚洲欧美伊人| 在线观看欧美成人| 欧美三级乱码| 久久精品国产一区二区三区| 亚洲欧洲另类国产综合| 国产精品久久久久久久9999| 久久婷婷人人澡人人喊人人爽 | 久久网站免费| 日韩午夜激情| 国产婷婷色综合av蜜臀av| 欧美fxxxxxx另类| 亚洲影院在线观看| 亚洲成色最大综合在线| 欧美午夜免费影院| 欧美在线视频网站| 亚洲美女精品成人在线视频| 国产乱子伦一区二区三区国色天香| 久久一区二区三区四区| 亚洲少妇在线| 18成人免费观看视频| 欧美性猛交xxxx乱大交蜜桃| 久久人人爽国产| 亚洲校园激情| 亚洲国产天堂久久综合| 国产精品一级二级三级| 欧美大片在线影院| 午夜一级在线看亚洲| 亚洲三级免费电影| 国产视频在线观看一区| 欧美日韩国产bt| 久久女同互慰一区二区三区| 亚洲天堂网在线观看| 亚洲第一精品电影| 国产精品夜色7777狼人| 欧美精品成人在线| 久久久久高清| 亚洲综合精品一区二区| 91久久久久久久久| 国产亚洲一区在线播放| 欧美视频在线一区二区三区| 男人的天堂成人在线| 欧美在线你懂的| 亚洲视频精选| 亚洲精品国产精品国自产观看浪潮| 国产一二精品视频| 欧美亚洲成人网| 欧美激情偷拍| 久久香蕉精品| 久久不射网站| 亚洲免费视频一区二区| 99视频精品全国免费| 亚洲国产专区| 在线播放不卡| 国产综合久久久久久| 国产精品亚洲不卡a| 欧美三级不卡| 欧美另类久久久品| 欧美黄在线观看| 美女91精品| 久久久久中文| 久久久精品久久久久| 欧美一区激情| 欧美亚洲一区三区| 亚洲女同在线| 亚洲无毛电影| 亚洲视频网在线直播| 一本久道综合久久精品| 亚洲精品美女在线观看| 亚洲高清不卡在线观看| 在线观看欧美成人| 狠狠入ady亚洲精品| 国产一区二区三区在线观看精品| 国产精品视频观看| 国产精品乱子久久久久| 国产精品jvid在线观看蜜臀 | 国产精品男人爽免费视频1| 欧美日韩在线观看视频| 欧美看片网站| 欧美日韩免费精品| 欧美日韩一区综合| 欧美日韩精品一区二区三区四区| 欧美精品99| 欧美ed2k| 欧美精品久久99久久在免费线| 欧美国产精品v| 欧美激情网友自拍| 欧美另类99xxxxx| 欧美视频二区|