自定义存储驱动 (StorageDriver)
概述
存储驱动 (StorageDriver) 是一个专门用于存储和管理数据的接口,它主要负责:
- 数据的存储和读取
- 数据的删除操作
- 数据的分区管理
- 数据变更监控
关于存储的详细接口信息,请参阅开发者手册 storage 。
核心类型定义
StorageContext 基础类
typescript
class StorageContext {
public id: string;
public feature: string;
}
StorageContext
类用于标识存储的数据和特性。
PDFViewer 相关接口
typescript
interface PDFViewer {
getInstanceId(): string;
}
interface PDFViewerConstructor {
new(options: {
instanceId: string,
customs: {
storageDriver: StorageDriver;
}
}): PDFViewer;
}
实例 ID 说明
getInstanceId()
方法用于获取 PDFViewer 实例的唯一标识。当存在多个实例时,请确保每个实例的 ID 都是唯一的。
StorageDriver 接口
typescript
interface StorageDriver {
getAll(context: StorageContext): Promise<Record<string, any>>;
get<T>(context: StorageContext, key: string): Promise<T | null>;
set<T>(context: StorageContext, key: string, value: T): Promise<void>;
removeAll(context: StorageContext): Promise<void>;
remove(context: StorageContext, key: string): Promise<void>;
onChange<T>(callback: (event: StorageDriverChangeEvent<T>) => void): Function;
onRemove(callback: (event: StorageDriverRemoveEvent) => void): Function;
}
核心方法说明:
getAll
: 获取指定上下文中的所有数据get
: 获取指定键的数据set
: 设置指定键的数据removeAll
: 移除所有数据remove
: 移除指定键的数据onChange
: 注册数据变化监听onRemove
: 注册数据删除监听
事件相关接口
typescript
interface StorageDriverChangeEvent<T> {
context: StorageContext;
key: string;
oldValue: T;
newValue: T;
}
interface StorageDriverRemoveEvent {
context: StorageContext;
key: string;
}
实现自定义存储驱动
下面是一个基于 sessionStorage 实现的示例:
typescript
class MyStorageDriver extends StorageDriver {
private readonly eventEmitter = new EventEmitter();
// 生成存储空间名称
private getSpace(context: StorageContext): string {
return [context.id, context.feature].join('.');
}
// ... existing code ...
// 核心存储方法实现
async set<T>(context: StorageContext, key: string, value: T): Promise<void> {
const storageKey = this.generateUniqueKey(context, key);
const oldValueJSON = sessionStorage.getItem(storageKey);
const oldValue = oldValueJSON ? JSON.parse(oldValueJSON) : undefined;
const newValue = JSON.stringify(value);
if (oldValueJSON === newValue) return;
sessionStorage.setItem(storageKey, newValue);
this.emitChangeEvent({
context,
key,
oldValue,
newValue: value
});
}
// ... existing code ...
}
完整实现
完整的示例代码请参考上文的 MyStorageDriver 类实现。该示例演示了如何:
- 使用 EventEmitter 处理事件
- 实现数据的分区存储
- 处理数据变更通知
使用自定义存储驱动
创建 PDFViewer 实例时,通过 customs 选项传入自定义的 StorageDriver:
typescript
const storageDriver = new MyStorageDriver();
const pdfViewer = new PDFViewer({
instanceId: 'pdf-viewer-1',
customs: {
storageDriver: storageDriver
}
});
最佳实践
- 为每个 PDFViewer 实例指定唯一的 instanceId
- 根据业务需求选择合适的存储方式(localStorage、IndexedDB 等)
- 实现数据分区管理,避免不同实例间的数据混淆