HarmonyOS 級聯(lián)選擇器

項(xiàng)目鏈接:https://gitee.com/hyhe/cascade-selector.git

一笛质、項(xiàng)目介紹

適用地址選擇等多級選擇功能,demo支持六層捞蚂。

1妇押、效果圖展示

cascadeSelector.png

2、文件介紹

cascadeSelectorFile.png

二姓迅、選擇器調(diào)用示例

1敲霍、數(shù)據(jù)模擬

initData() {
    this.datas = [
      { code: "1", name: "1", isSelected: true, selectIndex: 0, subModels: [
        { code: "1", name: "1", isSelected: true, selectIndex: 0, subModels: [
          { code: "1", name: "1", isSelected: true, selectIndex: 0, subModels: [
            { code: "1", name: "1", isSelected: true, selectIndex: 0, subModels: [
              { code: "1", name: "1", isSelected: true, selectIndex: 0, subModels: [
                { code: "1", name: "1", isSelected: true, selectIndex: 0, subModels: []}
              ]}
            ]}
          ]},
          {
            code: "2", name: "2", isSelected: false, selectIndex: 1, subModels: [
              { code: "2", name: "2", isSelected: false, selectIndex: 1, subModels: [
                { code: "2", name: "2", isSelected: false, selectIndex: 1, subModels: []}
              ]}
            ]
          },
          {
            code: "3", name: "3", isSelected: false, selectIndex: 2, subModels: [
              {
                code: "3", name: "3", isSelected: false, selectIndex: 2, subModels: [
                  { code: "3", name: "3", isSelected: false, selectIndex: 2, subModels: [
                    { code: "3", name: "3", isSelected: false, selectIndex: 2, subModels: []}
                  ]}
                ]
              }
            ]
          }
        ]},
      ]}
    ]
  }

2、選擇器調(diào)用示例

Stack() {
        Column(){
          Text(JSON.stringify(this.selectDatas)).fontSize(26).fontColor(BlackColor).width("100%").height(50).textAlign(TextAlign.Center)
        }.width("100%").height("100%").backgroundColor(OrangeColor).zIndex(1)
          .onClick(() => {
            this.alertZIndex = 99
          })
        BaseCascadeSelector({ models: this.datas, headerModels: this.selectDatas, alertZIndex: this.alertZIndex, listItemBuilder:(item: BaseCascadeSelectorModel, pageIndex: number, itemIndex: number, tapCallBack: () => void) => {this.setListItem(item, pageIndex, itemIndex, () => {
          console.log("click")
          tapCallBack()
        })}, returnSelectDatasClosure: (selectDatas: BaseCascadeSelectorModel[]) => {
          this.selectDatas = selectDatas
        }}).zIndex(this.alertZIndex)
      }

三丁存、BaseCascadeSelector選擇器介紹

1肩杈、根據(jù)頭部數(shù)據(jù)獲取當(dāng)前頁要展示的數(shù)據(jù)

getCurrentPageDatas(index: number): Array<BaseCascadeSelectorModel> {
    if (index > this.headerModels.length) {
      return []
    }
    if (index === 0) {
      return this.models ?? []
    } else if (index == 1) {
      let selectIndex = this.headerModels[0].selectIndex ?? 0
      return this.models[selectIndex].subModels
    } else if (index == 2) {
      let selectIndexFirst = this.headerModels[0].selectIndex ?? 0
      let selectIndexSecond = this.headerModels[1].selectIndex ?? 0
      return this.models[selectIndexFirst]?.subModels[selectIndexSecond].subModels
    } else if (index == 3) {
      let selectIndexFirst = this.headerModels[0].selectIndex ?? 0
      let selectIndexSecond = this.headerModels[1].selectIndex ?? 0
      let selectIndexThree = this.headerModels[2].selectIndex ?? 0
      return this.models[selectIndexFirst].subModels[selectIndexSecond].subModels[selectIndexThree].subModels
    } else if (index == 4) {
      let selectIndexFirst = this.headerModels[0].selectIndex ?? 0
      let selectIndexSecond = this.headerModels[1].selectIndex ?? 0
      let selectIndexThree = this.headerModels[2].selectIndex ?? 0
      let selectIndexFourth = this.headerModels[3].selectIndex ?? 0
      return this.models[selectIndexFirst].subModels[selectIndexSecond].subModels[selectIndexThree].subModels[selectIndexFourth].subModels ?? []
    } else if (index == 5) {
      let selectIndexFirst = this.headerModels[0].selectIndex ?? 0
      let selectIndexSecond = this.headerModels[1].selectIndex ?? 0
      let selectIndexThree = this.headerModels[2].selectIndex ?? 0
      let selectIndexFourth = this.headerModels[3].selectIndex ?? 0
      let selectIndexFifth = this.headerModels[4].selectIndex ?? 0
      return this.models[selectIndexFirst].subModels[selectIndexSecond].subModels[selectIndexThree].subModels[selectIndexFourth].subModels[selectIndexFifth].subModels ?? []
    } else {
      return []
    }
  }

