構建可擴展的狀態系統:基于 ArkTS 的模塊化狀態管理設計與實現

在這里插入圖片描述

摘要

在 HarmonyOS 的日常開發中,很多人都會遇到一個問題:多個頁面之間的數據狀態如何共享?尤其是在組件結構越來越復雜的場景下,如果還用傳統方式來傳值,不僅代碼混亂,維護也很吃力。

為了解決這個問題,本文將介紹一種用 ArkTS 實現的“模塊化狀態管理”方式。它的思路有點類似于 React 中的 Redux,通過創建一個單獨的狀態模塊,把所有共享狀態集中管理,再在各個頁面中引用它,從而實現狀態同步更新。

引言

隨著應用體量越來越大,一個頁面一個狀態的寫法已經越來越難以滿足業務需求了。例如:首頁有一個計數器,設置頁也需要讀取和修改這個值;再比如,有些全局配置比如暗黑模式、用戶登錄信息等,全 app 都要用。

這種時候,模塊化狀態管理就非常有用了。它的好處是:

  • 狀態集中管理
  • 頁面之間不需要一層層傳參
  • 狀態變化可控、可追蹤
  • 更易測試與維護

而 ArkTS 原生就支持單例和模塊導入的機制,所以在 HarmonyOS 中實現模塊化狀態管理其實并不復雜。

用 ArkTS 實現模塊化狀態管理

創建一個狀態模塊(StateManager)

我們先來看一個最簡單的狀態管理模塊,只包含一個全局的計數器:

// StateManager.ts
export class StateManager {private static instance: StateManager;public count: number = 0;private constructor() {}static getInstance() {if (!StateManager.instance) {StateManager.instance = new StateManager();}return StateManager.instance;}
}

這個模塊用了經典的“單例模式”,也就是只創建一個實例,在整個 app 中共享。任何頁面只要調用 StateManager.getInstance(),就能拿到這個共享狀態。

在頁面中引用這個狀態模塊

下面我們寫一個頁面,展示這個 count 值,并且點擊按鈕讓它 +1。

// MainPage.ets
import { StateManager } from './StateManager';@Entry
@Component
struct MainPage {private stateManager = StateManager.getInstance();build() {Column() {Text(`Count: ${this.stateManager.count}`).fontSize(20);Button('Increment').onClick(() => {this.stateManager.count++;});}.padding(20);}
}

現在我們打開這個頁面,點擊按鈕,每點一次,count 就加一。

模塊化狀態在實際場景中的使用案例

案例 1:多頁面共享的購物車數量

假設我們在商城 app 里有多個頁面(比如首頁、購物車頁、商品詳情頁),都需要顯示購物車里的商品數量。

狀態模塊
// CartState.ts
export class CartState {private static instance: CartState;public itemCount: number = 0;private constructor() {}static getInstance() {if (!CartState.instance) {CartState.instance = new CartState();}return CartState.instance;}addItem() {this.itemCount++;}clearCart() {this.itemCount = 0;}
}
首頁展示購物車數量
// HomePage.ets
import { CartState } from './CartState';@Component
struct HomePage {private cartState = CartState.getInstance();build() {Row() {Text(`購物車商品數量: ${this.cartState.itemCount}`)Button('添加商品').onClick(() => {this.cartState.addItem();});}.padding(20);}
}
購物車頁面清空功能
// CartPage.ets
import { CartState } from './CartState';@Component
struct CartPage {private cartState = CartState.getInstance();build() {Column() {Text(`當前數量: ${this.cartState.itemCount}`)Button('清空購物車').onClick(() => {this.cartState.clearCart();});}}
}

這樣,兩個頁面共享同一個 CartState 實例,更新狀態時,頁面數據也會同步。

案例 2:全局用戶信息管理

比如你有個用戶模塊,登錄成功后需要把用戶信息存下來,后續其他頁面都能用。

// UserState.ts
export class UserState {private static instance: UserState;public username: string = '';public isLoggedIn: boolean = false;private constructor() {}static getInstance() {if (!UserState.instance) {UserState.instance = new UserState();}return UserState.instance;}login(name: string) {this.username = name;this.isLoggedIn = true;}logout() {this.username = '';this.isLoggedIn = false;}
}

你可以在登錄頁使用 login(name) 方法,在設置頁調用 logout() 來退出登錄,并在其他頁面通過 isLoggedIn 來判斷用戶狀態。

QA 環節:開發中常遇到的問題

Q1:這個狀態會在頁面切換后丟失嗎?

不會。 因為用了單例模式,所以狀態是保存在內存里的,除非應用被殺掉或者你主動清空。

