伦伦影院久久影视,天天操天天干天天射,ririsao久久精品一区 ,一本大道香蕉大久在红桃,999久久久免费精品国产色夜,色悠悠久久综合88,亚洲国产精品久久无套麻豆,亚洲香蕉毛片久久网站,一本一道久久综合狠狠老

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

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

3天內不再提示

HarmonyOS Next V2 @Local 和@Param

萬少 ? 來源:jf_22972444 ? 作者:jf_22972444 ? 2025-04-02 18:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

HarmonyOS Next V2 @Local 和@Param

@Local 背景

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

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

這樣就導致了狀態(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**裝飾的變量無法從外部初始化(無法由父組件傳遞進來),因此必須在組件內部進行初始化

我們對上面代碼稍作修改

@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 // 此處調整為 @ComponentV2
struct Son {

  // 此處調整為 @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 等內嵌類型。
  • @Local 的觀測能力僅限于被裝飾的 變量本身 。當裝飾簡單類型時,能夠觀測到對變量的賦值;當裝飾對象類型時,僅能觀測到對對象整體的賦值;當裝飾數(shù)組類型時,能觀測到數(shù)組整體以及數(shù)組元素項的變化;當裝飾 Array、Set、Map、Date 等內嵌類型時,可以觀測到通過 API 調用帶來的變化。

@Params

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

@Params 背景

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

  1. 普通屬性,不需要特別的修飾符 , 不具備單向同步
  2. @Prop 單向同步,不能監(jiān)聽深層次屬性的改變,也不能做到雙向同步
  3. @Link 可以做到雙向同步,但是不能監(jiān)聽深層次屬性的改變,而且不能直接用在 列表渲染技術 - 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. 也不能做到雙向同步

在上面代碼基礎上 加入**@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. 而且不能直接用在 列表渲染技術 - 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

小結

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

@Params 介紹

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

  • @Param 裝飾的變量支持本地初始化,但是不允許在組件內部直接修改變量本身。
    • 如果不本地初始化,那么必須加入 @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 {
  // 要么設置 @Require 表示父組件必須傳遞數(shù)據(jù)
  // 要么設置 默認值
  @Require @Param age: number
  build() {
    Column() {
      Button(`子組件 ${this.age}`)
    }
  }
}

image-20240718222428155

總結

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

    關注

    80

    文章

    2156

    瀏覽量

    36250
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    uM-FPU V2 浮點協(xié)處理器:功能特性與應用指南

    uM-FPU V2 浮點協(xié)處理器:功能特性與應用指南 引言 在電子設計領域,浮點運算能力對于許多應用至關重要。Micromega Corporation 的 uM-FPU V2 浮點協(xié)處理器為
    的頭像 發(fā)表于 04-11 15:15 ?419次閱讀

    AA Boost Module V2:便捷的電源解決方案

    AA Boost Module V2:便捷的電源解決方案 在電子設計中,電源供應是一個關鍵問題。今天要給大家介紹的是DFRobot的獨家產品——AA Boost Module V2(SKU
    的頭像 發(fā)表于 03-27 12:50 ?169次閱讀

    如何在 VisionFive v2 上使用外部 GPU?

    如果舊的 amd gpu 在 VisionFive V2 上運行,我想使用帶有開源 amd 驅動程序的 amd gpu。我需要什么以及如何將 GPU 連接到 VisionFive v2?
    發(fā)表于 03-13 06:38

    RDMA設計44:RoCE v2原語功能驗證與分析

    它是RoCE v2協(xié)議進行信息及數(shù)據(jù)交換的核心機制,也是DUT需要實現(xiàn)的核心機制之一,對該功能的仿真驗證需要考慮指令的提交數(shù)據(jù)包的組裝及發(fā)送、數(shù)據(jù)的DMA處理等。
    的頭像 發(fā)表于 02-25 09:26 ?278次閱讀
    RDMA設計44:RoCE <b class='flag-5'>v2</b>原語功能驗證與分析

    RDMA設計37:RoCE v2 子系統(tǒng)模型設計

    本博文主要交流設計思路,在本博客已給出相關博文160多篇,希望對初學者有用。注意這里只是拋磚引玉,切莫認為參考這就可以完成商用IP設計。 RoCE v2 子系統(tǒng)模型是用來模擬 RoCE v2 功能
    發(fā)表于 02-06 16:19

    RDMA設計30:RoCE v2 發(fā)送模塊2

    當 RoCE v2 發(fā)送模塊檢測到發(fā)送隊列非空時,則從發(fā)送隊列中讀取一個發(fā)送隊列條目,并判斷請求類型。根據(jù)不同的請求類型和請求長度進入不同的包生成流程,這一過程由請求狀態(tài)機實現(xiàn)。
    的頭像 發(fā)表于 01-27 11:56 ?786次閱讀
    RDMA設計30:RoCE <b class='flag-5'>v2</b> 發(fā)送模塊<b class='flag-5'>2</b>

    RDMA設計29:RoCE v2 發(fā)送及接收模塊設計2

    本博文主要交流設計思路,在本博客已給出相關博文約100篇,希望對初學者有用。注意這里只是拋磚引玉,切莫認為參考這就可以完成商用IP設計。 (1)RoCE v2 發(fā)送模塊 RoCE v2 發(fā)送模塊
    發(fā)表于 01-26 16:47

    RDMA設計28:RoCE v2 發(fā)送及接收模塊設計

    本博文主要交流設計思路,在本博客已給出相關博文約100篇,希望對初學者有用。注意這里只是拋磚引玉,切莫認為參考這就可以完成商用IP設計。 RoCE v2 發(fā)送及接收模塊負責將用戶指令組裝為 RoCE
    發(fā)表于 01-25 10:45

    RDMA設計19:RoCE v2 發(fā)送及接收模塊設計

    本博文主要交流設計思路,在本博客已給出相關博文約100篇,希望對初學者有用。注意這里只是拋磚引玉,切莫認為參考這就可以完成商用IP設計。 RoCE v2 發(fā)送及接收模塊負責將用戶指令組裝
    發(fā)表于 01-06 08:08

    AURIX? Audio Application Kit for AURIX? lite Kit V2 深度解析

    AURIX? Audio Application Kit for AURIX? lite Kit V2 深度解析 在音頻技術不斷發(fā)展的今天,一款功能強大且靈活的音頻應用套件對于電子工程師來說至關重要
    的頭像 發(fā)表于 12-20 20:35 ?1390次閱讀

    uIO-Stick v2 用戶指南:設計、應用與安全要點

    uIO-Stick v2 用戶指南:設計、應用與安全要點 在電子工程領域,接口設備對于連接不同系統(tǒng)和實現(xiàn)功能交互起著至關重要的作用。uIO-Stick v2 作為一款用于 MOTIX? MCU 設備
    的頭像 發(fā)表于 12-20 11:10 ?827次閱讀

    RDMA設計5:RoCE V2 IP架構

    上面分析,基于RoCE v2 高速數(shù)據(jù)傳輸IP 的高速傳輸應用整體架構如圖 1 所示。 圖1 基于RoCE V2 IP應用的系統(tǒng)整體架構圖 它通過 QSFP28 接口連接上位機進行
    發(fā)表于 11-25 10:34

    RDMA over RoCE V2設計1:為什么要設計它?

    基于PC-PC或GPU-GPU之間RDMA設計已有較多廠商投入,雖然有的大廠投入幾年后折羽而歸,但不影響PC領域成熟應用產品的推廣。這里主要討論在FPGA上設計RDMA over RoCE V2,雖然已有xilinx的ernic應用,但是性價比以及國產化需求還是有其發(fā)展空間。
    的頭像 發(fā)表于 07-15 10:58 ?792次閱讀
    RDMA over RoCE <b class='flag-5'>V2</b>設計1:為什么要設計它?

    第三屆大會回顧第6期 | HarmonyOS NEXT原生智能,助力應用低成本生而智能

    原生智能是HarmonyOS NEXT的核心能力之一,通過將人工智能(AI)技術與操作系統(tǒng)深度融合,實現(xiàn)了從底層到應用層的全面智能化。HarmonyOS NEXT的原生智能是如何實現(xiàn)的
    的頭像 發(fā)表于 07-14 18:04 ?1294次閱讀
    第三屆大會回顧第6期 | <b class='flag-5'>HarmonyOS</b> <b class='flag-5'>NEXT</b>原生智能,助力應用低成本生而智能

    第三屆大會回顧第2期 | HarmonyOS NEXT內核驅動生態(tài)兼容與競爭力思考

    隨著HarmonyOS NEXT生態(tài)和技術的發(fā)展,驅動框架作為北向和南向的生態(tài)中樞,有很多的機會。例如,提供更多的信息到應用層,實現(xiàn)精準的性能功耗控制;打破傳統(tǒng)的分層解耦,簡化關鍵協(xié)議、關鍵路徑等等。
    的頭像 發(fā)表于 05-19 19:17 ?1955次閱讀
    第三屆大會回顧第<b class='flag-5'>2</b>期 | <b class='flag-5'>HarmonyOS</b> <b class='flag-5'>NEXT</b>內核驅動生態(tài)兼容與競爭力思考