HarmonyOS 鸿蒙Next:ForEach循环刷新时Array的item顺利导入但index作为颜色数组下标混乱

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

HarmonyOS 鸿蒙Next:ForEach循环刷新时Array的item顺利导入但index作为颜色数组下标混乱

@Entry @Component struct Ani2 {

@State arr:string[]=[‘国内新闻’,‘国际新闻’,‘生活娱乐’,‘信息世界’] build() { Scroll() { Column() {
ForEach(this.arr, (item:string,index:number)=>{
scrollItems({text:item,colorID:index}).transition({type:TransitionType.All})
},(value:string)=>value)
} } .width(‘100%’) .height(‘100%’) .align(Alignment.Top)

} }

@Component struct scrollItems { @State flag: boolean = true text:string=’’ colorID:number=0
c:string=((index:number):string=>{
const colors:string[]=[‘255,0,0’,‘255,0,0’,‘255,0,0’,‘255,0,0’]
return colors[index]})(this.colorID)

build() { Column() { Text(this.text)
.width(‘100%’) .height(25) .margin({bottom:3}) .fontColor(this.c )

  Flex({
    direction: this.flag ? FlexDirection.Row : FlexDirection.Column, 
    justifyContent: FlexAlign.Start, 
    alignItems: ItemAlign.Start  
  }) { 

    Column() { 
    }
    .width(this.flag ? 80 : '100%')
    .height(this.flag ? 80 : 240)
    .borderRadius(4)
    .backgroundColor('#ffadcfff')
    .margin({ right: 7, bottom: 7 })


    Column() {
      Row() 
      .width('100%')
      .height(20)
      .backgroundColor('#ffadcfff')
      .borderRadius(4)
      .padding({ left: 10 })

      Row() 
      .width('70%')
      .height(20)
      .backgroundColor('#FFE8F0FF')
      .borderRadius(4)
      .padding({ left: 10 })
      .margin({ top: 10 }) 
      Row() 
      .width('75%')
      .height(20)
      .backgroundColor('#FFE8F0FF')
      .padding({ left: 10 })
      .borderRadius(4)
      .margin({ top: 10 })

      if (!this.flag){  
        Row() 
        .width('70%')
        .height(20)
        .backgroundColor('#FFE8F0FF')
        .borderRadius(4)
        .padding({ left: 10 })
        .margin({ top: 10 }) 

        Row() 
        .width('75%')
        .height(20)
        .backgroundColor('#FFE8F0FF')
        .padding({ left: 10 })
        .borderRadius(4)
        .margin({ top: 10 }) 
        Row() 
        .width('75%')
        .height(20)
        .backgroundColor('#FFE8F0FF')
        .padding({ left: 10})
        .borderRadius(4)
        .margin({ top: 10 })
      }
    }
    .alignItems(HorizontalAlign.Start)
  }
  .width('100%') 
  .height(this.flag ? 95 : 430) 
  .padding({ top:7,left:7,bottom:7,right:7 })
  .margin({ bottom: 5 })
  .borderRadius(8)
  .shadow({ radius: 10, color: 'rgba(0,0,0,1)' }) 
  .onClick(()=>{
    animateTo({ duration: 500, curve: Curve.FastOutSlowIn }, ()=>{
      this.flag = !this.flag
    })
  })
}
.width('100%') 
.padding({ left: 20, right: 20 })
.margin({ top: 20 })

} }


更多关于HarmonyOS 鸿蒙Next:ForEach循环刷新时Array的item顺利导入但index作为颜色数组下标混乱的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复
  1. 对于 c 来说,this.colorID 始终为 0,应给 colorID 加上 @Prop 修饰,说明其为状态变量

  2. 你的 colors 数组传的颜色字符串不对,参考 https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-types-V5#resourcecolor

更多关于HarmonyOS 鸿蒙Next:ForEach循环刷新时Array的item顺利导入但index作为颜色数组下标混乱的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


刚学几天 感谢赐教,

有一点搞不懂:为啥item可以不加@prop传过去,index就不行呢,

因为colorID初始化为0,c初始化是按这时候的colorID来的,之后并没有重新赋值;只有当colorID为状态变量时,c才会重新赋值,

在HarmonyOS鸿蒙Next系统中,当你使用ForEach循环刷新Array时,如果遇到item顺利导入但index作为颜色数组下标导致混乱的问题,这通常是因为在UI刷新过程中,index的引用或者绑定出现了问题。

在鸿蒙的UI框架中,循环绑定数据时,需要确保每次刷新时index能够正确地映射到对应的颜色数组下标。问题可能出现在以下几个方面:

  1. 数据绑定延迟:如果UI组件的数据绑定不是即时的,可能在数据更新后UI还未同步更新,导致使用了旧的index值。

  2. 状态管理不当:在组件的状态管理中,如果index的状态没有正确更新或同步,也会导致此问题。

  3. 并发修改:如果在循环过程中有并发修改Array的操作,可能会导致index与Array的实际状态不一致。

解决方法通常需要检查并确保:

  • 数据绑定是即时的,或者在数据更新后触发UI的重新渲染。
  • 状态管理逻辑正确,index的状态能够实时反映当前Array的状态。
  • 避免在循环过程中并发修改Array。

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

回到顶部