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
检查下代码中是否有这种使用的情况
更多关于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
,通常是由于以下原因:
-
数据类型不匹配:
id
属性可能被错误地定义为非数值类型(如字符串),而在自增操作时,系统尝试将其作为数值处理,导致结果为NaN
。 -
自增逻辑错误:在父组件或子组件中,
id
属性的自增逻辑可能存在问题,例如在自增操作前未正确初始化或未进行类型转换。 -
状态管理问题:
@observed
和@objectLink
装饰器依赖于状态管理,如果状态更新未正确触发,可能导致id
属性未按预期自增。 -
生命周期问题:组件生命周期中的某些阶段(如初始化或更新时),
id
属性可能未正确处理,导致其值变为NaN
。
解决该问题需要检查代码中id
属性的定义、自增逻辑、状态管理以及生命周期处理,确保数据类型一致且逻辑正确。