一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HarmonyOS Next V2 @Local 和@Param

萬少 ? 來源:jf_22972444 ? 作者:jf_22972444 ? 2025-04-02 18:27 ? 次閱讀

HarmonyOS Next V2 @Local 和@Param

@Local 背景

@Localharmony應(yīng)用開發(fā)中的 v2 版本中 對標**@State**的狀態(tài)管理修飾器,它解決了 @State 對狀態(tài)變量更改的檢測混亂的問題:

  1. @State 修飾的狀態(tài)變量 可以是組件內(nèi)部自己定義的
  2. @State 修飾的狀態(tài) 也可以由外部父組件傳遞

這樣就導(dǎo)致了狀態(tài)數(shù)據(jù)來源不唯一,在大型項目中會引發(fā)難易檢測和維護狀態(tài)的問題。如以下代碼:

@Entry
@Component
struct Index {
  @State num: number = 100

  build() {
    Column() {
      Text("父組件的數(shù)據(jù) " + this.num)

      Son({ num: this.num })
      Son()
    }
    .height('100%')
    .width('100%')
  }
}

@Component
struct Son {
  @State num: number = 0

  build() {
    Column() {
      Button(`子組件 ${this.num}`)
        .onClick(() = > {
          this.num++
        })
    }
  }
}

image-20240718201721853

@Local 基本使用

@Local的出現(xiàn)就是為了解決這一類問題

  1. @Local 只能用在 @Componentv2 修飾的組件上
  2. 被**@Local**裝飾的變量無法從外部初始化(無法由父組件傳遞進來),因此必須在組件內(nèi)部進行初始化

我們對上面代碼稍作修改

@Entry
@Component
struct Index {
  @State num: number = 100

  build() {
    Column() {
      Text("父組件的數(shù)據(jù) " + this.num)

      Son({ num: this.num }) // 這里就報錯啦

      Son()
    }
    .height('100%')
    .width('100%')
  }
}

@ComponentV2 // 此處調(diào)整為 @ComponentV2
struct Son {

  // 此處調(diào)整為 @Local
  @Local num: number = 0

  build() {
    Column() {
      Button(`子組件 ${this.num}`)
        .onClick(() = > {
          this.num++
        })
    }
  }
}

image-20240718204400711

@Local 與@State 對比

@State@Local
參數(shù)無。無。
從父組件初始化可選。不允許外部初始化。
觀察能力能觀測變量本身以及一層的成員屬性,無法深度觀測。能觀測變量本身,深度觀測依賴@Trace 裝飾器。
數(shù)據(jù)傳遞可以作為數(shù)據(jù)源和子組件中狀態(tài)變量同步。可以作為數(shù)據(jù)源和子組件中狀態(tài)變量同步。

@Local 特別注意

  • @Local 支持觀測 number、boolean、string、Object、class 等基本類型以及 Array、Set、Map、Date 等內(nèi)嵌類型。
  • @Local 的觀測能力僅限于被裝飾的 變量本身 。當裝飾簡單類型時,能夠觀測到對變量的賦值;當裝飾對象類型時,僅能觀測到對對象整體的賦值;當裝飾數(shù)組類型時,能觀測到數(shù)組整體以及數(shù)組元素項的變化;當裝飾 Array、Set、Map、Date 等內(nèi)嵌類型時,可以觀測到通過 API 調(diào)用帶來的變化。

@Params

@Params主要表示 子組件 接收父組件傳遞的數(shù)據(jù)??梢院?@Local 搭配一起使用

@Params 背景

在 V1 版本的狀態(tài)管理修飾符中,可以用來處理 父子傳參的技術(shù)有:

  1. 普通屬性,不需要特別的修飾符 , 不具備單向同步
  2. @Prop 單向同步,不能監(jiān)聽深層次屬性的改變,也不能做到雙向同步
  3. @Link 可以做到雙向同步,但是不能監(jiān)聽深層次屬性的改變,而且不能直接用在 列表渲染技術(shù) - ForEach 中
  4. @ObjectLink 可以做到雙向同步,但是必須和 @Observed 搭配使用 ,而且只能用在自定義組件上

1. 普通屬性

普通屬性,不需要特別的修飾符 , 不具備單向同步

@Entry
@Component
struct Index {
  @State num: number = 100

  build() {
    Column() {
      // 父組件傳遞過去的數(shù)據(jù)
      Son({ num: this.num })
        .onClick(() = > {
          this.num++
          console.log("", this.num)
        })
    }
    .height('100%')
    .width('100%')
  }
}

@Component
struct Son {
  num: number = 0

  build() {
    Column() {
      Button(`子組件 ${this.num}`)
    }
  }
}

image-20240718215338082

2. @Prop 單向同步

@Prop 單向同步

  1. 不能監(jiān)聽深層次屬性的改變
  2. 也不能做到雙向同步

在上面代碼基礎(chǔ)上 加入**@Prop**,可以檢測到基本類型數(shù)據(jù)的更新

@Component
struct Son {
  @Prop num: number = 0

但是無法檢測深層次屬性的改變,如

class Animal {
  dog: Dog = {
    age: 100
  }
}

class Dog {
  age: number = 100
}

@Entry
@Component
struct Index {
  @State
  animal: Animal = new Animal()

  build() {
    Column() {
      // 父組件傳遞過去的數(shù)據(jù)
      Son({ dog: this.animal.dog })
        .onClick(() = > {
          this.animal.dog.age++
          console.log("", this.animal.dog.age)
        })
    }
    .height('100%')
    .width('100%')
  }
}

@Component
struct Son {
  @Prop dog: Dog

  build() {
    Column() {
      Button(`子組件 ${this.dog.age}`)
    }
  }
}

image-20240718215929872

3. @Link 雙向同步

@Link 用法和@Prop 基本一致

可以做到雙向同步,但是

  1. 不能監(jiān)聽深層次屬性的改變

  2. 而且不能直接用在 列表渲染技術(shù) - ForEach以下代碼演示這個效果

    class Dog {
      age: number = 100
    }
    
    @Entry
    @Component
    struct Index {
      @State
      dogList: Dog [] = [new Dog(), new Dog(), new Dog(), new Dog()]
    
      build() {
        Column() {
          ForEach(this.dogList, (item: Dog) = > {
            // 此處會報錯  Assigning the attribute 'item' to the '@Link' decorated attribute 'dog' is not allowed. < ArkTSCheck >
            Son({ dog: item })
              .onClick(() = > {
                item.age++
                console.log("", item.age)
              })
          })
    
        }
        .height('100%')
        .width('100%')
      }
    }
    
    @Component
    struct Son {
      @Link dog: Dog
    
      build() {
        Column() {
          Button(`子組件 ${this.dog.age}`)
        }
      }
    }
    

    image-20240718220523209

4. @ObjectLink

@ObjectLink 可以做到雙向同步,但是必須和 @Observed 搭配使用 ,而且只能用在自定義組件

image-20240715182615579

小結(jié)

可以看到,如果都是使用 v1 版本的這一套 父子傳參的技術(shù),是十分復(fù)雜難易直接上手使用的。

@Params 介紹

Param 表示組件從外部傳入的狀態(tài),使得父子組件之間的數(shù)據(jù)能夠進行同步:

  • @Param 裝飾的變量支持本地初始化,但是不允許在組件內(nèi)部直接修改變量本身。
    • 如果不本地初始化,那么必須加入 @Require
  • @Param 可以做到單向同步
  • @Param 可以檢測深層次屬性的修改,但是該修改在數(shù)據(jù)源上必須是整體對象的更新
  • @Params 如果也想要深度監(jiān)聽單個屬性的修改,那么需要使用 @ObservedV2@Trace

以下代碼主要演示:@Param 可以檢測深層次屬性的修改,但是該修改在數(shù)據(jù)源上必須是整體對象的更新

class Person {
  age: number = 100
}
@Entry
@ComponentV2
struct Index {
  @Local
  person: Person = new Person()
  build() {
    Column() {
      Son({ age: this.person.age })
        .onClick(() = > {
          this.person.age++
          console.log("", this.person.age)
          if (this.person.age === 105) {
            const p = new Person()
            p.age = 200
            // 整體更新,子組件可以感知到
            this.person = p
          }
        })
    }
    .height('100%')
    .width('100%')
  }
}

@ComponentV2
struct Son {
  // 要么設(shè)置 @Require 表示父組件必須傳遞數(shù)據(jù)
  // 要么設(shè)置 默認值
  @Require @Param age: number
  build() {
    Column() {
      Button(`子組件 ${this.age}`)
    }
  }
}

image-20240718222428155

總結(jié)

  1. @Local 可以看成是 @State 的替代 ,單獨表示組件內(nèi)部的狀態(tài)
  2. @Params 可以看成 @Prop @Link @ObjectLink 的替代,更加嚴謹
  3. @Local 和 @Params 搭配一起使用,都只能用在 @Componentv2 修飾的自定義組件上
審核編輯 黃宇
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    2005

    瀏覽量

    31800
收藏 人收藏

    評論

    相關(guān)推薦

    脫離安卓,完全自研,純血鴻蒙HarmonyOS NEXT開始打造自主生態(tài)圈

    電子發(fā)燒友網(wǎng)報道(文/黃山明)6月21日,華為開發(fā)者大會上,期待已久的HarmonyOS?NEXT(純血版鴻蒙)新版本正式發(fā)布。早在4月份,華為輪值董事長徐直軍便公開表示,打造鴻蒙原生 應(yīng)用生態(tài)
    的頭像 發(fā)表于 06-22 00:05 ?5174次閱讀
    脫離安卓,完全自研,純血鴻蒙<b class='flag-5'>HarmonyOS</b> <b class='flag-5'>NEXT</b>開始打造自主生態(tài)圈

    HarmonyOS Next V2 @Monitor 和@Computed

    HarmonyOS Next V2 @Monitor 和@Computed @Monitor 介紹 @Monitor 是狀態(tài)把管理 V2 版本中的用于監(jiān)聽狀態(tài)變量修改的技術(shù)。 它可以直
    的頭像 發(fā)表于 04-02 18:26 ?174次閱讀

    HarmonyOS Next V2 @Event

    HarmonyOS Next V2 @Event 背景 在上一節(jié)中,我們針對父子組件,講了關(guān)于傳遞數(shù)據(jù)的知識。我們了解到 @Local 是管理自己內(nèi)部的數(shù)據(jù)的, @
    的頭像 發(fā)表于 03-31 09:42 ?185次閱讀

    微軟OmniParser V2:大模型轉(zhuǎn)化為計算機智能體

    微軟近日宣布,視覺Agent解析框架OmniParser已發(fā)布最新版本V2。這一新版本具有將大型語言模型如OpenAI(4o/o1/o3-mini)、DeepSeek(R1)、Qwen(2.5VL
    的頭像 發(fā)表于 02-18 09:31 ?2187次閱讀

    SAM IoT Wx v2硬件用戶指南

    電子發(fā)燒友網(wǎng)站提供《SAM IoT Wx v2硬件用戶指南.pdf》資料免費下載
    發(fā)表于 01-21 14:02 ?0次下載
    SAM IoT Wx <b class='flag-5'>v2</b>硬件用戶指南

    名單公布!【書籍評測活動NO.56】極速探索HarmonyOS NEXT:純血鴻蒙應(yīng)用開發(fā)實踐

    本書深入剖析了HarmonyOS NEXT的各項技術(shù),通過豐富的實戰(zhàn)案例,由淺入深地解析了HarmonyOS NEXT的原理與應(yīng)用。借助多樣化的實戰(zhàn)案例和豐富的配套資源,讀者可以全面
    發(fā)表于 01-20 16:53

    HarmonyOS NEXT 應(yīng)用開發(fā)練習(xí):智能視頻推薦

    一、整體思路 本DEMO展示了如何在HarmonyOS NEXT平臺上開發(fā)一個智能視頻推薦應(yīng)用。應(yīng)用通過模擬的用戶偏好數(shù)據(jù),為用戶推薦可能感興趣的視頻。用戶可以通過滑動屏幕查看推薦的視頻列表,并點擊
    發(fā)表于 01-02 16:26

    HarmonyOS Next MQTT演示

    HarmonyOS Next MQTT演示
    發(fā)表于 11-07 16:54

    華為大氣??!HarmonyOS NEXT公測發(fā)福利~這個可以有

    HarmonyOS NEXT火熱公測中,首批100萬名公測用戶速來領(lǐng)取多重權(quán)益!這波福利不錯
    的頭像 發(fā)表于 11-06 10:26 ?578次閱讀
    華為大氣??!<b class='flag-5'>HarmonyOS</b> <b class='flag-5'>NEXT</b>公測發(fā)福利~這個可以有

    華為HarmonyOS NEXT 10月8日開啟公測

    華為宣布,萬眾矚目的HarmonyOS NEXT操作系統(tǒng)將于10月8日正式開啟公測,標志著這一創(chuàng)新力作即將與廣大用戶見面。HarmonyOS NEXT作為華為自研操作系統(tǒng)的最新成果,不
    的頭像 發(fā)表于 09-24 15:41 ?1186次閱讀
    華為<b class='flag-5'>HarmonyOS</b> <b class='flag-5'>NEXT</b> 10月8日開啟公測

    華為“純血”鴻蒙系統(tǒng) HarmonyOS NEXT 將于9月底推出正式版

    HarmonyOS NEXT 將于今年 9 月底推出正式版本。 “從發(fā)布第一個版本到今年的 9 月份,這個(9 月)月底我們會正式發(fā)布 HarmonyOS NEXT,這一版本是完全獨
    的頭像 發(fā)表于 09-14 14:27 ?1996次閱讀

    華為HarmonyOS NEXT鴻蒙星河版正式開啟Beta計劃

    在剛剛落幕的華為開發(fā)者大會(HDC 2024)盛會上,華為震撼宣布HarmonyOS NEXT鴻蒙星河版正式邁入Beta測試階段,并預(yù)告其商用版本將于今年第四季度璀璨登場,預(yù)示著今年10月,搭載全新鴻蒙星河系統(tǒng)的華為手機即將與消費者見面。
    的頭像 發(fā)表于 07-15 15:59 ?1336次閱讀

    HarmonyOS NEXT Developer Beta1中的Kit

    HarmonyOS NEXT Developer Preview1(API 11)版本開始,HarmonyOS SDK以Kit維度提供豐富、完備的開放能力,涵蓋應(yīng)用框架、系統(tǒng)、媒體、圖形、應(yīng)用服務(wù)
    發(fā)表于 06-26 10:47

    HDC 2024上,HarmonyOS NEXT有哪些精彩亮點值得期待?

    6月21日至6月23日,備受矚目的HDC2024華為開發(fā)者大會將在松山湖盛大舉辦。近日,官方對外發(fā)出了亮點日程海報,圍繞HarmonyOS?NEXT,大會都將帶來哪些精彩內(nèi)容呢?讓我們一探
    的頭像 發(fā)表于 06-19 17:02 ?732次閱讀
    HDC 2024上,<b class='flag-5'>HarmonyOS</b> <b class='flag-5'>NEXT</b>有哪些精彩亮點值得期待?

    產(chǎn)品簡介 | RZ/V2系列MPU

    產(chǎn)品簡介 | RZ/V2系列MPU
    的頭像 發(fā)表于 05-08 08:06 ?743次閱讀
    產(chǎn)品簡介 | RZ/<b class='flag-5'>V2</b>系列MPU