首页 > 其他分享 >OpenHarmony应用ArkUI 状态管理开发范例

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

时间:2023-09-01 11:36:20浏览次数:50  
标签:范例 OpenHarmony AppStorage curBp UI 组件 ArkUI currentLocation 变量

 

本文转载自《#2023盲盒+码# OpenHarmony应用ArkUI 状态管理开发范例》,作者:zhushangyuan_

 

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

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

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

管理组件拥有的状态

@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
 

  

参考资料

橘子购物示例应用

标签:范例,OpenHarmony,AppStorage,curBp,UI,组件,ArkUI,currentLocation,变量
From: https://www.cnblogs.com/openharmony/p/17671401.html

相关文章

  • OpenHarmony设备截屏的5种方式
     本文转载自《OpenHarmony设备截屏的5种方式》,作者westinyang 目录● 方式1:系统控制中心● 方式2:OHScrcpy投屏工具 `推荐`● 方式3:DevEcoStudio截屏功能● 方式4:hdc shell snapshot_display● 方式5:hdc shell wukong● 持续关注演示视频:https://www.bil......
  • HarmonyOS/OpenHarmony(Stage模型)卡片开发应用上下文Context使用场景二
    3.创建其他应用或其他Module的Context基类Context提供创建其他应用或其他Module的Context的方法为createModuleContext(moduleName:string),创建其他应用或者其他Module的Context,从而通过该Context获取相应的资源信息(例如获取其他Module的获取应用开发路径信息)。调用createModuleCon......
  • HarmonyOS/OpenHarmony(Stage模型)卡片开发应用上下文Context使用场景一
    1.获取应用文件路径基类Context提供了获取应用文件路径的能力,ApplicationContext、AbilityStageContext、UIAbilityContext和ExtensionContext均继承该能力。应用文件路径属于应用沙箱路径。上述各类Context获取的应用文件路径有所不同。通过ApplicationContext获取应用级别的应用......
  • #2023盲盒+码# OpenHarmony应用ArkUI 状态管理开发范例
    OpenHarmony应用ArkUI状态管理开发范例【本文正在参加2023「盲盒」+码有奖征文活动】https://ost.51cto.com/posts/25284OpenHarmony应用ArkUI状态管理开发范例本文根据橘子购物应用,实现ArkUI中的状态管理。在声明式UI编程框架中,UI是程序状态的运行结果,用户构建了一个UI模......
  • OpenHarmony平台驱动案例--UART
    1、程序介绍本程序是基于OpenHarmony标准系统编写的平台驱动案例:UART详细资料请参考官网:UART平台驱动开发UART应用程序开发2、基础知识2.1、UART简介UART指异步收发传输器(UniversalAsynchronousReceiver/Transmitter),是通用串行数据总线,用于异步通信。该总线双向通信,可以......
  • OpenHarmony 分布式硬件关键技术
     本文转载自 OpenHarmony TSC 官方微信公众号《峰会回顾第8期 | OpenHarmony 分布式硬件关键技术》  演讲嘉宾 | 李   刚回顾整理 | 廖   涛排版校对 | 李萍萍嘉宾简介李刚,华为OpenHarmony技术专家,OpenHarmony分布式硬件技术负责人。主要负责OpenH......
  • 软件测试 | 一个简单的Java范例
    下面给出一个简单的Java程序范例,观察Java成都基本结构及相同点。范例:定义一个简单类publicclassTestJava{publicstaticvoidmain(String[]args){//Java操作的一个简单范例,输出和乘方intnum=10;......
  • OpenHarmony应用实现二维码扫码识别
     本文转载自《OpenHarmony应用实现二维码扫码识别》,作者zhushangyuan_  概念介绍二维码的应用场景非常广泛,在购物应用中,消费者可以直接扫描商品二维码,浏览并购买产品,如图是购物应用的扫描二维码的页面。本文就以橘子购物示例应用为例,来讲解OpenHarmony应用二维码开发相......
  • GIS开发与应用(PostgreSQL空间数据库各种查询语句范例以及SQL语句查询空间关系)_postgre
    实验二PG空间数据库应用实验目的:实验准备实验内容及要求实验过程及步骤:1、创建空间数据库nyc,在nyc空间数据库中创建geometries表,对表中插入Point、Linestring、Polygon、PolygonWithHole、collection等几何要素。2、查看geometries表中的几何图形的元数据。使用`ST_G......
  • Windows搭建OpenHarmony编译环境
    由于OpenHarmony的编译工具链主要是建立在Linux操作系统下,如需要编译OpenHarony内核则需要搭建虚拟机等工序,相对比较繁琐。那么,是否可以在Windows操作系统上实现对OpenHarmony编译呢?答案是:可以。所以,我们今天来尝试在Windows环境下搭建OpenHarmony编译环境。本次OpenHarmony选用小......