HarmonyOS鸿蒙Next中嵌套类属性变化UI无法监测到

HarmonyOS鸿蒙Next中嵌套类属性变化UI无法监测到 嵌套的Person类的属性变化时UI无法感知到

export default class MeetingRoomData{
mapPersons:Map<string,Person> //<userid, person> --保持插入顺序,不自动排序
}
-----------------------------------
let paraMeetingRoomData: Record<string,MeetingRoomData> = { 'MeetingRoomData': new MeetingRoomData() };
export let gStorage: LocalStorage = new LocalStorage(paraMeetingRoomData);
export let gRoomData: SubscribedAbstractProperty<MeetingRoomData> = gStorage.link('MeetingRoomData');
----------------------------------------------
@Entry(MeetingRoomModel.gStorage)
@Component
struct MeetingRoom {
@State isShowTool:Visibility = Visibility.Visible
@State isShowEndDlg:Visibility = Visibility.Hidden
@State isSelfMicOn:boolean = false
@State isSelfCamOn:boolean = false

@State @Watch("onClickEndMeeting") isClickEnd: boolean = false

@LocalStorageLink('MeetingRoomData') @Watch("onMeetingRoomDataChange") roomData: MeetingRoomData = new MeetingRoomData()
}

更多关于HarmonyOS鸿蒙Next中嵌套类属性变化UI无法监测到的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

可以参考如下demo

import { PriceStepTextInput } from './PriceStepTextInput'
import { VolumeStepTextInput } from './VolumeStepTextInput'

@Component
struct child {
  @ObjectLink viewModel: ViewModel
  @ObjectLink subViewModel: SubViewModel

  build() {
    Column() {
      PriceStepTextInput({
        placeholder: '请输入价格',
        interactionEnabled:true,
        text: this.subViewModel.limitPrice??'',
        priceStep: '0.01',
        onChange:(value: string)=>{
          this.subViewModel.limitPrice = value
        }
      })
      .margin({left: 15, top: 8, right: 10})
      .height(40)
      VolumeStepTextInput({
        interactionEnabled:true,
        initStep: 100,
        changeStep: 100,
        text: this.viewModel.entrustAmount??'',
        onChange: (value: string) => {
          this.viewModel.entrustAmount = value
        }})
      .height(40)

      Row() {
        Text('买入')
          .width('100%')
          .height('100%')
          .fontSize(16)
          .textAlign(TextAlign.Center)
          .borderRadius(8)
          .fontColor(this.entrustBtnFontColor())
          .backgroundColor(this.entrustBtnColor())
          .onClick(()=>{
          })
      }
      .height(40)
    }
    .alignItems(HorizontalAlign.Start)
    .height('100%')
    .width('100%')
  }

  private entrustBtnFontColor(): Color {
    let color = Color.White
    if (this.viewModel.entrustBtnEnabled() && this.subViewModel.limitPriceEnable()) {
      color = Color.Gray
    }
    else {
      color = Color.Red
    }
    return color
  }

  private entrustBtnColor(): Color {
    let color = Color.White
    if (this.viewModel.entrustBtnEnabled() && this.subViewModel.limitPriceEnable()) {
      color = Color.Yellow
    }
    else {
      color = Color.Green
    }
    return color
  }
}

@Entry
@Component
struct Index {
  @State viewModel: ViewModel = new ViewModel()

  aboutToAppear() {

  }

  build() {
    Flex() {
      Column() {
        child({viewModel: this.viewModel, subViewModel: this.viewModel.sub})
      }.backgroundColor(Color.White)
      .alignItems(HorizontalAlign.Start)
      .height('100%')
      .width('100%')

    }
    .height(300)
  }
}

@Observed
class ViewModel {
  entrustAmount?: string
  sub: SubViewModel

  constructor() {
    this.sub = new SubViewModel()
  }

  entrustBtnEnabled(): boolean {
    if (this.entrustAmount) {
      return true
    }
    else {
      return false
    }
  }
}

@Observed
class SubViewModel {
  limitPrice?: string

  limitPriceEnable(): boolean {
    if(this.limitPrice) {
      return true
    }
    else{
      return false
    }
  }
}

更多关于HarmonyOS鸿蒙Next中嵌套类属性变化UI无法监测到的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,如果嵌套类的属性变化无法被UI监测到,通常是因为数据绑定机制未能正确触发更新。鸿蒙的UI框架依赖于双向数据绑定来反映数据变化,如果嵌套类的属性变化没有通过特定的方式通知UI层,UI将无法感知到这些变化。

鸿蒙Next中,建议使用@Observed装饰器来标记嵌套类,使其成为可观察对象。同时,使用@ObjectLink@State等装饰器来确保UI组件能够响应嵌套类属性的变化。如果嵌套类内部属性发生变化,需要手动调用this.notifyPropertyChange()方法来通知UI更新。

如果没有使用这些装饰器或方法,嵌套类的属性变化将无法被UI监测到,导致UI不更新。确保数据模型和UI之间的绑定机制正确配置,是解决此类问题的关键。

在HarmonyOS鸿蒙Next中,嵌套类的属性变化无法直接触发UI更新,因为框架默认只监测直接绑定的属性。要解决这个问题,可以采取以下方法:

  1. 使用@Observed@ObjectLink:在嵌套类上添加@Observed注解,并在父类中使用@ObjectLink绑定嵌套类实例,框架会自动监测嵌套类的属性变化。

  2. 手动通知更新:在修改嵌套类属性的代码中,手动调用this.notifyPropertyChange()方法通知UI更新。

  3. 简化数据结构:尽量避免复杂的嵌套类结构,将需要绑定的属性提升到父类中,直接绑定到UI。

通过这些方法,可以确保嵌套类属性变化时UI能够正确响应。

回到顶部