2、列表某項(xiàng)選中后當(dāng)前頁數(shù)據(jù)

dealResult(pageIndex: number, itemIndex: number) {
    let newModels: Array<BaseCascadeSelectorModel> = []
    if (pageIndex == 0) {
      newModels = this.models
    } else if (pageIndex == 1) {
      newModels = this.models[this.headerModels[0].selectIndex].subModels
    } else if (pageIndex == 2) {
      newModels = this.models[this.headerModels[0].selectIndex].subModels[this.headerModels[1].selectIndex].subModels
    } else if (pageIndex == 3) {
      newModels = this.models[this.headerModels[0].selectIndex].subModels[this.headerModels[1].selectIndex].subModels[this.headerModels[2].selectIndex].subModels
    } else if (pageIndex == 4) {
      newModels = this.models[this.headerModels[0].selectIndex].subModels[this.headerModels[1].selectIndex].subModels[this.headerModels[2].selectIndex].subModels[this.headerModels[3].selectIndex].subModels
    } else {
      newModels = this.models[this.headerModels[0].selectIndex].subModels[this.headerModels[1].selectIndex].subModels[this.headerModels[2].selectIndex].subModels[this.headerModels[3].selectIndex].subModels[this.headerModels[4].selectIndex].subModels
    }
    this.dealItemSelect(newModels, pageIndex, itemIndex)
  }

3解寝、列表選中某項(xiàng)后扩然,header顯示數(shù)據(jù)和當(dāng)前頁及后續(xù)頁數(shù)據(jù)處理

dealItemSelect(newModels: Array<BaseCascadeSelectorModel>, pageIndex: number, itemIndex: number) {
    let newSelectModels: BaseCascadeSelectorModel[] = this.headerModels.slice(0, pageIndex)
    if (newModels.length == 0) {
      newSelectModels = newSelectModels.slice(0, pageIndex)
      this.headerModels = newSelectModels
    } else {
      newModels.forEach((model, index) => {
        model.selectIndex = itemIndex
        if (index == itemIndex) {
          if (model.subModels.length > 0) {
            this.currentPageIndex = pageIndex + 1
          }
          model.isSelected = true
          newSelectModels[pageIndex] = model
        } else {
          model.isSelected = false
        }
        this.dealSubModels(model.subModels)
      })
      if (newModels[0].subModels.length > 0) {
        let newModel = new BaseCascadeSelectorModel()
        newModel.code = ""
        newModel.isSelected = true
        newModel.selectIndex = 0
        newModel.name = "請選擇"
        newSelectModels.push(newModel)
      }
      this.headerModels = newSelectModels
    }
  }

  // 將后續(xù)數(shù)據(jù)重置為默認(rèn)值
  dealSubModels(newModels: Array<BaseCascadeSelectorModel>) {
    newModels.forEach((model, index) => {
      model.isSelected = false
      model.selectIndex = 0
      this.dealSubModels(model.subModels)
    })
  }

4、頭部選中后數(shù)據(jù)處理

