首页 > 其他分享 >#2023盲盒+码# OpenHarmony应用ArkUI 状态管理开发范例

#2023盲盒+码# OpenHarmony应用ArkUI 状态管理开发范例

时间:2023-08-25 12:07:24浏览次数:40  
标签:OpenHarmony AppStorage curBp 盲盒 UI 2023 组件 currentLocation 变量

OpenHarmony应用ArkUI 状态管理开发范例

【本文正在参加 2023「盲盒」+码有奖征文活动】 https://ost.51cto.com/posts/25284

OpenHarmony应用ArkUI 状态管理开发范例

本文根据橘子购物应用,实现ArkUI中的状态管理。

在声明式UI编程框架中,UI是程序状态的运行结果,用户构建了一个UI模型,其中应用的运行时的状态是参数。当参数改变时,UI作为返回结果,也将进行对应的改变。这些运行时的状态变化所带来的UI的重新渲染,在ArkUI中统称为状态管理机制。

自定义组件拥有变量,变量必须被装饰器装饰才可以成为状态变量,状态变量的改变会引起UI的渲染刷新。如果不使用状态变量,UI只能在初始化时渲染,后续将不会再刷新。 下图展示了State和View(UI)之间的关系。

state_UI.png

管理组件拥有的状态

@State装饰器:组件内状态

@State装饰的变量,或称为状态变量,一旦变量拥有了状态属性,就和自定义组件的渲染绑定起来。当状态改变时,UI会发生对应的渲染改变。

在状态变量相关装饰器中,@State是最基础的,使变量拥有状态属性的装饰器,它也是大部分状态变量的数据源。

@link装饰器:父子双向同步

子组件中被@Link装饰的变量与其父组件中对应的数据源建立双向数据绑定。

@Link装饰的变量与其父组件中的数据源共享相同的值。

@Component
export struct DetailPage {
  @State currentLocation: string = ''
}

在父组件DetailPage中声明当前定位currentLocation变量

Panel(this.isPanel) {
    Location({ isPanel: $isPanel, currentLocation: $currentLocation })
}

将currentLocation变量传给子组件Location

@Component
export struct Location {
  @Link currentLocation: string
}

子组件用@Link装饰的currentLocation接收。

  @Builder cityList(city: any) {
    if (this.currentLocation === city.name) {
      List() {
        ForEach(city.city, twoCity => {
          ListItem() {
            Column() {
              Text(`${twoCity}`)
                .width('100%')
                .height(30)
                .fontSize(14)
                .onClick(() => {
                  this.currentLocation = city.name + '/' + twoCity
                })
            }
          }
        })
      }
      .width('100%')
      .divider({ strokeWidth: 2, color: $r('app.color.divider'), startMargin: 0, endMargin: 20 })
    }
  }

子组件中的currentLocation变量改变会同步父组件中的currentLocation。

管理应用拥有的状态

AppStorage是应用全局的UI状态存储,是和应用的进程绑定的,由UI框架在应用程序启动时创建,为应用程序UI状态属性提供中央存储。

和LocalStorage不同的是,LocalStorage是页面级的,通常应用于页面内的数据共享。而对于AppStorage,是应用级的全局状态共享。AppStorage使用场景和相关的装饰器:@StorageProp和@StorageLink

@StorageProp

@StorageProp(key)是和AppStorage中key对应的属性建立单向数据同步,我们允许本地改变的发生,但是对于@StorageProp,本地的修改永远不会同步回AppStorage中,相反,如果AppStorage给定key的属性发生改变,改变会被同步给@StorageProp,并覆盖掉本地的修改。

@Entry
@Component
struct HomePage {
  @State curBp: string = 'md' // curBp指当前窗口断点,sm代表小屏,md代表中屏,lg代表大屏
}

Home.ets页面中,用@State声明当前窗口类型:curBp变量并赋初值为md,代表中屏。

  isBreakpointSM = (mediaQueryResult) => {
    if (mediaQueryResult.matches) {
      this.curBp = 'sm'
      AppStorage.SetOrCreate('curBp', this.curBp)
    }
  }
  isBreakpointMD = (mediaQueryResult) => {
    if (mediaQueryResult.matches) {
      this.curBp = 'md'
      AppStorage.SetOrCreate('curBp', this.curBp)
    }
  }
  isBreakpointLG = (mediaQueryResult) => {
    if (mediaQueryResult.matches) {
      this.curBp = 'lg'
      AppStorage.SetOrCreate('curBp', this.curBp)
    }
  }

根据屏幕尺寸,将curBp设置为相应的值,并用SetOrCreate()方法保存在AppStorage中。

在子组件NavigationHomePage中直接使用curBp变量

@Entry
@Component
export struct NavigationHomePage {
  @StorageProp('curBp') curBp: string = 'sm'
}

curBp是根据窗口的尺寸判断的,是不能改变的,因此使用@StorageProp('curBp')与AppStorage('curBp')建立单向数据同步。

@StorageLink

@StorageLink(key)是和AppStorage中key对应的属性建立双向数据同步:

  1. 本地修改发生,该修改会被同步回AppStorage中;
  2. AppStorage中的修改发生后,该修改会被同步到所有绑定AppStorage对应key的属性上,包括单向(@StorageProp和通过Prop创建的单向绑定变量)、双向(@StorageLink和通过Link创建的双向绑定变量)变量和其他实例(比如PersistentStorage)。
@Entry
@Component
struct HomePage {
  @StorageLink('shoppingCartGoodsList') shoppingCartGoodsList: { data: { id: number } }[] = []
}