Q2:多個組件同時引用這個狀態,會沖突嗎?

不會沖突,但不會自動刷新。 如果你在頁面 A 修改了狀態,頁面 B 想實時感知,需要結合 @Observed 或自定義通知機制(比如事件總線)來實現響應式更新。

Q3:這個方式適合大型項目嗎?

適合做輕量的狀態管理。 如果項目非常復雜、狀態特別多、需要響應式更新的場景比較多,建議結合 ArkTS 的 @Observed, @State, @Provide 等裝飾器,或者結合事件總線、信號機制使用。

總結

模塊化狀態管理在 ArkTS 中是非常實用的一種方案,尤其適合開發多人協作或頁面組件繁多的中大型項目。通過單例模式封裝狀態模塊,我們可以實現:

  • 頁面之間的狀態共享
  • 狀態統一管理,易于維護
  • 代碼結構清晰,易擴展

當然,如果你的應用場景對狀態變化的實時性要求更高,推薦結合 ArkTS 的響應式裝飾器或事件總線來做更進一步的擴展。

未來你也可以在這個基礎上加上本地緩存(比如存入 Preferences),或者結合 @Observed 屬性做組件刷新。希望這篇文章能為你在 ArkTS 的開發旅程中提供一些思路和幫助!

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

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

相關文章

重生之我在暑假學習微服務第二天《MybatisPlus-下篇》

本系列參考黑馬程序員微服務課程,有興趣的可以去查看相關視頻,本系列內容采用漸進式方式講解微服務核心概念與實踐方法,每日更新確保知識點的連貫性。通過系統化學習路徑幫助開發者掌握分布式系統構建的關鍵技術。讀者可通過平臺訂閱功能獲取…

系統整理Python的條件語句和常用方法

Python 的條件語句(if 語句)是控制程序流程的基礎之一,結構清晰、語法簡潔,非常適合初學者掌握。一、基本語法結構if 條件:執行代碼塊1 elif 條件2:執行代碼塊2 else:執行代碼塊3示例:score 85if score > 90:print…

記錄個IAR程序下載后硬件復位不運行,必須斷電復位才運行的問題

【問題測試】有個F407的跑馬燈的例子,是MDK和IAR兩個版本,MDK版本的例子下載并復位后可以正常看到LED閃爍,而IAR的例子下進去后,不會閃爍。使用TOOL的上位機內核寄存器監測工具測試發現,硬件復位后竟然還在調試狀態&am…

觀察者模式(Observer Pattern)和 發布-訂閱模式(Publisher-Subscriber Pattern)

你對 觀察者模式(Observer Pattern)和 發布-訂閱模式(Publisher-Subscriber Pattern)的描述是非常準確的,并且闡明了它們的核心區別。為了幫助你更好地理解這兩者的細微差異,下面是一個更詳細的對比分析&am…

2025年接口技術的十字路口:當MCP遇見REST、GraphQL與gRPC

在當今這個由數據驅動、萬物互聯的時代,應用程序接口(API)已成為現代軟件架構的基石。它們是不同服務之間溝通的橋梁,支撐著從網頁應用到復雜的微服務生態系統的一切。長久以來,開發者們在REST、GraphQL和gRPC這幾種主…

【CTF-WEB-反序列化】利用__toString魔術方法讀取flag.php