dealSelectData(pageIndex: number, itemIndex: number) {
    let newModels: Array<BaseCascadeSelectorModel> = []
    if (pageIndex == 0) {
      newModels = this.models[this.headerModels[0].selectIndex].subModels
    } else if (pageIndex == 1) {
      newModels = this.models[this.headerModels[0].selectIndex].subModels[this.headerModels[1].selectIndex].subModels
    } else if (pageIndex == 2) {
      newModels = this.models[this.headerModels[0].selectIndex].subModels[this.headerModels[1].selectIndex].subModels[this.headerModels[2].selectIndex].subModels
    } else if (pageIndex == 3) {
      newModels = this.models[this.headerModels[0].selectIndex].subModels[this.headerModels[1].selectIndex].subModels[this.headerModels[2].selectIndex].subModels[this.headerModels[3].selectIndex].subModels
    } else if (pageIndex == 4) {
      newModels = this.models[this.headerModels[0].selectIndex].subModels[this.headerModels[1].selectIndex].subModels[this.headerModels[2].selectIndex].subModels[this.headerModels[3].selectIndex].subModels[this.headerModels[4].selectIndex].subModels
    } else if (pageIndex == 5) {
      newModels = this.models[this.headerModels[0].selectIndex].subModels[this.headerModels[1].selectIndex].subModels[this.headerModels[2].selectIndex].subModels[this.headerModels[3].selectIndex].subModels[this.headerModels[4].selectIndex].subModels[this.headerModels[5].selectIndex].subModels
    } else {
      newModels = this.models[this.headerModels[0].selectIndex].subModels[this.headerModels[1].selectIndex].subModels[this.headerModels[2].selectIndex].subModels[this.headerModels[3].selectIndex].subModels[this.headerModels[4].selectIndex].subModels[this.headerModels[5].selectIndex].subModels[this.headerModels[6].selectIndex].subModels
    }
    let newSelectModels: BaseCascadeSelectorModel[] = this.headerModels.slice(0, pageIndex)
    if (newModels.length == 0) {
      this.headerModels = newSelectModels
    } else {
      newModels.forEach((model, index) => {
        if (index == itemIndex) {
          model.isSelected = true
          model.selectIndex = itemIndex
        } else {
          model.isSelected = false
        }
        this.dealSubModels(model.subModels)
      })
      let newModel = new BaseCascadeSelectorModel()
      newModel.code = ""
      newModel.isSelected = true
      newModel.name = "請選擇"
      newSelectModels[pageIndex] = newModel
      this.headerModels = newSelectModels
    }
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末聋伦,一起剝皮案震驚了整個濱河市夫偶,隨后出現(xiàn)的幾起案子界睁,更是在濱河造成了極大的恐慌,老刑警劉巖兵拢,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晕窑,死亡現(xiàn)場離奇詭異,居然都是意外死亡卵佛,警方通過查閱死者的電腦和手機(jī)杨赤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來截汪,“玉大人疾牲,你說我怎么就攤上這事⊙媒猓” “怎么了阳柔?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蚓峦。 經(jīng)常有香客問我舌剂,道長,這世上最難降的妖魔是什么暑椰? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任霍转,我火速辦了婚禮,結(jié)果婚禮上一汽,老公的妹妹穿的比我還像新娘避消。我一直安慰自己,他們只是感情好召夹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布岩喷。 她就那樣靜靜地躺著,像睡著了一般监憎。 火紅的嫁衣襯著肌膚如雪纱意。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天鲸阔,我揣著相機(jī)與錄音偷霉,去河邊找鬼。 笑死隶债,一個胖子當(dāng)著我的面吹牛腾它,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播死讹,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼瞒滴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起妓忍,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤虏两,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后世剖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體定罢,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年旁瘫,在試婚紗的時候發(fā)現(xiàn)自己被綠了祖凫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡酬凳,死狀恐怖惠况,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宁仔,我是刑警寧澤稠屠,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站翎苫,受9級特大地震影響权埠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜煎谍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一攘蔽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粱快,春花似錦秩彤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓜富。三九已至鳍咱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間与柑,已是汗流浹背谤辜。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留价捧,地道東北人丑念。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像结蟋,于是被迫代替她去往敵國和親脯倚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容