前言
在 HarmonyOS 应用开发中,经常需要在不同页面、组件间共享数据和状态。今天分享一个实用工具类 GlobalThis,它基于单例模式实现全局数据存取,可以有效解决跨组件通信问题。
一、单例模式介绍
单例模式是一种常用的设计模式,确保一个类只有一个实例,并提供一个全局访问点。这对于全局状态管理非常有用,避免了创建多个实例带来的资源浪费和状态不一致问题。
二、GlobalThis 类代码实现
import { common } from '@kit.AbilityKit';
// 构造单例对象
export class GlobalThis {
private constructor() {}; // 私有构造函数,防止在外部使用new创建实例
private static instance: GlobalThis; // 定义一个私有变量,保存类的唯一实例
private _uiContexts = new Map<string, common.UIAbilityContext>();
private _stringValues = new Map<string, string>(); // 字符串值
private _numberValues = new Map<string, number>(); // 数字值
private _boolValues = new Map<string, boolean>(); // 布尔值
private _objectValues = new Map<string, object>(); // 对象值
public static getInstance(): GlobalThis {
if (!GlobalThis.instance) {
GlobalThis.instance = new GlobalThis();
}
return GlobalThis.instance;
}
getContext(key: string): common.UIAbilityContext | undefined {
return this._uiContexts.get(key);
}
setContext(key: string, value: common.UIAbilityContext): void {
this._uiContexts.set(key, value);
}
// 字符串值方法
setStringValue(key: string, value: string): void {
this._stringValues.set(key, value);
}
getStringValue(key: string): string | undefined {
return this._stringValues.get(key);
}
// 数字值方法
setNumberValue(key: string, value: number): void {
this._numberValues.set(key, value);
}
getNumberValue(key: string): number | undefined {
return this._numberValues.get(key);
}
// 布尔值方法
setBoolValue(key: string, value: boolean): void {
this._boolValues.set(key, value);
}
getBoolValue(key: string): boolean | undefined {
return this._boolValues.get(key);
}
// 对象值方法
setObjectValue<T extends object>(key: string, value: T): void {
this._objectValues.set(key, value);
}
getObjectValue<T extends object>(key: string): T | undefined {
return this._objectValues.get(key) as T | undefined;
}
// 删除方法
removeValue(key: string): boolean {
return this._stringValues.delete(key);
}
removeContext(key: string): boolean {
return this._uiContexts.delete(key);
}
}
三、代码详解
- 单例实现:
- 通过私有构造函数确保外部无法直接创建实例
- 使用静态方法 getInstance() 获取唯一实例
- 数据存储:
- 使用不同类型的 Map 存储各种类型数据
- 支持存储字符串、数字、布尔值和对象类型
- 支持存储 UIAbilityContext 对象用于页面跳转等操作
- 类型安全:
- 利用 TypeScript 泛型确保对象存取的类型安全
- 使用泛型 T 可以在获取时保留原有类型信息
- 数据操作方法:
- 提供了各种类型的 setter 和 getter 方法
- 支持删除已存储的值和上下文
四、简单使用示例
1. 存储和获取基本数据类型
// 获取单例对象
import { GlobalThis } from './utils/globalThis';
const global = GlobalThis.getInstance();
// 存储数据
global.setStringValue('appName', 'MyHarmonyApp');
global.setNumberValue('version', 1.0);
global.setBoolValue('isFirstLaunch', true);
// 获取数据
const appName = global.getStringValue('appName'); // "MyHarmonyApp"
const version = global.getNumberValue('version'); // 1.0
const isFirstLaunch = global.getBoolValue('isFirstLaunch'); // true
console.info(`应用名称: ${appName}, 版本: ${version}`);
2. 存储和获取对象数据
// 定义一个简单的用户信息对象
interface UserInfo {
id: string;
name: string;
isVip: boolean;
}
// 存储用户信息
const userInfo: UserInfo = {
id: '123456',
name: '张三',
isVip: true
};
// 将对象存入全局
global.setObjectValue('currentUser', userInfo);
// 在其他地方获取用户信息
const currentUser = global.getObjectValue<UserInfo>('currentUser');
if (currentUser) {
console.info(`当前用户: ${currentUser.name}, VIP状态: ${currentUser.isVip}`);
}
五、应用场景
- 全局配置管理:存储API地址、超时设置等
- 用户状态共享:跨页面共享登录信息
- 主题设置:全局主题切换
- 临时数据缓存:减少重复网络请求
六、注意事项
- 仅存储必要的共享数据,避免滥用
- 注意键名冲突问题
- 大型应用可能需要更复杂的状态管理解决方案
七、总结
GlobalThis类提供了一种简洁有效的全局数据共享方式,特别适合中小型HarmonyOS应用。通过合理使用,可以大幅简化组件间通信,提升开发效率。
欢迎关注我的CSDN博客,持续分享更多HarmonyOS开发技巧和最佳实践!
1471

被折叠的 条评论
为什么被折叠?



