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
可以参考如下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更新,因为框架默认只监测直接绑定的属性。要解决这个问题,可以采取以下方法:
-
使用
@Observed和@ObjectLink:在嵌套类上添加@Observed注解,并在父类中使用@ObjectLink绑定嵌套类实例,框架会自动监测嵌套类的属性变化。 -
手动通知更新:在修改嵌套类属性的代码中,手动调用
this.notifyPropertyChange()方法通知UI更新。 -
简化数据结构:尽量避免复杂的嵌套类结构,将需要绑定的属性提升到父类中,直接绑定到UI。
通过这些方法,可以确保嵌套类属性变化时UI能够正确响应。

