当前位置: 首页 > news >正文

网站承建商有哪些济南seo外贸网站建设

网站承建商有哪些,济南seo外贸网站建设,广告接单网站,学校网站建设培训心得体会文章大纲 引言一、AppStorage 应用全局的UI状态存储1、StorageProp和StorageLink装饰器建立联系2、StorageProp2.1、StorageProp使用规则2.2、StorageProp变量的传递/访问规则2.3、StorageProp支持的观察变化2.4、StorageProp 值初始化和更新 3、StorageLink3.1、StorageLink使…

文章大纲

  • 引言
  • 一、AppStorage 应用全局的UI状态存储
    • 1、@StorageProp和@StorageLink装饰器建立联系
    • 2、@StorageProp
      • 2.1、@StorageProp使用规则
      • 2.2、@StorageProp变量的传递/访问规则
      • 2.3、@StorageProp支持的观察变化
      • 2.4、@StorageProp 值初始化和更新
    • 3、@StorageLink
      • 3.1、@StorageLink使用规则
      • 3.2、@StorageLink变量的传递/访问规则
      • 3.3、@StorageLink支持的观察变化
      • 3.4、@StorageLink 值初始化和更新
    • 4、AppStorage与PersistentStorage以及Environment配合使用时的注意事项
  • 二、AppStorage 的应用
    • 1、在代码逻辑使用AppStorage和LocalStorage
    • 2、从UI内部使用AppStorage和LocalStorage

引言

前面文章介绍了跨页面之间的数据同步和状态存储机制LocalStorageOpenHarmony 入门——ArkUI 跨页面数据同步和页面级UI状态存储LocalStorage小结(二)的基础语法和使用,这一篇介绍了应用进程级别的状态存储机制AppStorage。

一、AppStorage 应用全局的UI状态存储

AppStorage是应用全局的UI状态存储,是和应用的进程绑定的,由UI框架在应用程序启动时创建,为应用程序UI状态属性提供中央存储。和AppStorage不同的是,LocalStorage是页面级的,通常应用于页面内的数据共享;而AppStorage是应用级的全局状态共享,还相当于整个应用的“中枢”,持久化数据PersistentStorage和环境变量Environment都是通过AppStorage中转,才可以和UI交互。AppStorage将在应用运行过程保留其属性。属性通过唯一的键字符串值访问。AppStorage可以和UI组件同步,且可以在应用业务逻辑中被访问。AppStorage支持应用的主线程内多个UIAbility实例间的状态共享。
AppStorage中的属性可以被双向同步,数据可以是存在于本地或远程设备上,并具有不同的功能,比如数据持久化(详见PersistentStorage)。这些数据是通过业务逻辑中实现,与UI解耦,如果希望这些数据在UI中使用,需要用到@StorageProp和@StorageLink。

1、@StorageProp和@StorageLink装饰器建立联系

原理其实和LocalStorage中的@LocalStorageProp和@LocalStorageLink大同小异,都是通过各自的装饰器建立联系从而完成数据同步和状态存储。

如果要建立AppStorage和自定义组件的联系,需要使用**@StorageProp和@StorageLink装饰器。使用@StorageProp(key)/@StorageLink(key)装饰组件内的变量,key标识了AppStorage的属性。当自定义组件初始化的时候,会使用AppStorage中对应key的属性值将@StorageProp(key)/@StorageLink(key)装饰的变量初始化。由于应用逻辑的差异,无法确认是否在组件初始化之前向AppStorage实例中存入了对应的属性,所以AppStorage不一定存在key对应的属性,因此@StorageProp(key)/@StorageLink(key)装饰的变量必须进行本地初始化**。@StorageProp(key)是和AppStorage中key对应的属性建立单向数据同步,允许本地改变,但是对于@StorageProp,本地的修改永远不会同步回AppStorage中,相反,如果AppStorage给定key的属性发生改变,改变会被同步给@StorageProp,并覆盖掉本地的修改。

2、@StorageProp

2.1、@StorageProp使用规则

在这里插入图片描述

2.2、@StorageProp变量的传递/访问规则

在这里插入图片描述
在这里插入图片描述

2.3、@StorageProp支持的观察变化

  • 当装饰的数据类型为boolean、string、number类型时,可以观察到数值的变化。
  • 当装饰的数据类型为class或者Object时,可以观察到赋值和属性赋值的变化,即Object.keys(observedObject)返回的所有属性。
  • 当装饰的对象是array时,可以观察到数组添加、删除、更新数组单元的变化。

