鴻蒙原生開發之狀態管理V2

一、ArkTS狀態變量的定義:


  • State:狀態,指驅動UI更新的數據。用戶通過觸發組件的事件方法,改變狀態數據。狀態數據的改變,引起UI的重新渲染。


在鴻蒙原生開發中,使用ArkTS開發UI的時候,我們可以對UI進行狀態變量的綁定,來進行UI渲染



基本結構如下:


@Component
struct MyComponent {
@State count: number = 0;
private increaseBy: number = 1;

build() {
}
}

@Entry
@Component
struct Parent {
build() {
Column() {
// 從父組件初始化,覆蓋本地定義的默認值
MyComponent({ count: 1, increaseBy: 2 })
}
}
}

@State count: number = 0;//通過@State修飾綁定的變量會被UI監聽,count發生變化時UI也會隨之變化。


這是V1的狀態管理方法。


下面我們來介紹V2狀態管理


首先我們來看V2的狀態修飾器:


  • @ObservedV2裝飾器和@Trace裝飾器:類屬性變化觀測
  • @ComponentV2裝飾器:自定義組件
  • @Local裝飾器:組件內部狀態
  • @Param:組件外部輸入
  • @Once:初始化同步一次
  • @Event裝飾器:規范組件輸出
  • @Provider裝飾器和@Consumer裝飾器:跨組件層級雙向同步
  • @Monitor裝飾器:狀態變量修改監聽
  • @Computed裝飾器:計算屬性
  • @Type裝飾器:標記類屬性的類型


@ObservedV2裝飾器與@Trace裝飾器



  • @ObservedV2裝飾器與@Trace裝飾器需要配合使用,單獨使用@ObservedV2裝飾器或@Trace裝飾器沒有任何作用。
  • 被@Trace裝飾器裝飾的屬性property變化時,僅會通知property關聯的組件進行刷新。
  • 在嵌套類中,嵌套類中的屬性property被@Trace裝飾且嵌套類被@ObservedV2裝飾時,才具有觸發UI刷新的能力。
  • 在繼承類中,父類或子類中的屬性property被@Trace裝飾且該property所在類被@ObservedV2裝飾時,才具有觸發UI刷新的能力。
  • 未被@Trace裝飾的屬性用在UI中無法感知到變化,也無法觸發UI刷新。
  • @ObservedV2的類實例目前不支持使用JSON.stringify進行序列化。

@ComponentV2裝飾器用于裝飾自定義組件:


  • 在@ComponentV2裝飾的自定義組件中,開發者僅可以使用全新的狀態變量裝飾器,包括@Local、@Param、@Once、@Event、@Provider、@Consumer等。

  • @ComponentV2裝飾的自定義組件暫不支持組件復用、LocalStorage等現有自定義組件的能力。

  • 無法同時使用@ComponentV2與@Component裝飾同一個struct結構。

  • @ComponentV2支持一個可選的boolean類型參數freezeWhenInactive,來實現組件凍結功能。


@ComponentV2 // 裝飾器
struct Index { // struct聲明的數據結構
build() { // build定義的UI
}
}


通過以上狀態變量的修飾,可以彌補狀態管理(V1)的短板,狀態管理(V1)在復雜數據類型和隔代數據同步方面可能沒有狀態管理(V2)更好用,所以我們大型復雜數據結構的項目可以使用狀態管理(V2),在日常普通項目中使用狀態管理(V1)更方便。



最后我們來看看MVVM模式的狀態管理V2項目框架設計



一般鴻蒙項目的開發使用MVVM模式;ArkUI采用了Model-View-ViewModel(MVVM)架構模式,


MVVM將應用分為Model、View和ViewModel三個核心部分,實現數據、視圖與邏輯的分離。通過這種模式,UI可以隨著狀態的變化自動更新,無需手動處理,從而更加高效地管理數據和視圖的綁定與更新。


  • Model:負責存儲和管理應用的數據以及業務邏輯,不直接與用戶界面交互。通常從后端接口獲取數據,是應用程序的數據基礎,確保數據的一致性和完整性。
  • View:負責用戶界面展示數據并與用戶交互,不包含任何業務邏輯。它通過綁定ViewModel層提供的數據來動態更新UI。
  • ViewModel:負責管理UI狀態和交互邏輯。作為連接Model和View的橋梁,ViewModel監控Model數據的變化,通知View更新UI,同時處理用戶交互事件并轉換為數據操作。

常用的狀態管理裝飾器包括@Local、@Param、@Event、@ObservedV2、@Trace


來看這段代碼:


