HarmonyOS 鸿蒙Next Map<String, Object[]> 这种怎么双向绑定

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

HarmonyOS 鸿蒙Next Map<String, Object[]> 这种怎么双向绑定

我的页面做了一个列表,但是绑定的数据发生变化页面没有反应,主要是这个@ObjectLink imgSs: ImageSource,怎么绑定这种类型

2 回复

参考数据获取赋值,组件抽离。

import router from '[@ohos](/user/ohos).router';
import ArrayList from '[@ohos](/user/ohos).util.ArrayList';
import fs from '[@ohos](/user/ohos).file.fs';
import { ListFileOptions } from '[@kit](/user/kit).CoreFileKit';
import { fileIo, fileUri } from '[@kit](/user/kit).CoreFileKit';

[@Observed](/user/Observed)
export class ImageSource{
 public myMap: MyMap<string, ImageItem[]>=new MyMap()
}

[@Observed](/user/Observed)
export class MyMap<K, V> extends Map<K, V> {
 public name: string;
 constructor(name?: string, args?: [K, V][]) {
   super(args);
   this.name = name ? name : "Inskam";
 }

 getName() {
   return this.name;
 }
}

[@Observed](/user/Observed)
class ImageItem {
 public name: string=''; //文件名
 public isSelected:boolean=false; //是否选中
}

let ImageItemArr:ImageItem[] = []
let ImageItem1:ImageItem = new ImageItem()
ImageItem1.name = 'pic01.png'
ImageItemArr.push(ImageItem1)

let ImageItem2:ImageItem = new ImageItem()
ImageItem2.name = 'pic02.png'
ImageItemArr.push(ImageItem2)

let ImageItem3:ImageItem = new ImageItem()
ImageItem3.name = 'pic03.png'
ImageItemArr.push(ImageItem3)


const group:MyMap<string, ImageItem[]>  = new MyMap()
group.set('2024-11-13',ImageItemArr)

console.log('new-group',JSON.stringify(group))

[@Entry](/user/Entry)
[@Component](/user/Component)
struct Page241112180655018 {
 [@State](/user/State) mIsEdit: boolean = false;
 [@State](/user/State) mTitleStr: string = '相册';
 [@State](/user/State) mIsPhotoMode: boolean = true;
 private mPhotoList:ArrayList<string> = new ArrayList();
 [@State](/user/State) mPhotoDayList:Array<string>=[];
 [@State](/user/State) imgSs: ImageSource = new ImageSource()

 aboutToAppear() {
   // this.initImgData();
   this.mPhotoDayList = ['2024-11-13']
   this.imgSs.myMap = group
   console.log('new-imgSs',JSON.stringify(this.imgSs))
   console.log('new-imgSs-',JSON.stringify(this.imgSs.myMap.get('2024-11-13')))
 }

 aboutToDisappear(): void {
 }

 onPageShow(): void {
 }



 /**
  * 从沙盒目录初始化文件信息
  */
 initImgData(){
   let fileOption: ListFileOptions = {
     recursion: false,
     listNum: 0,
     filter: {
       suffix: [".jpeg", ".png", ".bmp", ".jpg"]
     }
   }
   fs.listFile(getContext().filesDir, fileOption).then(data => {
     this.imgSs.myMap= this.groupImagesByDate(data);
     console.log('imgSs--',JSON.stringify(this.imgSs.myMap))
   })
 }
 /**
  * 根据文件列表进行分组
  * [@param](/user/param) imageFiles
  * [@returns](/user/returns)
  */
 groupImagesByDate(imageFiles: string[]): MyMap<string, ImageItem[]> {
   this.mPhotoList.clear();
   const groups: MyMap<string, ImageItem[]> = new MyMap();

   imageFiles.forEach(file => {
     // 从文件名中提取时间戳
     const timestamp = new Date().getTime()
     // 将时间戳转换为日期格式
     const date = new Date(timestamp);
     const yyyy = date.getFullYear();
     const mm = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始
     const dd = String(date.getDate()).padStart(2, '0');
     const formattedDate = `${yyyy}-${mm}-${dd}`;

     // 按日期进行分组
     if (!groups[formattedDate]) {
       groups[formattedDate] = [];
       this.mPhotoList.add(formattedDate);
     }
     const imgItem:ImageItem= {
       name: file,
       isSelected: false
     }
     groups[formattedDate].push(imgItem);
   });
   this.mPhotoDayList=this.mPhotoList.convertToArray() //mPhotoDayList是数组
   console.log('mPhotoDayList--',JSON.stringify(this.mPhotoDayList))
   console.log('groups--',JSON.stringify(groups))
   return groups;
 }