2.4、@StorageProp 值初始化和更新

  • 当@StorageProp(key)装饰的数值改变被观察到时,修改不会被同步回AppStorage对应属性键值key的属性中。
  • 当前@StorageProp(key)单向绑定的数据会被修改,即仅限于当前组件的私有成员变量改变,其他的绑定该key的数据不会同步改变。
  • 当@StorageProp(key)装饰的数据本身是状态变量,它的改变虽然不会同步回AppStorage中,但是会引起所属的自定义组件的重新渲染。
  • 当AppStorage中key对应的属性发生改变时,会同步给所有@StorageProp(key)装饰的数据,@StorageProp(key)本地的修改将被覆盖。

3、@StorageLink

3.1、@StorageLink使用规则

在这里插入图片描述

3.2、@StorageLink变量的传递/访问规则

在这里插入图片描述

3.3、@StorageLink支持的观察变化

  • 当装饰的数据类型为boolean、string、number类型时,可以观察到数值的变化。
  • 当装饰的数据类型为class或者Object时,可以观察到赋值和属性赋值的变化,即Object.keys(observedObject)返回的所有属性。
  • 当装饰的对象是array时,可以观察到数组添加、删除、更新数组单元的变

3.4、@StorageLink 值初始化和更新

  • 当@StorageLink(key)装饰的数值改变被观察到时,修改将被同步回AppStorage对应属性键值key的属性中。
  • AppStorage中属性键值key对应的数据一旦改变,属性键值key绑定的所有的数据(包括双向@StorageLink和单向@StorageProp)都将同步修改。
  • 当@StorageLink(key)装饰的数据本身是状态变量,它的改变不仅仅会同步回AppStorage中,还会引起所属的自定义组件的重新渲染。

4、AppStorage与PersistentStorage以及Environment配合使用时的注意事项

  • 在AppStorage中创建属性后,调用PersistentStorage.persistProp()接口时,会使用在AppStorage中已经存在的值,并覆盖PersistentStorage中的同名属性,所以建议要使用相反的调用顺序,反例可见在PersistentStorage之前访问AppStorage中的属性;
  • 如果在AppStorage中已经创建属性后,再调用Environment.envProp()创建同名的属性,会调用失败。因为AppStorage已经有同名属性,Environment环境变量不会再写入AppStorage中,所以建议AppStorage中属性不要使用Environment预置环境变量名。
  • 状态装饰器装饰的变量,改变会引起UI的渲染更新,如果改变的变量不是用于UI更新,只是用于消息传递,推荐使用 emitter方式。例子可见不建议借助@StorageLink的双向同步机制实现事件通知。

二、AppStorage 的应用

AppStorage是单例,它的所有API都是静态的,使用方法类似于LocalStorage中对应的非静态方法。

1、在代码逻辑使用AppStorage和LocalStorage

AppStorage.setOrCreate('PropA', 47);let storage: LocalStorage = new LocalStorage();
storage.setOrCreate('PropA',17);
let propA: number | undefined = AppStorage.get('PropA') // propA in AppStorage == 47, propA in LocalStorage == 17
let link1: SubscribedAbstractProperty<number> = AppStorage.link('PropA'); // link1.get() == 47
let link2: SubscribedAbstractProperty<number> = AppStorage.link('PropA'); // link2.get() == 47
let prop: SubscribedAbstractProperty<number> = AppStorage.prop('PropA'); // prop.get() == 47link1.set(48); // two-way sync: link1.get() == link2.get() == prop.get() == 48
prop.set(1); // one-way sync: prop.get() == 1; but link1.get() == link2.get() == 48
link1.set(49); // two-way sync: link1.get() == link2.get() == prop.get() == 49storage.get<number>('PropA') // == 17
storage.set('PropA', 101);
storage.get<number>('PropA') // == 101AppStorage.get<number>('PropA') // == 49
link1.get() // == 49
link2.get() // == 49
prop.get() // == 49

2、从UI内部使用AppStorage和LocalStorage

@StorageLink变量装饰器与AppStorage配合使用,正如@LocalStorageLink与LocalStorage配合使用一样。此装饰器使用AppStorage中的属性创建双向数据同步。

代码就不写了,除了创建和使用的装饰器不一样其他都一样

  • AppStorage.setOrCreate函数创建AppStorage 实例

