LocalStorage:页面级的状态存储
- 应用程序可以创建多个
LocalStorage实例,LocalStorage实例可以在页面内共享,也可以通过GetShared接口,实现跨页面、UIAbility实例内共享
- 组件树的根节点,即被
@Entry装饰的@Component,可以被分配一个LocalStorage实例,此组件的所有子组件实例将自动获得对该LocalStorage实例的访问权限
- 被
@Component装饰的组件最多可以访问一个LocalStorage实例和AppStorage,未被@Entry装饰的组件不可被独立分配LocalStorage实例,只能接受父组件通过@Entry传递来的LocalStorage实例。一个LocalStorage实例在组件树上可以被分配给多个组件
1、应用内使用
let obj: Record<string, Object> = { 'age': 18 };
let storage: LocalStorage = new LocalStorage(obj);
storage.setOrCreate('name', '刘雯');
storage.get('age');
const prop: SubscribedAbstractProperty<number> = storage.prop('age');
prop.get();
prop.set(1);
prop.get();
storage.get('age');
const link: SubscribedAbstractProperty<number> = storage.link('age');
link.get();
link.set(1);
link.get();
storage.get('age');
2、页面UI内部使用
let obj: Record<string, Object> = { 'age': 18, name: '刘雯' };
let storage: LocalStorage = new LocalStorage(obj);
@Entry(storage)
@Component Index {
@LocalStorageProp('age') age: number = 1;
@LocalStorageLink('name') name: string = '';
}
3、从UIAbility共享到一个或多个视图(推荐)
onWindowStageCreate(windowStage: window.WindowStage) {
windowStage.loadContent('pages/Index', this.storage);
}
let storage = LocalStorage.getShared();
@Entry(storage)
@Component Index {
@LocalStorageLink('age') age: number = 1;
}
let storage = LocalStorage.getShared();
@Entry(storage)
@Component Home {
@LocalStorageLink('age') age: number = 1;
}
4、根节点可通过@Entry来接收LocalStorage实例,自定义组件(子节点)也可以通过构造参数来传递LocalStorage实例
- 从API version 12开始,自定义组件支持接收LocalStorage实例
- 当自定义组件作为子节点,LocalStorage实例必须要放在第二个参数位置传递(第一个参数是传递给子组件的命名参数)
let obj1: Record<string, Object> = { 'age': 18 };
let storage1: LocalStorage = new LocalStorage(obj1);
let obj2: Record<string, Object> = { name: '刘雯' };
let storage2: LocalStorage = new LocalStorage(obj2);
@Entry(storage1)
@Component
struct Index {
build() {
Child({}, storage2)
}
}
@Component
struct Child {
@LocalStorageLink('name') name: string = '';
@LocalStorageLink('age') age: number = 0;
}