題目 頁面提示輸入?code,那我們在網址里get一下出現了新頁面的提示,進入看看下面有個help.php頁面的提示,進入看看有一段php代碼,仔細分析,應該是要用反序列法代碼如下 class FileClass{ public $filename error.log…

在 github.com 與 sourceforge.net 上創建免費個人靜態網站、博客的區別

github.com github 屬于 git 版本管理專業網站,有免費和收費兩種套餐。git 的數據是存放在數據庫中的,要將數據庫中的數據顯示為網站的網頁,這需要服務器端提供專門的中間件支持才能實現。 特點: 官方支持:提供長期…

jenkins 入門指南:從安裝到啟動的完整教程

jenkins 入門指南:從安裝到啟動的完整教程 持續集成(CI)是現代開發流程中的核心環節,而 Jenkins 作為一款開源的 CI 工具,憑借簡單安裝、開箱即用、插件豐富、易于擴展等優勢,成為開發者的首選工具。它能自…

機器學習(重學版)基礎篇(概念與評估)

本篇參考周志華老師的西瓜書,但是本人學識有限僅能理解皮毛,如有錯誤誠請讀友評論區指正,萬分感謝。一、基礎概念與評估方法本節目標:建立理論基礎框架?1、機器學習定義機器學習是一門通過計算手段利用經驗(以數據形式…

spring/springboot SPI(二)配合使用的接口

spring.factories 里,Spring 會根據接口來加載實現類,常見的幾個接口包括:一、org.springframework.context.ApplicationListener1、作用監聽 Spring 容器事件,如 ApplicationReadyEvent。2、使用方法項目結構Spring Boot 2.xSpri…

基于Zig語言,opencv相關的c++程序靜態交叉編譯

一、寫在前面 1.什么是zig? Zig 是一種通用編程語言; Zig 最初的定位就是代替C語言的系統級語言,它提供了與 C 語言幾乎 100% 兼容(可直接調用 C 頭文件、鏈接 C 庫),同時不需要任何依賴構建系統。 Zig 同時附帶一…

基于 LSTM 與 SVM 融合的時間序列預測模型:理論框架與協同機制—實踐算法(1)

目錄 1、單一模型的局限性:混合架構的設計動機 2、LSTM 的時序特征提取:從原始序列到高階表征 2.1、門控機制的時序過濾能力 2.2、隱藏狀態的特征壓縮作用 2.3、預訓練的特征優化邏輯 3、SVM 的非線性映射:從高階特征到預測輸出 3.1、…

如何查看docker實例是否掛載目錄,以及掛載了哪些目錄

一條命令即可一次性列出當前容器里所有掛載點&#xff1a; docker inspect <容器ID或名稱> --format{{range .Mounts}}{{printf "%-8s %-35s -> %s\n" .Type .Source .Destination}}{{end}}示例輸出&#xff1a; bind /host/owrt/src …

Opentrons 模塊化平臺與AI技術助力智能移液創新,賦能AAW?自動化工作站

在生命科學領域加速擁抱自動化的關鍵節點&#xff0c;全球開源實驗室自動化領導者 Opentrons 攜手全球領先生命科學公司默克生命科學&#xff0c;重磅推出 AAW?智能自動化液體處理平臺。這一戰略合作的核心技術引擎 ——Opentrons Flex 第三代全自動移液工作站&#xff0c;正以…

C++學習筆記(八:函數與變量)

往篇內容&#xff1a; C學習筆記&#xff08;一&#xff09; 一、C編譯階段※ 二、入門案例解析 三、命名空間詳解 四、C程序結構 C學習筆記&#xff08;二&#xff09; 五、函數基礎 六、標識符 七、數據類型 補充&#xff1a;二進制相關的概念 sizeof 運算符簡介 補…

智慧施工:施工流程可視化管理系統

圖撲智慧施工全流程可視化管理系統&#xff0c;通過可視化界面&#xff0c;可直觀掌握各工序銜接進度、資源調配情況&#xff0c;快速識別違規作業、設備故障等風險點 —— 如塔吊運行半徑重疊、深基坑支護位移預警等。同時&#xff0c;系統支持施工方案模擬推演&#xff0c;對…

單鏈表的冒泡排序實現:從原理到代碼詳解

單鏈表的冒泡排序實現&#xff1a;從原理到代碼詳解 引言 單鏈表作為一種常見的數據結構&#xff0c;其排序操作因節點無法隨機訪問&#xff08;需通過指針遍歷&#xff09;而與數組排序存在差異。冒泡排序因其實現簡單、無需額外空間&#xff08;僅需指針操作&#xff09;&…

如何在 Ubuntu 24.04 或 22.04 上安裝和使用 GDebi

APT 是 Ubuntu 上安裝需要外部依賴項的 Debian 包的一種方式,但還有另一種選擇,即 GDebi。本文將介紹如何在 Ubuntu 24.04 上安裝 GDebi,以及如何使用它來安裝 .deb 包所需的依賴項。 什么是 GDebi? GDebi 是默認的 .deb 包安裝器 DPKG 的輕量級替代品。與 DPKG 不同,GD…

俄羅斯方塊游戲開發(面向對象編程)

摘要本設計基于MATLAB面向對象編程技術&#xff0c;開發了一款具備完整游戲邏輯的俄羅斯方塊游戲。通過類封裝實現游戲核心模塊&#xff08;方塊管理、游戲板狀態、碰撞檢測等&#xff09;&#xff0c;采用旋轉矩陣實現方塊變形&#xff0c;結合MATLAB圖形用戶界面&#xff08;…

背包DP之多重背包

背包DP之多重背包一、多重背包基礎認知1.1 問題定義1.2 核心特征二、基礎解法&#xff1a;暴力拆分2.1 核心思路2.2 代碼實現2.3 局限性分析三、優化解法&#xff1a;二進制拆分3.1 優化原理3.2 拆分步驟3.3 代碼實現3.4 復雜度分析四、二進制拆分過程五、多重背包的變種與應用…