@ObservedV2
export default class TaskListTeamBean {
@Type(TeamBean)
@Trace login: TeamBean[] = [new TeamBean()];
@Type(TeamBean)
@Trace bill: TeamBean[] = [new TeamBean()];
@Type(TeamBean)
@Trace community: TeamBean[] = [new TeamBean()];
@Type(TeamBean)
@Trace game: TeamBean[] = [new TeamBean()];
@Type(TeamBean)
@Trace person: TeamBean[] = [new TeamBean()];

async loadTasks(context: common.UIAbilityContext) {
let taskList = new ListTeamBean(new WholeBean());
await taskList.loadTasks(context);
this.login = taskList.taskWhole.login
this.bill = taskList.taskWhole.bill
this.community = taskList.taskWhole.community
this.game = taskList.taskWhole.game
this.person = taskList.taskWhole.person
}


addTask(newTask: TaskTeamBean): void {

}

removeTask(removedTask: TaskTeamBean): void {

}
}

@Local taskList: TaskListTeamBean = PersistenceV2.connect(TaskListTeamBean, 'TaskList', () => new TaskListTeamBean())!;

private context = getContext(this) as common.UIAbilityContext;


async aboutToAppear() {
this.taskList = PersistenceV2.connect(TaskListTeamBean, 'TaskList', () => new TaskListTeamBean())!;
if (this.taskList.community.length < 2) {
await this.taskList.loadTasks(this.context);
}
}

通過


  1. @ComponentV2修飾TaskListTeamBean數據對象
  2. 在TaskListTeamBean內部使用@Type()@Trace來修飾變量
  3. 然后再在@Entry入口頁面調用:

這就是MVVM模式+狀態管理V2的基本框架開發模式。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76064.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76064.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76064.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nginx配置跳轉設置Host有誤導致報404問題

我們有個項目&#xff0c;前端調用了第三方接口。為了避免跨域&#xff0c;所以使用nginx進行轉發。一直正常工作&#xff0c;相安無事。近日第三方調整了安全策略&#xff0c;http轉換成https&#xff0c;原本使用ip&#xff0c;現在也改成使用域名&#xff0c;所以nginx這里我…

深度學習 Deep Learning 第12章 深度學習的主流應用

深度學習 Deep Learning 第12章 深度學習的主流應用 內容概要 本周深入探討了深度學習在多個領域的應用&#xff0c;包括計算機視覺、語音識別、自然語言處理以及其他領域如推薦系統和知識表示。本章強調了硬件和軟件基礎設施的重要性&#xff0c;特別是GPU在加速神經網絡訓練…

【Qt】三種操作sqlite3的方式及其三種多表連接

一、sqlite3與MySQL數據庫區別&#xff1a; 1. 數據庫類型 SQLite3&#xff1a;是嵌入式數據庫&#xff0c;它將整個數據庫存儲在單個文件中&#xff0c;不需要獨立的服務器進程。這意味著它可以很方便地集成到各種應用程序中&#xff0c;如移動應用、桌面應用等。MySQL&…

mysqlworkbench導入.sql文件

1、MySQL Workbench 新建數據庫 或者 在左側導航欄的 ?Schemas 區域右鍵選擇 ?Create Schema...輸入數據庫名稱&#xff08;例如 mydatabase&#xff09;&#xff0c;點擊 ?Apply確認創建&#xff0c;點擊 ?Finish 2、選擇目標數據庫 在左側導航欄的 ?Schemas 列表中&a…

《Spring Cloud Eureka 高可用集群實戰:從零構建高可靠性的微服務注冊中心》

從零構建高可用 Eureka 集群 | Spring Cloud 微服務架構深度實踐指南 本文核心內容基于《Spring Cloud 微服務架構開發》第1版整理&#xff0c;結合生產級實踐經驗優化 實驗環境&#xff1a;IntelliJ IDEA 2024 | JDK 1.8| Spring Boot 2.1.7.RELEASE | Spring Cloud Greenwich…

實變函數:集合與子集合一例(20250329)

題目 設 r , s , t r, s, t r,s,t 是三個互不相同的數&#xff0c;且 A { r , s , t } A \{r, s, t\} A{r,s,t}, B { r 2 , s 2 , t 2 } B \{r^2, s^2, t^2\} B{r2,s2,t2}, C { r s , s t , r t } C \{rs, st, rt\} C{rs,st,rt} 若 A B C A B C ABC 則 { r , s…

Redis設計與實現-哨兵

哨兵模式 1、啟動并初始化sentinel1.1 初始化服務器1.2 使用Sentinel代碼1.3 初始化sentinel狀態1.4 初始化sentinel狀態的master屬性1.5 創建連向主服務器的網絡連接 2、獲取主服務器信息3、獲取從服務器的信息4、向主從服務器發送信息5、接受主從服務器的頻道信息6、檢測主觀…

藍橋杯省模擬賽 字符串拼接

問題描述 給定四個字符串 a,b,c,d&#xff0c;請將這四個字符串按照任意順序依次連接拼成一個字符串。 請問拼成的字符串字典序最小是多少&#xff1f; 輸入格式 輸入四行&#xff0c;每行包含一個字符串。 輸出格式 輸出一行包含一個字符串&#xff0c;表示答案。 樣例…

【大前端系列20】JavaScript核心:項目實戰從零構建任務管理系統

