不使用@ObservedV2下
在ViewModel中持有单个数据类DataClass和其成员变量name,在网络请求之后给这两个赋值(若DataClass有多个成员变量也一并添加在ViewModel中,请求过后赋值)
@Observed class DataClass { name: string = '' } @Observed export class XxxViewModel { private _data: DataClass private _name: string = '' public set data(value: DataClass) { this._data = value } public get data(): DataClass { return this._data } public set name(value: string) { this._name = value } public get name(): string { return this._name } constructor() { this._data = new DataClass() } async getData() { let result: DataClass = await network() if (result) { this.data = result this.name = result.name } } }
在Component中@State装饰ViewModel实例,每一个子组件关联ViewModel的一个属性类似于:
@Entry @Component struct Index { @State viewModel: XxxViewModel = new XxxViewModel() aboutToAppear(): void { this.viewModel.getData() } build() { Row() { Column() { Text(this.viewModel.name) } } } }
ViewModel只持有DataClass成员变量, 页面拆分出多个Component使用@ObjectLink修饰,观察
DataClass的属性类似于:@Entry @Component struct Index { @State viewModel: XxxViewModel = new XxxViewModel() aboutToAppear(): void { this.viewModel.getData() } build() { Row() { Column() { NameComponent({ dataClass: this.viewModel.data }) } } } } @Component export struct NameComponent { @ObjectLink dataClass: DataClass build() { Text(this.dataClass.name) } }
以上两种情况分别有不一样的问题:
- 情况1: 如果和控件相关联的属性变多那么ViewModel中就需要添加更多的变量以及对其初始号
- 情况2: 如果和控件相关联的属性变多那么页面需要新建更多的Component去观察变量变化
大家觉得有没有更好的解决方案呢?欢迎回答👏
ViewModel的扩张本就是UI增多导致的。这是自然而然的事情。
你当然可以继续拆分ViewModel为...ChildViewModel,类膨胀和字段膨胀你总得选一个