Home.ets页面中,用@StorageLink装饰器定义shoppingCartGoodsList,用于获取全局的购物车商品列表。

this.emitterClass.setShoppingCartGoodsList((eventData)=>{
    this.shoppingCartGoodsList.push(eventData.data.id)
    AppStorage.SetOrCreate('shoppingCartGoodsList', this.shoppingCartGoodsList)
})

使用AppStorage.SetOrCreate('shoppingCartGoodsList', this.shoppingCartGoodsList)将购物车商品列表保存在AppStorage中。

因为购物车中的商品会联动的变化,比如在商品的详情页将商品添加至购物车,在首页也需要更新购物车信息,因此购物车商品列表采用@StorageLink装饰器装饰,与AppStorage('shoppingCartGoodsList')建立双向同步。

运行测试效果

执行以下命令,可以下载橘子购物应用工程:

git init
git config core.sparsecheckout true
echo code/Solutions/Shopping/OrangeShopping/ > .git/info/sparse-checkout
git remote add origin https://gitee.com/openharmony/applications_app_samples.git
git pull origin master

参考资料

橘子购物示例应用

本文作者:zhushangyuan_

想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com/#bkwz​

标签:OpenHarmony,AppStorage,curBp,盲盒,UI,2023,组件,currentLocation,变量
From: https://blog.51cto.com/harmonyos/7228053

相关文章

  • 宏电股份入选2023年深圳软件行业“推荐优秀产品”和“标杆案例”
    为加快建设我市软件名企名品展示中心,打造深圳市软件名品库,提升软件产业品牌集聚效应,推动我市软件产业高质量发展,深圳市软件行业协会开展2023年深圳软件行业“推荐优秀产品”、“推荐创新产品”、“标杆案例”、“领域专家”征集工作。宏电股份“H1600D智能水位监测站”和“岳麓区师......
  • 行业报告 | 2023人工智能发展白皮书
    原创|文BFT机器人在科技日新月异的今天,人工智能已成为最具革命性的技术之一,有望对人类社会生活产生显著的影响。过去几年,人工智能相关理论研究技术创新、软硬件升级等整体推进,极大地促进了人工智能行业的发展。进入2022年,以chatGPT为代表的人工智能大模型火爆全球,AIGC也掀起新......
  • 【Java复杂系统实战经验-2023-08月】Java基础,Path路径计算编码
    Java程序设计-个人月报-2023-08月背景在本月,给负责的项目做了一次文件存储的迁移工作。历史原因,开发阶段由于图简便,使用了本地文件存储。后面经过容器化上云,导致应用出现上传文件分发的多节点的问题。本项工作的经验,受益于Java基础Path的一些API,颇有收获。复杂的系统应当构......
  • OpenHarmony平台驱动案例--UART
    1、程序介绍本程序是基于OpenHarmony标准系统编写的平台驱动案例:UART详细资料请参考官网:UART平台驱动开发UART应用程序开发2、基础知识2.1、UART简介UART指异步收发传输器(UniversalAsynchronousReceiver/Transmitter),是通用串行数据总线,用于异步通信。该总线双向通信,可以......
  • 【2023-08-24】任风不动
    20:00幸福这东西就像星星一样,黑暗是遮不住它们的,总会有空隙可寻。                                                 ——泰戈尔什么样的年纪,就要做什么样的事情。这是......
  • 暑假集训D24 2023.8.22 contest I
    C.CityFolding题意:有一个由\(2^n\)条等长线段组成的线,你可以进行\(n\)次对折,可以从左向右对折或从右向左对折,给出初始时线段的编号\(P\),问如何对折\(n\)次才能使对折后该线段恰好在从下往上数第\(H\)层?\(\operatorname{Solution}\)构造可以倒过来考虑这个......
  • 2023下半年杭州/武汉/深圳NPDP产品经理国际认证开班啦
    产品经理国际资格认证NPDP是新产品开发方面的认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。  【认证机构】 产品开发与管理协会(PDMA)成立于1979年,是全球范围内产品开发与管理专业人士最杰出的倡导者,协助个人、企业......
  • 活动 | 塑造软件新生态 赋能发展新变革——GreatSQL 受邀2023国际软博会
    塑造软件新生态,赋能发展新变革。8月31日-9月2日,第二十五届中国国际软件博览会将于天津梅江会展中心召开。本届软博会由中国电子信息行业联合会主办,聚焦全球软件前沿技术与产业发展方向,充分展示软件赋能数字经济、信息技术应用创新、工业互联网平台、智能制造及元宇宙等多领域发展......
  • JetBrains 2023.2全新发布!IDEA、PyCharm等支持AI辅助
    日前JetBrains官方团队正式宣布旗下IDE系列产品今年第二个重要版本——v2023.2全新发布,涵盖了 IntelliJIDEA、PyCharm、WebStorm等一众知名产品,接下来我们一起详细了解一下他们的更新重点吧~IntelliJIDEAv2023.2——引入AI辅助开发IntelliJIDEA 2023.2版本引入了AIAssistant......
  • 活动 | 塑造软件新生态 赋能发展新变革——GreatSQL 受邀2023国际软博会
    塑造软件新生态,赋能发展新变革。8月31日-9月2日,第二十五届中国国际软件博览会将于天津梅江会展中心召开。本届软博会由中国电子信息行业联合会主办,聚焦全球软件前沿技术与产业发展方向,充分展示软件赋能数字经济、信息技术应用创新、工业互联网平台、智能制造及元宇宙等多领域发展......