Hongmeng Next State Management V2 – خلاصه استفاده از @Once Initialization

1. بررسی اجمالی
دکوراتور @Once برای پیادهسازی متغیرهایی استفاده میشود که مقادیر ورودی خارجی را فقط یک بار در حین تنظیم اولیه همگامسازی میکنند. باید با @Param استفاده شود و بر توانایی مشاهده @Param تأثیر نمی گذارد. متغیر Param را می توان به صورت محلی تغییر داد.
2. دستورالعمل قوانین استفاده از دکوراتورها
(1) @Once دکوراتور متغیر
- پارامترهای دکوراتور: هیچکدام
- شرایط استفاده: به تنهایی قابل استفاده نیست و باید با دکوراتور @Param استفاده شود.
(2) محدودیت ها
- @Once فقط در اجزای سفارشی تزئین شده با @ComponentV2 قابل استفاده است و فقط با @Param قابل استفاده است. به عنوان مثال:
@ComponentV2
struct CompA {
@Param @Once onceParam: string = "onceParam"; // 正确用法
@Once onceStr: string = "Once"; // 错误用法,@Once无法单独使用
@Local @Once onceLocal: string = "onceLocal"; // 错误用法,@Once不能与@Local一起使用
}
@Component
struct Index {
@Once @Param onceParam: string = "onceParam"; // 错误用法
}
- @Once هیچ ربطی به ترتیب @Param ندارد، برای مثال، ساختار @ComponentV2 را می توان به صورت @Param @Once یا @Once @param نوشت.
@ComponentV2
struct CompA {
@Param @Once param1: number;
@Once @Param param2: number;
}
3. سناریوهای استفاده
(1) متغیرها فقط یک بار مقداردهی اولیه و همگام می شوند
برای سناریوهایی مناسب است که انتظار میرود متغیر فقط یک بار در طول مقداردهی اولیه با منبع داده همگام شود و پس از آن دیگر به همگامسازی تغییرات ادامه ندهد. به عنوان مثال:
@ComponentV2
struct CompA {
@Param @Once onceParam: string = '';
build() {
Column() {
Text(`onceParam: ${this.onceParam}`)
}
}
}
@Entry
@ComponentV2
struct CompB {
@Local message: string = "Hello World";
build() {
Column() {
Text(`Parent message: ${this.message}`)
Button("change message")
.onClick(() => {
this.message = "Hello Tomorrow";
})
CompA({ onceParam: this.message })
}
}
}
(2) متغیر @Param را به صورت محلی تغییر دهید
وقتی @Once با @Param استفاده میشود، محدودیتی که @Param را نمیتوان به صورت محلی تغییر داد، برداشته میشود، و این تغییر میتواند باعث ایجاد یک بهروزرسانی UI شود، در این زمان، معادل @Local است، اما @Param @Once میتواند خارجی را بپذیرد مقداردهی اولیه ورودی به عنوان مثال:
@ObservedV2
class Info {
@Trace name: string;
constructor(name: string ) {
this.name = name;
}
}
@ComponentV2
struct Child {
@Param @Once onceParamNum: number = 0;
@Param @Once @Require onceParamInfo: Info;
build() {
Column() {
Text(`Child onceParamNum: ${this.onceParamNum}`)
Text(`Child onceParamInfo: ${this.onceParamInfo.name}`)
Button("changeOnceParamNum")
.onClick(() => {
this.onceParamNum++;
})
Button("changeParamInfo")
.onClick(() => {
this.onceParamInfo = new Info("Cindy");
})
}
}
}
@Entry
@ComponentV2
struct Index {
@Local localNum: number = 10;
@Local localInfo: Info = new Info("Tom");
build() {
Column() {
Text(`Parent localNum: ${this.localNum}`)
Text(`Parent localInfo: ${this.localInfo.name}`)
Button("changeLocalNum")
.onClick(() => {
this.localNum++;
})
Button("changeLocalInfo")
.onClick(() => {
this.localInfo = new Info("Cindy");
})
Child({
onceParamNum: this.localNum,
onceParamInfo: this.localInfo
})
}
}
}