HarmonyOS 鸿蒙Next IDataSource的使用

发布于 1周前 作者 zlyuanteng 来自 鸿蒙OS

HarmonyOS 鸿蒙Next IDataSource的使用

demo中,当删除第0的元素的后,再次点击第一个item数据错乱。

import { BasicDataSource } from './BasicDataSource'
import { showToast } from './Toast'

@Entry
@Component
struct LazyForEachPage {
  dataSource: BasicDataSource<IModel> = new BasicDataSource()
  uuids: string[] = [
    "你好哇",
    "李银河",
    "解放军",
    "三大件",
    "世界很美好"
  ]

  addData(len: number, tips: string) {
    for (let index = 0; index < len; index++) {
      let model: IModel = {
        title: tips,
        subTitle: this.uuids[index],
        creatTime: generateUnixTimestamp().toString()
      }
      this.dataSource.pushData(model)
    }
  }

  onPageShow(): void {
    this.addData(5, "添加原始数据")
  }

  build() {
    Column() {
      Text("先删除第0个元素,在点击第0个,数据错乱")
      Row({ space: 8 }) {
        Text("数据总量")
          .fontSize(20)
          .onClick(() =>{
            showToast(`总量:${this.dataSource.totalCount()}`)
          })

        Text("删除第0个数据")
          .backgroundColor(Color.Red)
          .fontSize(20)
          .onClick(() =>{
            this.dataSource.deleteData(0)
          })

      }

      List({ space: 8 }) {
        LazyForEach(this.dataSource, (item: IModel, index: number) {

          ListItem() {
            this.createItem(item, index)
          }
          .padding(8)
          .width("100%")
          .onClick(() => {
            showToast(`  当前索引:${this.dataSource.getData(index).subTitle}`,5)
          })

        }, (item: IModel) => {
          return JSON.stringify(item)
        })
      }

    }
    .height('100%')
    .width('100%')
    .margin({ top: 20 })
  }

  @Builder
  createItem(item: IModel, index: number) {
    Column({ space: 8 }) {
      Text(item.title)
        .fontSize(20)
      Text(item.subTitle + item.creatTime)
        .fontSize(17)
    }
    .width("100%")
    .padding(8)
    .borderRadius(8)
    .backgroundColor(index % 2 === 0 ? Color.Red : Color.Orange)

  }
}

interface IModel {
  title: string,
  subTitle?: string,
  creatTime: string
}

/*
 * unix时间戳
 *
 */
export function generateUnixTimestamp(): number {
  let tamp = Math.floor(new Date().getTime());
  return tamp
}

更多关于HarmonyOS 鸿蒙Next IDataSource的使用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

LazyForEachPage.ets

import { BasicDataSource } from './BasicDataSource'
import { showToast } from './Toast'

@Entry
@Component
struct LazyForEachPage {
  dataSource: BasicDataSource<IModel> = new BasicDataSource()
  uuids: string[] = [
    "你好哇",
    "李银河",
    "解放军",
    "三大件",
    "世界很美好"
  ]

  addData(len: number, tips: string) {
    for (let index = 0; index < len; index++) {
      let model: IModel = {
        title: tips,
        subTitle: this.uuids[index],
        creatTime: generateUnixTimestamp().toString()
      }
      this.dataSource.pushData(model)
    }
  }

  onPageShow(): void {
    this.addData(5, "添加原始数据")
  }

  build() {
    Column() {
      Text("先删除第0个元素,在点击第0个,数据错乱")
      Row({ space: 8 }) {
        Text("数据总量")
          .fontSize(20)
          .onClick(() =>{
            showToast(`总量:${this.dataSource.totalCount()}`)
          })

        Text("删除第0个数据")
          .backgroundColor(Color.Red)
          .fontSize(20)
          .onClick(() =>{
            this.dataSource.deleteData(0)
          })

      }

      List({ space: 8 }) {
        LazyForEach(this.dataSource, (item: IModel, index: number) => {
          ListItem() {
            createItem({item:item,index:index})
          }
          .padding(8)
          .width("100%")

        }, (item: IModel) => {
          return JSON.stringify(item)
        })
      }
    }
    .height('100%')
    .width('100%')
    .margin({ top: 20 })
  }
}

@Component
struct createItem {

  @State item:IModel = {
    title: '',
    subTitle: '',
    creatTime: ''
  }
  @State index:number = 0
  build() {
    Column({ space: 8 }) {
      Text(this.item.title+this.index.toString())
        .fontSize(20)
      Text(this.item.subTitle + this.item.creatTime)
        .fontSize(17)
    }
    .width("100%")
    .padding(8)
    .borderRadius(8)
    .backgroundColor(this.index % 2 === 0 ? Color.Red : Color.Orange)
    .onClick(() =>{
      showToast(` 当前索引:${this.item.subTitle}`+this.index.toString(),5)
    })
  }
}

interface IModel {
  title: string,
  subTitle?: string,
  creatTime: string
}

/*
* unix时间戳
*
*/
export function generateUnixTimestamp(): number {
  let tamp = Math.floor(new Date().getTime());
  return tamp
}

更多关于HarmonyOS 鸿蒙Next IDataSource的使用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


使用IDataSource的步骤大致如下:

  1. 定义数据源:根据应用需求,定义合适的数据源类型,并实现IDataSource接口。这包括实现数据获取、数据更新等核心方法。

  2. 注册数据源:在数据能力的配置文件中,注册定义好的数据源。这样,当其他组件或应用需要访问这些数据时,就可以通过数据能力来获取。

  3. 访问数据源:通过数据能力的URI,应用可以访问到注册的数据源。开发者可以使用系统提供的API,通过URI来读取、写入或更新数据源中的数据。

需要注意的是,IDataSource的使用可能涉及到数据的安全性和隐私保护,因此在实现和访问数据源时,需要遵循相关的安全规范。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部