HarmonyOS鸿蒙Next中@Local修飾的對象,在對對象屬性賦值無法刷新UI

HarmonyOS鸿蒙Next中@Local修飾的對象,在對對象屬性賦值無法刷新UI

@Local currentStatusInfo: CarStatusInfo = new CarStatusInfo()

callbackBleStatus21 = (eventData: emitter.GenericEventData<Status21Data>): void => { Logger.info(“ControlPage” + 收到蓝牙21数据: ${JSON.stringify(eventData.data)}) const status21 = eventData.data!; //如果跟上一次的相同就不赋值 //将this.currentStatusInfo里面有的元素,通过status21去赋值 this.saveBleStatus21(status21) }

saveBleStatus21(data: Status21Data) { if (this.connectStatus.isBlueConnect) { this.currentStatusInfo.leftFrontOpen = data.leftFrontOpen.toString() this.currentStatusInfo.rightFrontOpen = data.rightFrontOpen.toString() this.currentStatusInfo.leftBehindOpen = data.leftBehindOpen.toString() this.currentStatusInfo.rightBehindOpen = data.rightBehindOpen.toString() this.currentStatusInfo.isStart = data.isStart.toString() this.currentStatusInfo.lightOpen = data.lightOpen.toString() this.currentStatusInfo.isLock = data.isLock.toString() this.currentStatusInfo.afterBehindOpen = data.afterBehindOpen.toString() this.currentStatusInfo.isTheft = data.isTheft.toString() this.currentStatusInfo.isON = data.isON.toString() this.currentStatusInfo.leftFrontWindowOpen = data.leftFrontWindowOpen.toString() this.currentStatusInfo.rightFrontWindowOpen = data.rightFrontWindowOpen.toString() this.currentStatusInfo.leftBehindWindowOpen = data.leftBehindWindowOpen.toString() this.currentStatusInfo.rightBehindWindowOpen = data.rightBehindWindowOpen.toString() this.currentStatusInfo.skyWindowOpen = data.skyWindowOpen.toString() } }

@ObservedV2 export class CarStatusInfo { id: number = 0; carId: number = 0; carNum: string = ‘’; type: string = ‘’; @Trace leftFrontOpen: string = ‘0’; // 假设 “0” 表示关闭,“1” 表示开启 @Trace rightFrontOpen: string = ‘0’; @Trace leftBehindOpen: string = ‘0’; @Trace rightBehindOpen: string = ‘0’; footBrake: string = ‘0’; @Trace isStart: string = ‘0’; leftTurnLight: string = ‘0’; rightTurnLight: string = ‘0’; @Trace lightOpen: string = ‘0’; @Trace isLock: string = ‘0’; @Trace afterBehindOpen: string = ‘0’; hood: string = ‘0’; handbrake: string = ‘0’; @Trace isON: string = ‘0’; speed: number = 0; engineSpeed: number = 0; alertFortificationFailure: string = ‘0’; vibrationAlarm: string = ‘0’; unlocked: string = ‘0’; notAppointmentStart: string = ‘0’; keyInCar: string = ‘0’; @Trace skyWindowOpen: string = ‘0’; @Trace leftFrontWindowOpen: string = ‘0’; @Trace rightFrontWindowOpen: string = ‘0’; @Trace leftBehindWindowOpen: string = ‘0’; @Trace rightBehindWindowOpen: string = ‘0’; temp: number = 0; miles: string = ‘0’; remainOil: number = 0; lastMiles: string = ‘0’; oilConsumption: string = ‘0’; voltage: number = 0; tempControlStatus: string = ‘-1’; windLevel: string = ‘-1’; middleLeftDoor: string = ‘0’; middleRightDoor: string = ‘0’; createTime: string = ‘’; updateTime: string | null | number = null; @Trace gpsOpen: string = ‘0’; terminalResetNum: string = ‘0’; networkType: string = ‘’; isOnline: string = ‘0’; gps: string = ‘’; voltageStatus: string = ‘’; direction: string = ‘’; isTheft: string = ‘0’; isWarn: string = ‘0’; airConditionOpen: string = ‘0’; satellitesNum: number = 0; gprsSign: string = ‘’; chairRightHeat: string = ‘1’; chairLeftHeat: string = ‘1’; chairRightAir: string = ‘1’; chairLeftAir: string = ‘1’; chairRightHeatStatus: string = ‘0’; chairRightAirStatus: string = ‘0’; chairLeftHeatStatus: string = ‘0’; chairLeftAirStatus: string = ‘0’; percentageOil: number = 0; electric: string = ‘0’; circuit: string = ‘0’; height: number = 0; levelBattery: number = 0; locationTime: string | null | number = null; @Trace startTime: number = 0; acc: string | null | number = null; carStatusUp: string | null | number = null; carStatusUpTime: string | null | number = null; freeze: string = ‘0’; batteryStatus: string | null | number = null; ACStatus: string = ‘-1’; }


更多关于HarmonyOS鸿蒙Next中@Local修飾的對象,在對對象屬性賦值無法刷新UI的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复
参数 @State @Local
参数 无。 无。
从父组件初始化 可选。 不允许外部初始化。
观察能力 能观测变量本身以及一层的成员属性,无法深度观测。 能观测变量本身,深度观测依赖@Trace装饰器。
数据传递 可以作为数据源和子组件中状态变量同步。 可以作为数据源和子组件中状态变量同步。

能观测变量本身,深度观测依赖@Trace装饰器。

[@Local装饰器:组件内部状态-V2所属装饰器-状态管理(V2)-学习UI范式状态管理-UI开发 (ArkTS声明式开发范式)-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-new-local#local与state对比)

更多关于HarmonyOS鸿蒙Next中@Local修飾的對象,在對對象屬性賦值無法刷新UI的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,使用@Local装饰器修饰的对象属性变更时不会触发UI刷新。@Local装饰的变量是组件内局部状态,其变更仅作用于当前组件实例,不会引起跨组件的响应式更新。若需实现UI同步刷新,应改用@State装饰器声明状态变量。@State会建立数据与视图的双向绑定,属性变更时将自动触发相关联的UI更新。对于复杂对象,建议结合@Observed@ObjectLink实现嵌套属性的响应式监听。

在HarmonyOS Next中,@Local装饰的变量是组件内的状态变量,但直接修改对象属性不会触发UI刷新。您的问题在于虽然CarStatusInfo类使用了@ObservedV2@Trace装饰器,但直接修改@Local对象的属性时没有触发状态变更通知。

解决方法有两种:

  1. 重新赋值整个对象:
saveBleStatus21(data: Status21Data) {
  if (this.connectStatus.isBlueConnect) {
    this.currentStatusInfo = {...this.currentStatusInfo,
      leftFrontOpen: data.leftFrontOpen.toString(),
      rightFrontOpen: data.rightFrontOpen.toString()
      // 其他属性...
    };
  }
}
  1. 使用@Track装饰需要响应式更新的属性:
[@Local](/user/Local) currentStatusInfo: CarStatusInfo = new CarStatusInfo()
[@Track](/user/Track) currentStatusInfo.leftFrontOpen: string;
[@Track](/user/Track) currentStatusInfo.rightFrontOpen: string;
// 其他需要跟踪的属性...

这两种方式都能确保属性变更时触发UI更新。第一种方式通过创建新对象触发状态变更,第二种方式通过@Track显式标记需要跟踪的属性。

回到顶部