HarmonyOS 鸿蒙Next Grid组件使用ForEach网格布局,Ui数据更新问题

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

HarmonyOS 鸿蒙Next Grid组件使用ForEach网格布局,Ui数据更新问题

Grid组件使用ForEach网格布局,
@State 修饰数据源数组,@State positiveReviewsArr: EvaluationResult[] = []
当点击item后需要实现当前Item变色,实际情况是不会变,但是断点看选中标志变量已经改变;

或者我这种实现不合适,希望能提供一个能用的方案:
实现效果:点击item后要高亮,再次点击则需要取消高亮,最后还要收集已选选项,要上传给服务器使用

3 回复
class ProductInfo{
  public id:string
  public productName:string
  constructor( id:string,productName:string) {
    this.id = id
    this.productName = productName
  }
}
@Entry
@Component
struct GridHighLight {
  @State services: ProductInfo[] = [
    new ProductInfo( '1', 'HUAWEI nova 12'),
    new ProductInfo( '2', 'HUAWEI nova 11'),
    new ProductInfo( '3', 'HUAWEI nova 13'),
    new ProductInfo( '24', 'HUAWEI nova 14'),

  ];
  @State clickStatus:Boolean = false
  clickThings: Array<string> = []
  @Provide selectIndexList: Array<string> = []


  build() {
    Column() {
      Grid() {
        ForEach(this.services, (item: ProductInfo, index) => {
          GridItem() {
            ToDoItem({ content: item.productName,selectIndex: item.id })
          }
        }, (item: string): string => item)
      }
      .columnsTemplate('1fr 1fr 1fr')
      .columnsGap(10)
      .rowsGap(10)
      .width('90%')
      .backgroundColor(0xFAEEE0)
      .height(300)
      Text('选中的')
      Text(`${this.selectIndexList}`)

    }
  }
}
@Component
export default struct ToDoItem {
  private content?: string;
  @State isComplete: boolean = false;
  private selectIndex?:string;
  @Consume selectIndexList: Array<string>

  build() {
    Row() {
      Column() {
        Text(this.content).fontColor('#FFFFFF')
      }
      .width('30%')
      .height(100)
      .backgroundColor(this.isComplete ? Color.Red : Color.Blue)
      .justifyContent(FlexAlign.Center)
      .width('100%')
      .height(60)
      .onClick(() => {
        this.isComplete = !this.isComplete;
        if(this.selectIndex){
          if(this.isComplete){
            this.selectIndexList.push(this.selectIndex)
          }else{
            let index = this.selectIndexList.indexOf(this.selectIndex)
            if(index !== -1){
              this.selectIndexList.splice(index,1)
            }
          }
        }
      })
    }
  }
}
使用v2装饰器,同时坚持Foreach的key 生成是否正确

关于HarmonyOS鸿蒙Next Grid组件使用ForEach网格布局时Ui数据更新问题,以下是一些可能的解决方案:

  1. 确保数据源的正确更新:使用@State修饰数据源数组,当数据源数组发生变化时,UI应自动刷新。如果UI未刷新,请检查是否直接修改了数组元素而未更新整个数组引用。可以通过重新赋值数组(如this.dataSource = [...this.dataSource])来触发UI刷新。
  2. 使用正确的组件和属性:Grid组件应正确设置rowsTemplatecolumnsTemplate属性来定义网格布局。同时,确保GridItem组件正确嵌套在Grid组件内部。
  3. 检查事件处理逻辑:在事件处理函数中,确保正确更新了与UI相关的状态变量。例如,在点击事件中更新选中状态,并触发UI刷新。
  4. 避免深层次数据嵌套:如果数据源是深层次嵌套的数组或对象,更新内部数据时可能无法触发UI刷新。此时,可以尝试重新赋值整个数据结构来强制刷新UI。

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

回到顶部