前言

本示例主要介紹多重篩選場景,利用數組方法過濾滿足條件的數據,利用LazyForEach實現列表信息的渲染以及刷新。

效果圖預覽

HarmonyOS應用開發:多重篩選_數據

使用説明

  1. 等待列表數據全部加載完成後,點擊篩選類型,展開篩選數據。
  2. 選中想要篩選的數據,點擊確認,列表刷新。
  3. 再次點開篩選類型,保留上次篩選的內容,點擊重置篩選內容復原,列表數據恢復為未篩選前的數據。

實現思路

本例涉及的關鍵特性和實現方案如下:

使用Grid實現篩選條件佈局。

Grid() {
  ForEach(this.item.options, (options: string, idx: number) => {
    GridItem() {
      Text(options)
        .textAlign(TextAlign.Center)
        .fontSize(16)
        .height(40)
        .width('100%')
    }
      ...
  })
}
.columnsTemplate('1fr 1fr 1fr')
  .rowsGap(16)
  .columnsGap(16)
  .margin({
    left: 16,
    right: 6,
    top: 8,
    bottom: 8
  })
  .layoutDirection(GridDirection.Row)
  .constraintSize({
    minHeight: '15%',
    maxHeight: '15%'// grid會撐滿maxHeight,先限定死高度
  })
  1. 使用數組方法對篩選數據進行過濾,得到篩選數據。
GridItem() {
  Text(options)
    .textAlign(TextAlign.Center)
    .fontSize(16)
    .height(40)
    .width('100%')
}
.onClick(() => {
  if (this.item.selectItem.includes(idx)) {
    let index = this.item.selectItem.indexOf(idx);
    let listIdx = this.changData.indexOf(options);
    // 刪除已存在的篩選數據的index值
    this.item.selectItem.splice(index, 1);
    // 過濾出來沒有重複數據的篩選值
    this.changData = this.changData.filter(i => i !== options);
    this.selectArr = this.item.selectItem;
    // 刪除已選擇的數據的行數index數組
    this.arrayListData.splice(listIdx, 1);
  } else {
    // 添加篩選數據的index值
    this.item.selectItem.push(idx);
    // 添加選中的數據
    this.changData.push(options);
    this.selectArr = this.item.selectItem;
    // 添加選擇的數據的行數index數組
    this.arrayListData.push(this.listIndex);
  }
})
  1. 得到篩選的數據後根據點擊的篩選數據行數,使用has進行if判斷看是否滿足多重篩選的條件。
Button('確認')
  .height(40)
  .width(150)
  .backgroundColor(Color.White)
  .fontColor('#333')
  .onClick(() => {
    this.isShow = false;
    let arrayListData = new Set(this.arrayListData)
    if (arrayListData.has(0) && !arrayListData.has(1)) {
      // 僅選擇停放時間
      this.siteList.timeMultiFilter(this.changData);
    } else if (!arrayListData.has(0) && arrayListData.has(1)) {
      // 僅選擇套餐類型
      this.siteList.typeMultiFilter(this.changData);
    } else if (!arrayListData.has(0) && !arrayListData.has(1) && arrayListData.has(2)) {
      // 僅選擇充電
      this.siteList.getInitalList();
    } else if (this.changData.length === 0) {
      // 未對數據進行選擇
      this.siteList.getInitalList();
    } else {
      // 多重篩選
      this.siteList.multiFilter(this.changData);
    }
    if (this.siteList.totalCount() === 0) {
      this.siteList.getInitalList();
      promptAction.showToast({ message: "未找到相關數據" });
    }
  })
  1. 使用filter過濾出來符合條件的數據,篩選出來的數組構建一個新的Set,使用Set中的has判斷列表中相關數據是否存在。
public multiFilter(changData: Array<string>) {
  let siteListString: string | undefined = AppStorage.get('siteList')
  if (siteListString) {
    let siteListObject: SiteListDataSource | undefined = JSON.parse(siteListString)
    if (siteListObject === undefined) {
      return
    }
    this.initialSiteList = siteListObject.dataList
    this.dataList = []
    this.dataList = this.initialSiteList
    // 篩選數據
    let changDataSet = new Set(changData)
    let dataList: SiteItem[] = this.dataList.filter(item => {
      item.siteBale = item.siteBale.filter(item => {
        if ((item.time && item.type) && (changDataSet.has(item.time)) && (changDataSet.has(item.type))) {
          return item
        }
        return
      })
      return item.siteBale
    })
    dataList = dataList.filter(item => item.siteBale.length !== 0);
    this.dataList = [];
    this.dataList = dataList;
    this.notifyDataReload();
  }
}
  1. 使用深拷貝保留原數據。
/**
 * 返回原數組
 */
public getInitalList() {
  let siteListString: string | undefined = AppStorage.get('siteList');
  if (siteListString) {
    let siteListObject: SiteListDataSource | undefined = JSON.parse(siteListString);
    if (siteListObject === undefined) {
      return;
    }
    this.initialSiteList = siteListObject.dataList;
    this.dataList = [];
    this.dataList = this.initialSiteList;
    this.notifyDataReload();
  }
}

如果您想系統深入地學習 HarmonyOS 開發或想考取HarmonyOS認證證書,歡迎加入華為開發者學堂:

請點擊→:  HarmonyOS官方認證培訓

HarmonyOS應用開發:多重篩選_數據_02