 build() {
   Column() {
     Row() {
       Image($r('app.media.news_more'))
         .width(40)
         .height(40)
         .padding(10)
         .margin({ left: 5 })
         .onClick(() => {
           router.back();
         })

       Text(this.mTitleStr).fontSize(18).fontWeight(500).fontColor('#333333')

       Image($r('app.media.startIcon'))
         .width(42).padding(10).margin({ right: 5 })
         .onClick(() => {
           this.switchEditMode();
         })

     }
     .width('100%').height(65)
     .justifyContent(FlexAlign.SpaceBetween)
     .margin({ top: 25 })

     List({ space: 20, initialIndex: 0 }) {
       ForEach(this.mPhotoDayList, (item: string) => {
         ListItem() {
           Column() {
             Text(item)
               .width('100%')
               .height(50)
               .fontSize(16)
               .fontColor('#333')
               .textAlign(TextAlign.Start)
             Grid() {
               ForEach(this.imgSs.myMap.get(item), (imgItem: ImageItem) => {
                 GridItem() {
                   GridItemCom({
                     item:imgItem,
                     imgSs:this.imgSs
                   })
                 }
               }, (day: string) => day)
             }
             .columnsTemplate('1fr 1fr 1fr 1fr')
             .columnsGap(10)
             .rowsGap(10)
             .width('100%')
             .margin({ top: 20, bottom: -10 })
             .height(this.imgSs ? (Math.ceil(this.imgSs.myMap.get(item)!!.length / 4) * 85): 85)
           }
         }.editable(true)
       }, (item: string) => item)
     }
     .listDirection(Axis.Vertical) // 排列方向
     .edgeEffect(EdgeEffect.None) // 滑动到边缘无效果
     .chainAnimation(false) // 联动特效关闭
     .onScrollIndex((firstIndex: number, lastIndex: number) => {
       console.info('first' + firstIndex)
       console.info('last' + lastIndex)
     })
     .editMode(this.mIsEdit)
     .width('90%')
     .height('100%')

   }
 }

 /**
  * 编辑模式切换
  */
 switchEditMode() {
   if (this.mIsEdit) {
     this.mTitleStr = '相册';
   } else {
     this.mTitleStr = '已选择';
   }
   this.mIsEdit = !this.mIsEdit;
 }

 /**
  * 切换显示数据
  */
 switchShowDataMode() {
   this.mIsPhotoMode = !this.mIsPhotoMode;
 }
}


[@Component](/user/Component)
struct GridItemCom{
 [@Prop](/user/Prop) imgSs:ImageSource
 [@ObjectLink](/user/ObjectLink) item:ImageItem
 build() {
   Row(){
     Image($r("app.media.app_icon")).width('100%');
     Text(this.item.name)
   }
   .onClick(()=>{
     let name = `${this.item.name}-1`
     this.item.name = name
     console.log(`${name}--${JSON.stringify(this.item)}}`)
     console.log('child-imgSs-',JSON.stringify(this.imgSs.myMap.get('2024-11-13')))
   })
 }
}


在HarmonyOS中,对于Map<String, Object[]>类型的数据进行双向绑定,通常涉及自定义组件和数据模型的设计。由于HarmonyOS的双向绑定机制主要设计用于简单的数据类型和列表,对于复杂类型如Map<String, Object[]>,需要手动实现数据的监听和更新。

以下是一个简化的思路:

  1. 定义数据模型:创建一个包含Map<String, Object[]>的Java类,并添加用于监听数据变化的接口或方法。

  2. 自定义组件:在自定义组件中,通过监听数据模型的变化来更新UI。同时,当UI发生变化时,通过回调方法更新数据模型。

  3. 绑定数据:在页面中,实例化数据模型和自定义组件,并将数据模型传递给自定义组件。

  4. 实现监听和更新逻辑:在数据模型和自定义组件中,实现监听数据变化的逻辑,并在数据变化时更新UI或数据模型。

由于Map<String, Object[]>的复杂性,双向绑定可能需要更细致的编程。开发者需要确保在数据变化时,能够正确地更新UI,并在UI变化时,能够正确地更新数据模型。

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

回到顶部