W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
@Watch應用于對狀態(tài)變量的監(jiān)聽。如果開發(fā)者需要關注某個狀態(tài)變量的值是否改變,可以使用@Watch為狀態(tài)變量設置回調(diào)函數(shù)。
從API version 9開始,該裝飾器支持在ArkTS卡片中使用。
@Watch用于監(jiān)聽狀態(tài)變量的變化,當狀態(tài)變量變化時,@Watch的回調(diào)方法將被調(diào)用。@Watch在ArkUI框架內(nèi)部判斷數(shù)值有無更新使用的是嚴格相等(===),遵循嚴格相等規(guī)范。當在嚴格相等為false的情況下,就會觸發(fā)@Watch的回調(diào)。
@Watch補充變量裝飾器 | 說明 |
---|---|
裝飾器參數(shù) | 必填。常量字符串,字符串需要有引號。是(string) => void自定義成員函數(shù)的方法的引用。 |
可裝飾的自定義組件變量 | 可監(jiān)聽所有裝飾器裝飾的狀態(tài)變量。不允許監(jiān)聽常規(guī)變量。 |
裝飾器的順序 | 建議@State、@Prop、@Link等裝飾器在@Watch裝飾器之前。 |
類型 | 說明 |
---|---|
(changedPropertyName? : string) => void | 該函數(shù)是自定義組件的成員函數(shù),changedPropertyName是被watch的屬性名。 在多個狀態(tài)變量綁定同一個@Watch的回調(diào)方法的時候,可以通過changedPropertyName進行不同的邏輯處理 將屬性名作為字符串輸入?yún)?shù),不返回任何內(nèi)容。 |
以下示例展示組件更新和@Watch的處理步驟。count在CountModifier中由@State裝飾,在TotalView中由@Prop裝飾。
- @Component
- struct TotalView {
- @Prop @Watch('onCountUpdated') count: number;
- @State total: number = 0;
- // @Watch 回調(diào)
- onCountUpdated(propName: string): void {
- this.total += this.count;
- }
- build() {
- Text(`Total: ${this.total}`)
- }
- }
- @Entry
- @Component
- struct CountModifier {
- @State count: number = 0;
- build() {
- Column() {
- Button('add to basket')
- .onClick(() => {
- this.count++
- })
- TotalView({ count: this.count })
- }
- }
- }
處理步驟:
以下示例說明了如何在子組件中觀察@Link變量。
- class PurchaseItem {
- static NextId: number = 0;
- public id: number;
- public price: number;
- constructor(price: number) {
- this.id = PurchaseItem.NextId++;
- this.price = price;
- }
- }
- @Component
- struct BasketViewer {
- @Link @Watch('onBasketUpdated') shopBasket: PurchaseItem[];
- @State totalPurchase: number = 0;
- updateTotal(): number {
- let total = this.shopBasket.reduce((sum, i) => sum + i.price, 0);
- // 超過100歐元可享受折扣
- if (total >= 100) {
- total = 0.9 * total;
- }
- return total;
- }
- // @Watch 回調(diào)
- onBasketUpdated(propName: string): void {
- this.totalPurchase = this.updateTotal();
- }
- build() {
- Column() {
- ForEach(this.shopBasket,
- (item) => {
- Text(`Price: ${item.price.toFixed(2)} €`)
- },
- item => item.id.toString()
- )
- Text(`Total: ${this.totalPurchase.toFixed(2)} €`)
- }
- }
- }
- @Entry
- @Component
- struct BasketModifier {
- @State shopBasket: PurchaseItem[] = [];
- build() {
- Column() {
- Button('Add to basket')
- .onClick(() => {
- this.shopBasket.push(new PurchaseItem(Math.round(100 * Math.random())))
- })
- BasketViewer({ shopBasket: $shopBasket })
- }
- }
- }
處理步驟如下:
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: