برنامه نویسی

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
      })
    }
  }
}

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا