HarmonyOS Next V2 @Local 和@Param
@Local 背景
@Local 是harmony應用開發中的 v2 版本中 對標**@State**的狀態管理修飾器,它解決了 @State 對狀態變量更改的檢測混亂的問題:
- @State 修飾的狀態變量 可以是組件內部自己定義的
- @State 修飾的狀態 也可以由外部父組件傳遞
這樣就導致了狀態數據來源不唯一,在大型項目中會引發難易檢測和維護狀態的問題。如以下代碼:
@Entry
@Component
struct Index {
@State num: number = 100
build() {
Column() {
Text("父組件的數據 " + 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++
})
}
}
}

@Local 基本使用
@Local的出現就是為了解決這一類問題
- @Local 只能用在 @Componentv2 修飾的組件上
- 被**@Local**裝飾的變量無法從外部初始化(無法由父組件傳遞進來),因此必須在組件內部進行初始化
我們對上面代碼稍作修改
@Entry
@Component
struct Index {
@State num: number = 100
build() {
Column() {
Text("父組件的數據 " + this.num)
Son({ num: this.num }) // 這里就報錯啦
Son()
}
.height('100%')
.width('100%')
}
}
@ComponentV2 // 此處調整為 @ComponentV2
struct Son {
// 此處調整為 @Local
@Local num: number = 0
build() {
Column() {
Button(`子組件 ${this.num}`)
.onClick(() = > {
this.num++
})
}
}
}

@Local 與@State 對比
| @State | @Local | |
|---|---|---|
| 參數 | 無。 | 無。 |
| 從父組件初始化 | 可選。 | 不允許外部初始化。 |
| 觀察能力 | 能觀測變量本身以及一層的成員屬性,無法深度觀測。 | 能觀測變量本身,深度觀測依賴@Trace 裝飾器。 |
| 數據傳遞 | 可以作為數據源和子組件中狀態變量同步。 | 可以作為數據源和子組件中狀態變量同步。 |
@Local 特別注意
- @Local 支持觀測 number、boolean、string、Object、class 等基本類型以及 Array、Set、Map、Date 等內嵌類型。
- @Local 的觀測能力僅限于被裝飾的 變量本身 。當裝飾簡單類型時,能夠觀測到對變量的賦值;當裝飾對象類型時,僅能觀測到對對象整體的賦值;當裝飾數組類型時,能觀測到數組整體以及數組元素項的變化;當裝飾 Array、Set、Map、Date 等內嵌類型時,可以觀測到通過 API 調用帶來的變化。
@Params
@Params主要表示 子組件 接收父組件傳遞的數據。可以和 @Local 搭配一起使用
@Params 背景
在 V1 版本的狀態管理修飾符中,可以用來處理 父子傳參的技術有:
- 普通屬性,不需要特別的修飾符 , 不具備單向同步
- @Prop 單向同步,不能監聽深層次屬性的改變,也不能做到雙向同步
- @Link 可以做到雙向同步,但是不能監聽深層次屬性的改變,而且不能直接用在 列表渲染技術 - ForEach 中
- @ObjectLink 可以做到雙向同步,但是必須和 @Observed 搭配使用 ,而且只能用在自定義組件上
1. 普通屬性
普通屬性,不需要特別的修飾符 , 不具備單向同步
@Entry
@Component
struct Index {
@State num: number = 100
build() {
Column() {
// 父組件傳遞過去的數據
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}`)
}
}
}

2. @Prop 單向同步
@Prop 單向同步
- 不能監聽深層次屬性的改變
- 也不能做到雙向同步
在上面代碼基礎上 加入**@Prop**,可以檢測到基本類型數據的更新
@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() {
// 父組件傳遞過去的數據
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}`)
}
}
}

3. @Link 雙向同步
@Link 用法和@Prop 基本一致
可以做到雙向同步,但是
不能監聽深層次屬性的改變
而且不能直接用在 列表渲染技術 - 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}`) } } }
4. @ObjectLink
@ObjectLink 可以做到雙向同步,但是必須和 @Observed 搭配使用 ,而且只能用在自定義組件上

小結
可以看到,如果都是使用 v1 版本的這一套 父子傳參的技術,是十分復雜難易直接上手使用的。
@Params 介紹
Param 表示組件從外部傳入的狀態,使得父子組件之間的數據能夠進行同步:
- @Param 裝飾的變量支持本地初始化,但是不允許在組件內部直接修改變量本身。
- 如果不本地初始化,那么必須加入 @Require
- @Param 可以做到單向同步
- @Param 可以檢測深層次屬性的修改,但是該修改在數據源上必須是整體對象的更新
- @Params 如果也想要深度監聽單個屬性的修改,那么需要使用 @ObservedV2 和 @Trace
以下代碼主要演示:@Param 可以檢測深層次屬性的修改,但是該修改在數據源上必須是整體對象的更新
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 {
// 要么設置 @Require 表示父組件必須傳遞數據
// 要么設置 默認值
@Require @Param age: number
build() {
Column() {
Button(`子組件 ${this.age}`)
}
}
}

總結
- @Local 可以看成是 @State 的替代 ,單獨表示組件內部的狀態
- @Params 可以看成 @Prop @Link @ObjectLink 的替代,更加嚴謹
- @Local 和 @Params 搭配一起使用,都只能用在 @Componentv2 修飾的自定義組件上
審核編輯 黃宇
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
HarmonyOS
+關注
關注
80文章
2153瀏覽量
36037
發布評論請先 登錄
相關推薦
熱點推薦
RDMA設計44:RoCE v2原語功能驗證與分析
它是RoCE v2協議進行信息及數據交換的核心機制,也是DUT需要實現的核心機制之一,對該功能的仿真驗證需要考慮指令的提交數據包的組裝及發送、數據的DMA處理等。
RDMA設計37:RoCE v2 子系統模型設計
本博文主要交流設計思路,在本博客已給出相關博文160多篇,希望對初學者有用。注意這里只是拋磚引玉,切莫認為參考這就可以完成商用IP設計。
RoCE v2 子系統模型是用來模擬 RoCE v2 功能
發表于 02-06 16:19
RDMA設計30:RoCE v2 發送模塊2
當 RoCE v2 發送模塊檢測到發送隊列非空時,則從發送隊列中讀取一個發送隊列條目,并判斷請求類型。根據不同的請求類型和請求長度進入不同的包生成流程,這一過程由請求狀態機實現。
RDMA設計29:RoCE v2 發送及接收模塊設計2
本博文主要交流設計思路,在本博客已給出相關博文約100篇,希望對初學者有用。注意這里只是拋磚引玉,切莫認為參考這就可以完成商用IP設計。
(1)RoCE v2 發送模塊
RoCE v2 發送模塊
發表于 01-26 16:47
RDMA設計28:RoCE v2 發送及接收模塊設計
本博文主要交流設計思路,在本博客已給出相關博文約100篇,希望對初學者有用。注意這里只是拋磚引玉,切莫認為參考這就可以完成商用IP設計。
RoCE v2 發送及接收模塊負責將用戶指令組裝為 RoCE
發表于 01-25 10:45
RDMA設計19:RoCE v2 發送及接收模塊設計
本博文主要交流設計思路,在本博客已給出相關博文約100篇,希望對初學者有用。注意這里只是拋磚引玉,切莫認為參考這就可以完成商用IP設計。
RoCE v2 發送及接收模塊負責將用戶指令組裝
發表于 01-06 08:08
AURIX? Audio Application Kit for AURIX? lite Kit V2 深度解析
AURIX? Audio Application Kit for AURIX? lite Kit V2 深度解析 在音頻技術不斷發展的今天,一款功能強大且靈活的音頻應用套件對于電子工程師來說至關重要
uIO-Stick v2 用戶指南:設計、應用與安全要點
uIO-Stick v2 用戶指南:設計、應用與安全要點 在電子工程領域,接口設備對于連接不同系統和實現功能交互起著至關重要的作用。uIO-Stick v2 作為一款用于 MOTIX? MCU 設備
RDMA over RoCE V2設計1:為什么要設計它?
基于PC-PC或GPU-GPU之間RDMA設計已有較多廠商投入,雖然有的大廠投入幾年后折羽而歸,但不影響PC領域成熟應用產品的推廣。這里主要討論在FPGA上設計RDMA over RoCE V2,雖然已有xilinx的ernic應用,但是性價比以及國產化需求還是有其發展空間。
第三屆大會回顧第6期 | HarmonyOS NEXT原生智能,助力應用低成本生而智能
原生智能是HarmonyOS NEXT的核心能力之一,通過將人工智能(AI)技術與操作系統深度融合,實現了從底層到應用層的全面智能化。HarmonyOS NEXT的原生智能是如何實現的
第三屆大會回顧第2期 | HarmonyOS NEXT內核驅動生態兼容與競爭力思考
隨著HarmonyOS NEXT生態和技術的發展,驅動框架作為北向和南向的生態中樞,有很多的機會。例如,提供更多的信息到應用層,實現精準的性能功耗控制;打破傳統的分層解耦,簡化關鍵協議、關鍵路徑等等。
HarmonyOS Next V2 @Monitor 和@Computed
HarmonyOS Next V2 @Monitor 和@Computed @Monitor 介紹 @Monitor 是狀態把管理 V2 版本中的用于監聽狀態變量修改的技術。 它可以直
HarmonyOS Next V2 @Event
HarmonyOS Next V2 @Event 背景 在上一節中,我們針對父子組件,講了關于傳遞數據的知識。我們了解到 @Local 是管理自己內部的數據的, @
STM2cubeide使用Freertos v2提示錯誤怎么解決?
我一直以為st公司是一個嚴謹,優秀的公司,直到我遇到了stm32cubeide使用了freertosv2 。
為什么我把freertos調成版本v2建一個任務和消息隊列 ,freertosv2提示
發表于 03-12 07:33
HarmonyOS Next V2 @Local 和@Param
評論