HarmonyOS 鸿蒙Next @observed/@objectLink装饰器父子组件对象传递时属性‘id’未自增变为NaN原因

HarmonyOS 鸿蒙Next @observed/@objectLink装饰器父子组件对象传递时属性‘id’未自增变为NaN原因

@Observed

class Task{
  static id: number = 1
  // 任务名称
  name: string = `任务${Task.id++}`
  // 任务状态:是否完成
  finished: boolean = false
}

class StatInfo{
  totalTask: number = 0
  finishTask: number = 0
}

//颜色加灰
@Extend(Text) function finishedTask(){
  .decoration({type:TextDecorationType.LineThrough})
  .fontColor('#B1B2B1')
}

@Component
export struct TaskList {
  @State tasks: Task[]=[]
  @Consume sta:StatInfo
  handleTasksChange(){
    this.sta.totalTask=this.tasks.length //更新任务总数量
    this.sta.finishTask=this.tasks.filter(item=>item.finished).length //更新当前已完成的任务数量
  }
  build() {
    Column(){
      //2.新增任务按钮
      Button('新增任务')
        .width(200)
        .onClick(()=>{
          this.tasks.push(new Task())
          this.handleTasksChange()
        })
      // 3.任务列表
      List({space:10}){
        ForEach(
          this.tasks,
          (item:Task,index)=>{
            ListItem(){
              TaskItem({item:item,OnTaskChange:this.handleTasksChange.bind(this)})
            }.swipeAction({end:this.deleteButton(index)})
          }
        )
      }
      .width('100%')
      .layoutWeight(1)
      .alignListItem(ListItemAlign.Center)
    }
  }
  @Builder deleteButton(index:number){
    Button(){
      Image($r('app.media.ic_public_delete_filled'))
        .fillColor(Color.White)
        .width(20)
    }
    .width(40)
    .height(40)
    .type(ButtonType.Circle)
    .backgroundColor(Color.Red)
    .margin(5)
    .onClick(()=>{
      this.tasks.splice(index,1)
      this.handleTasksChange()
    })
  }
}

@Component
struct TaskItem {
  @ObjectLink item:Task
  OnTaskChange:() => void
  build() {
    Row(){
      if (this.item.finished){
        Text(this.item.name)
          .finishedTask()
      }else {
        Text(this.item.name)
      }
      Checkbox()
        .select(this.item.finished)
        .onChange(val=>{
          //更新当前任务的状态
          this.item.finished=val
          //更新当前已完成的任务数量
          this.OnTaskChange()
        })
    }
    .card()
    .justifyContent(FlexAlign.SpaceBetween)
  }
}

@Component
struct PropPage {
  // 统计信息,总任务数量
  @Provide sta:StatInfo = new StatInfo()

  build() {
    Column({
      space: 10
    }){
      // 1.任务进度卡片
      TaskStaticsComponent()
      //任务列表
      TaskList()
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#F1F2F3')
  }
}

更多关于HarmonyOS 鸿蒙Next @observed/@objectLink装饰器父子组件对象传递时属性‘id’未自增变为NaN原因的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

cke_120.png

检查下代码中是否有这种使用的情况

更多关于HarmonyOS 鸿蒙Next @observed/@objectLink装饰器父子组件对象传递时属性‘id’未自增变为NaN原因的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


已经解决了,id变成全局变量就正常了,

我也遇到这个问题了,id变成全局变量怎么搞的?

let id:number= 1, task = { // 其他属性 };

在HarmonyOS鸿蒙Next中,@observed@objectLink装饰器用于实现父子组件之间的双向数据绑定。当在父子组件之间传递对象时,如果属性id未自增并变为NaN,通常是由于以下原因:

  1. 数据类型不匹配:id属性可能被错误地定义为非数值类型(如字符串),而在自增操作时,系统尝试将其作为数值处理,导致结果为NaN

  2. 自增逻辑错误:在父组件或子组件中,id属性的自增逻辑可能存在问题,例如在自增操作前未正确初始化或未进行类型转换。

  3. 状态管理问题:@observed@objectLink装饰器依赖于状态管理,如果状态更新未正确触发,可能导致id属性未按预期自增。

  4. 生命周期问题:组件生命周期中的某些阶段(如初始化或更新时),id属性可能未正确处理,导致其值变为NaN

解决该问题需要检查代码中id属性的定义、自增逻辑、状态管理以及生命周期处理,确保数据类型一致且逻辑正确。

回到顶部