不建议开发者使用@StorageLink和AppStorage的双向同步的机制来实现事件通知,因为AppStorage中的变量可能绑定在多个不同页面的组件中,但事件通知则不一定需要通知到所有的这些组件。并且,当这些@StorageLink装饰的变量在UI中使用时,会触发UI刷新,带来不必要的性能影响。开发者可以使用emit订阅某个事件并接收事件回调的方式来减少开销,增强代码的可读性。

// xxx.ets
import emitter from '@ohos.events.emitter';let NextID: number = 0;class ViewData {title: string;uri: Resource;color: Color = Color.Black;id: number;constructor(title: string, uri: Resource) {this.title = title;this.uri = urithis.id = NextID++;}
}@Entry
@Component
struct Gallery2 {dataList: Array<ViewData> = [new ViewData('flower', $r('app.media.icon')), new ViewData('OMG', $r('app.media.icon')), new ViewData('OMG', $r('app.media.icon'))]scroller: Scroller = new Scroller()private preIndex: number = -1build() {Column() {Grid(this.scroller) {ForEach(this.dataList, (item: ViewData) => {GridItem() {TapImage({uri: item.uri,index: item.id})}.aspectRatio(1).onClick(() => {if (this.preIndex === item.id) {return}let innerEvent: emitter.InnerEvent = { eventId: item.id }// 选中态:黑变红let eventData: emitter.EventData = {data: {"colorTag": 1}}emitter.emit(innerEvent, eventData)if (this.preIndex != -1) {console.info(`preIndex: ${this.preIndex}, index: ${item.id}, black`)let innerEvent: emitter.InnerEvent = { eventId: this.preIndex }// 取消选中态:红变黑let eventData: emitter.EventData = {data: {"colorTag": 0}}emitter.emit(innerEvent, eventData)}this.preIndex = item.id})}, (item: ViewData) => JSON.stringify(item))}.columnsTemplate('1fr 1fr')}}
}@Component
export struct TapImage {@State tapColor: Color = Color.Black;private index: number = 0;private uri: Resource = {id: 0,type: 0,moduleName: "",bundleName: ""};onTapIndexChange(colorTag: emitter.EventData) {if (colorTag.data != null) {this.tapColor = colorTag.data.colorTag ? Color.Red : Color.Black}}aboutToAppear() {//定义事件IDlet innerEvent: emitter.InnerEvent = { eventId: this.index }emitter.on(innerEvent, data => {this.onTapIndexChange(data)})}build() {Column() {Image(this.uri).objectFit(ImageFit.Cover).border({ width: 5, style: BorderStyle.Dotted, color: this.tapColor })}}
}
http://www.dtcms.com/a/478062.html

相关文章:

  • Flink1.20 CEP【水位线异常原因深度分析】
  • 30个酷炫HTML+CSS特效源码
  • vtkGaussianBlurPass代码解析
  • 网站制作过程合理的步骤是福州网站推广优化
  • 牛客算法基础noob71 学生综合评估系统
  • 如何清除 Yarn 缓存 ?
  • 做听书网站怎么做用动易建设网站教程
  • 东丽开发区做网站公司响应式网站源码下载
  • RabbitMQ为什么使用AMQP协议
  • 阜新本地网站建设平台百度竞价推广价格
  • Linux 系统启动过程
  • 多制式基站综合测试线的架构与验证实践 (2)
  • 如何阿里巴巴网站做推广方案沈阳妇科哪个医院比较专业
  • 合肥网站seo优化排名手机端网站首页怎么做
  • AI人工智能-机器学习-第一周(小白)
  • 【开题答辩过程】以《基于SpringBoot和Vue框架的智能宠物之家系统的设计与实现》为例,不会开题答辩的可以进来看看
  • 告别“手绘序列帧”:Substance Designer中的程序化VFX材质工作流
  • 网站策划与建设阶段的推广的目标办公空间设计网站
  • Ubuntu 24.04.3 LTS 设置静态IP
  • Spring 框架@Transactional注解,事务的各个传播行为的逻辑以及使用场景。
  • 福建巢网站建设chinacd小说wordpress
  • 轻松搭建RTMP推流、WebRTC拉流服务器SRS服务,源码编译安装
  • Linux内核架构浅谈26-Linux实时进程调度:优先级反转与解决方案
  • 企业官方网站建设目的网站基础知识
  • 天水市建设局企业注册网站紧急访问升级狼人通知
  • 计算机视觉进阶教学之颜色识别
  • 实战任务二:用扣子空间通过任务提示词制作精美PPT
  • 【Docker】13、Docker安装RustFS服务
  • 什么是 Web3 品牌?
  • 指纹技术深度剖析:从原理到实践的全方位探索