JavaScript核心&#xff1a;項目實戰從零構建任務管理系統 系列: 「全棧進化&#xff1a;大前端開發完全指南」系列第20篇 核心: 將JavaScript異步編程、事件循環等核心知識應用于實際項目開發 &#x1f4cc; 引言 在前面的文章中&#xff0c;我們深入探討了JavaScript中的異步…

STM32單片機的桌面寵物機器人(基于HAL庫)

效果 基于STM32單片機的桌面寵物機器人 概要 語音模塊&#xff1a;ASR PRO&#xff0c;通過天問block軟件燒錄語音指令 主控芯片&#xff1a;STM32F103C8T6 使用HAL庫 屏幕&#xff1a;0.96寸OLED屏&#xff0c;用來顯示表情 4個舵機&#xff0c;用來當作四只腿 底部一個面…

計算機視覺初步(環境搭建)

1.anaconda 建議安裝在D盤&#xff0c;官網正常安裝即可&#xff0c;一般可以安裝windows版本 安裝成功后&#xff0c;可以在電腦應用里找到&#xff1a; 2.創建虛擬環境 打開anaconda prompt&#xff0c; 可以用conda env list 查看現有的環境&#xff0c;一般打開默認bas…

SQL Server數據庫引擎服務啟動失敗:端口沖突

問題現象&#xff1a; SQL Server 2022 安裝完成后&#xff0c;數據庫引擎服務無法啟動&#xff0c;日志報錯 “TCP 端口 1433 已被占用”&#xff08;ERROR_LOG_SYS_TCP_PORT&#xff09;。 快速診斷 檢測端口占用&#xff1a; # 查看 1433 端口占用情況&#xff08;需管理員權…

全局思維與系統思考

最近接到一些需求&#xff0c;1號位希望每個層級的領導者有眼界&#xff0c;胸懷&#xff0c;格局&#xff0c;全局觀&#xff0c;這些聽起來似乎很抽象&#xff0c;然而它們是每個人、每個團隊成長與成功的核心競爭力。那么&#xff0c;如何才能提升這些能力&#xff1f;就像我…

區間有關的貪心解題記錄435無重疊區間452用最少數量的箭引爆氣球

無重疊區間我的想法是開一個數組a&#xff0c;遍歷給出的區間&#xff0c;在數組a里將對應落在的區間index標記。如果有重復區間就只選擇最小的那個區間標記。但是這道題的區間好像很長-5 * 104 < starti < endi < 5 * 104沒法用數組a表示總的區間范圍。 核心思路是當…

天銳藍盾終端安全防護——企業終端設備安全管控

從辦公室的臺式電腦到員工手中的移動終端&#xff0c;這些設備不僅是工作的得力助手&#xff0c;更是企業數據的重要載體。然而&#xff0c;隨著終端設備的廣泛使用&#xff0c;安全風險也如影隨形。硬件設備使用不當、數據隨意傳輸等問題頻發&#xff0c;使得企業數據面臨著泄…

k8s網絡策略

k8s網絡策略 k8s網絡測試概述查看防火墻策略 k8s網絡策略網絡訪問控制案例&#xff1a;配置k8s網絡策略結果驗證 k8s網絡策略配置示例 k8s網絡測試概述 網絡策略就是設置防火墻 查看防火墻策略 # 獲取當前命名空間下的所有 NetworkPolicy 資源&#xff08;網絡策略&#xff0…

leetcode刷題日記——跳躍游戲 II

[ 題目描述 ]&#xff1a; [ 思路 ]&#xff1a; 題目要求在一個一定能達到數組末尾的跳躍數組中(見55題 跳躍游戲)&#xff0c;找出能夠跳到末尾的最小次數要求次數最少&#xff0c;那肯定是選取能選步數中最大的數。也就是在當前能夠達到的距離中&#xff0c;選擇能夠達到的…

【Java SE】Java比較器:Comparable、Comparator

目錄 1.前言 2.Comaprable接口 2.1 使用細節 2.2 案例演示 3.Comparator接口 3.1 為什么需要Comparator接口 3.2 使用細節 3.3 案例演示 4.Comparable、Comparator對比 1.前言 Java 中的對象&#xff0c;正常情況下&#xff0c;只能進行比較&#xff1a; 或 ! 。不…

(二)創建實例

在這節中&#xff0c; 創建一個實例初始化Vulkan庫,指定驅動程序需要使用的應用程序信息 1&#xff0c;要有個實例句柄 VkInstance instance; 2&#xff0c;設置創建Vulkan驅動程序需要的信息&#xff0c; VkInstanceCreateInfo createInfo {}; createInfo.sType VK_STRUCTUR…

HCIP之VRRP

1. VRRP是什么 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虛擬路由冗余協議&#xff09;是一種用于提高網絡可靠性的容錯協議。它通過將多臺路由器虛擬成一臺虛擬路由器&#xff0c;實現網關的冗余備份。當主路由器&#xff08;Master&#xff09;出現故…