学习鸿蒙基础(7)

一、@Watch状态变量更改通知
@Watch应用于对状态变量的监听。如果开发者需要关注某个状态变量的值是否改变,可以使用@Watch为状态变量设置回调函数。
1、装饰器参数:必填。常量字符串,字符串需要有引号。是(string)=> void自定义成员函数的方法的引用。
2、可装饰的自定义组件变量:装饰器@State、 @Prop、@Link、@ObjectLink、@Provide、 @Consume、@StorageProp以及@StorageLink所装饰的变量均可以通过@Watch监听其变化。不允许监听常规变量。
3、装饰器的顺序:建议@State、@Prop、@Link等装饰器在@Watch装饰器之前。

示例代码:模拟购物车多选效果。显示多选的数量展示。选中的时候通过watch去监听到选中的状态。更新ui

import myList from '../components/myListWatch'
import Item from '../model/ItemFlag'

@Entry
@Component
struct PageWatch {
  @State text: string = ''
  @Provide list: Item [] = [
    new Item(Date.now(), "房子"),
    new Item(Date.now(), "车子")
  ]

  build() {
    Row() {
      Column() {
        Row(){
          Row() {
            CheckboxGroup({ group: "checkBoxGroup" })
            Text("全选")
            Button("删除").onClick(v => {
              this.list = this.list.filter(v =>!v.isChecked)
            }).margin({ left: "20" }).backgroundColor(Color.Red)

          }.margin({ top: "10", left: '20' })
          Summary()
        }.width("100%").justifyContent(FlexAlign.SpaceBetween)


        Row() {
          TextInput({ text: this.text }).width(250).onChange((value) => {
            this.text = value
          })
          Button("增加").onClick(() => {
            this.list.push(new Item(Date.now(), this.text))
            this.text = ""
          }).margin(10)
        }.width("100%").justifyContent(FlexAlign.SpaceBetween).margin(10)

        if (this.list.length) {
          ThisList()
        } else {
          Text("可你却总是笑我,一无所有")
        }

      }.width('100%')
      .height('100%')
    }
  }
}

@Component
struct ThisList {
  @Consume list: Item[];

  build() {
    Row() {
      List() {
        ForEach(this.list, (item, index) => {
          ListItem() {
            myList({ item, index })
          }.margin(10)
        })
      }.layoutWeight(1).divider({
        strokeWidth: 1,
        color: Color.Blue,
        startMargin: 10,
        endMargin: 10
      })
      .width('100%')
    }
  }
}

@Component
struct Summary {
  @Consume list: Item[];

  build() {
    Row() {
      Text(`${this.getchecked()}/${this.getTotal()}`).fontSize(26).margin({'left':14})
    }
  }

  getchecked(){
    return this.list.filter(item=>item.isChecked).length
  }

  getTotal(){
    return this.list.length
  }
}


import Item from '../model/ItemFlag';
//自定义组件  组件与组件之间是隔离的
@Component
struct myListWatch {
  @Consume list: Item [];//把list注入进来  不用去传递了
  @ObjectLink @Watch("onItemChecked") item: Item;
  private index: number;

  onItemChecked(){
    console.log("checked")
    this.list.splice(this.index,1,this.item)//删除当前的对象,在插入一个改变了的对象
  }

  build() {
    Row() {
      Checkbox({group:"checkBoxGroup"}).select(this.item.isChecked).onChange(v=>{
        this.item.isChecked=v
        console.log(JSON.stringify(this.item))
      })
      Text(this.item.text).fontSize(20).decoration(
        {type:this.item.isChecked?TextDecorationType.Underline:TextDecorationType.None,
          color:Color.Blue}
      )
      Button("删除").backgroundColor(Color.Red).onClick(() => {
        this.list.splice(this.index, 1)
      })
    }.justifyContent(FlexAlign.SpaceBetween).width("100%")
  }
}

export default myListObserved
@Observed class ItemFlag {
  id: number;
  text: string;
  isChecked:boolean;

  constructor(id: number, text: string,isChecked=false) {
    this.id = id
    this.text = text
    this.isChecked=isChecked
  }
}

export  default ItemFlag

二、页面间共享状态-LocalStorage

LocalStorage是页面级的UI状态存储,通过@Entry装饰器接收的参数可以在页面内共享同一个LoalStorage实例。LocalStorage也可以在UIAbility内,页面间共享状态。
LocalStorage根据与@Component装饰的组件的同步类型不同,提供了两个装饰器:
@LocalStorageProp: @LocalStorageProp装饰的变量和与LocalStorage中给定属性建立单向同步关系。
@LocalStorageLink:  @LocalStorageLink装饰的变量和在@Component中创建与LocalStorage中给定属性建立双向同步关系。

import router from '@ohos.router'
let storage=LocalStorage.GetShared()
@Entry(storage)
@Component
struct PageLocalStorage {
  @State message: string = 'Hello World'
  // @LocalStorageProp("name") n: string = ''
  @LocalStorageLink("name") n: string = ''
  build() {
    Row() {
      Column() {
        Text(this.n)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
        Button("跳转").onClick(v => {
          router.pushUrl({
            url:"pages/PageLSDetail"
          })
        })
        Son1()
      }
      .width('100%')
    }
    .height('100%')
  }
}

@Component
struct  Son1{
  @LocalStorageLink("name") m:string =""
  build(){
    Row(){
       Text(`child-${this.m}`)
    }
  }
}
import router from '@ohos.router'

let storage=LocalStorage.GetShared()
@Entry(storage)
@Component
struct PageLSDetail {
  @State message: string = 'Hello World'
  @LocalStorageLink("name") name:string=''

  build() {
    Row() {
      Column() {
        Text(this.name)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)

        Button("返回").onClick(v => {
          this.name="車子"
          router.back()
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}
import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';

export default class EntryAbility extends UIAbility {
  storage:LocalStorage =new LocalStorage({name:"房子"})
  onCreate(want, launchParam) {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }

  onDestroy() {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage) {
    // Main window is created, set main page for this ability
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    windowStage.loadContent('pages/PageLocalStorage', this.storage,(err, data) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
    });
  }

  onWindowStageDestroy() {
    // Main window is destroyed, release UI related resources
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground() {
    // Ability has brought to foreground
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground() {
    // Ability has back to background
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  }
}

三、AppStorage-应用全局的UI状态存储-非持久化

AppStorage是应用全局的UI状态存储,是和应用的进程绑定的,由UI框架在应用程序启动时创建,为应用程序UI状态属性提供中央存储。仅仅存储在内存当中。退出程序后。数据就丢失了。
AppStorage是在应用启动的时候会被创建的单例。它的目的是为了提供应用状态数据的中心存储,这些状态数据在应用级别都是可访问的。AppStorage将在应用运行过程保留其属性。属性通过唯一的键字符串值访问。
Appstorage可以和UI组件同步,且可以在应用业务逻辑中被访问。

    AppStorage.SetOrCreate("name","房子")
  @StorageProp("name") name:string =""

 

  @StorageLink("name") appname: string = ''

 四、PersistentStorage-持久化存储UI状态

PersistentStorage是应用程序中的可选单例对象。此对象的作用是持久化存储选定的AppStorage属性,以确保这些属性在应用程序重新启动时的值与应用程序关闭时的值相同。
PersistentStorage允许的类型和值有:
1、number,stringboolean,enum 等简单类型
2、可以被SON.stringify0和SON.parse0重构的对象。例如Date, Map, Set等内置类型则不支持,以及对象的属性方法不支持持久化了
注意:
PersistentStorage的持久化变量最好是小于2kb的数据,不要大量的数据持久化,因为PersistentStorage写入磁盘的操作是同步的,大量的数据本地化读写会同步在UI线程中执行,影响UI渲染性能。如果开发者需要存储大量的数据,建议使用数据库api。
PersistentStorage只能在UI页面内使用,否则将无法持久化数据。

//只能在page页面中,才能持久化。
PersistentStorage.PersistProp("name","房子")
  @StorageProp("name") name:string =""

 

  @StorageLink("name") appname: string = ''

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/487939.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

西安石油大学数学建模校赛培训(2)matlab的使用

1.1.MATLAB是什么? MATLAB是MathWorks公司推出的一套高性能数值分析计算软件,其名字来源于"Matrix Laboratory"(矩阵实验室)的缩写。它将矩阵运算、数值分析、图形处理、编程技术等功能集成在一起,为科学计…

203基于matlab的曲柄滑块机构的运动学仿真分析GUI

基于matlab的曲柄滑块机构的运动学仿真分析GUI,包括《系统仿真与matlab》综合试题文档。分析滑块速度、角速度,曲轴投影长。曲柄滑块机构的动画。程序已调通,可直接运行。 203 曲柄滑块机构 运动学仿真分析 - 小红书 (xiaohongshu.com)

【Docker】使用 Docker 主机启动 Nginx 服务器的步骤详解

文章目录 步骤一:安装Docker步骤二:拉取Nginx镜像步骤三:启动Nginx容器步骤四:访问Nginx服务器步骤五:管理Nginx容器总结 在本文中,我们将介绍如何使用Docker在主机上启动Nginx服务器。Nginx是一个高性能的…

Qt教程 — 3.5 深入了解Qt 控件:Display Widgets部件(1)

目录 1 Display Widgets简介 2 如何使用Display Widgets部件 2.1 QLabel组件-显示图像或文本 2.2 QCalendarWidget组件-日历简单的使用 2.3 QLCDNumber组件-控件作时钟的显示 2.4 QProgressBar组件-模拟手机电池充电 2.5 QFrame组件-绘制水平/垂直线 Display Widgets将分…

【物联网】Kafka 数据采集

基础信息 组件名称 : kafka-connector 组件版本: 1.0.0 组件类型: 系统默认 状 态: 正式发布 组件描述:通用kafka连接网关,消费来自kafka的数据,并转发给下一个节点做相关的数据解析。 配置文…

喜报 | 聚合科技荣获江苏省数字经济学会科学技术奖

近日,江苏省数字经济学会公布了2023年度江苏省数字经济学会科学技术奖获奖名单。本次在全省范围内共评选出科学技术进步奖、科学技术创新奖、优秀成果奖获奖项目共计19项。“聚合数据资产服务API平台”凭借其前沿的创新性和优秀的应用前景成功获得科学技术创新奖二等…

视频推拉流EasyDSS点播平台云端录像播放异常的问题排查与解决

视频推拉流EasyDSS视频直播点播平台可提供一站式的视频转码、点播、直播、视频推拉流、播放H.265视频等服务,搭配RTMP高清摄像头使用,可将无人机设备的实时流推送到平台上,实现无人机视频推流直播、巡检等应用。 有用户反馈,项目现…

2.7、创建列表(List)

概述 列表是一种复杂的容器,当列表项达到一定数量,内容超过屏幕大小时,可以自动提供滚动功能。它适合用于呈现同类数据类型或数据类型集,例如图片和文本。在列表中显示数据集合是许多应用程序中的常见要求(如通讯录、…

Apache Spark

一、Apache Spark 1、Spark简介 Apache Spark是用于大规模数据 (large-scala data) 处理的统一 (unified) 分析引擎。 Spark官网 Spark最早源于一篇论文Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing,该论文是由加州大学柏…

Harmony OS 网络编程 实验指南

netcat简介 netcat 是什么? netcat是一个非常强大的网络实用工具,可以用它来调试TCP/UDP应用程序; netcat 如何安装? Linux上可以使用发行版的包管理器安装,例如Debian/Ubuntu上: sudo apt-get instal…

cas学习2:idea里搭建cas项目

在上篇中介绍了cas服务在tomcat中怎么启动的及某j集成cas,这篇讲下idea怎么集成cas成一个项目,为后续的定制化开发做好铺垫。 1.下载CAS 模板 Overlay Template,我这里使用 Apereo CAS 5.3 版本,JDK需要1.8 地址:Git…

钡铼技术R40路由器助力构建无人值守的智能化污水处理厂

钡铼技术R40路由器作为智能化污水处理厂的关键网络设备,发挥着至关重要的作用,助力构建无人值守的智能化污水处理系统。在现代社会,污水处理是城市环境保护和可持续发展的重要组成部分,而智能化污水处理厂借助先进的技术和设备&am…

微信小程序wx.navigateTo无法跳转到Component组件问题解决。(共享元素动画必备)

关于Component构造器官方是有文档说明的,然后官方文档内部也给出了组件是可以通过像pages一样跳转的。但是官方文档缺少了必要的说明,会引起wx.navigateTo无法跳转到组件问题! 以下是官方文档截图: 解决方式: 组件创建…

4.2 循环语句loop,等差数列求和

汇编语言 1. 循环语句loop loop指令的格式是:loop 标号,CPU执行loop指令的时候,要进行两部操作 cx cx - 1;判断cx中的值,不为0则转至标号处执行程序,如果为0则向下执行 循环使用loop来实现,循环次数存…

flask_restful的基本使用

优势: Flask-Restful 是一个专门用来写 restful api 的一个插件。 使用它可以快速的集成restful api 接口功能。 在系统的纯api 的后台中,这个插件可以帮助我们节省很多时间。 缺点: 如果在普通的网站中,这个插件就没有优势了&…

技术文件分享 | 《基于倾斜摄影测量的城市级实景三维地理场景模型生产技术规程》.pdf

为提高利用倾斜摄影测量技术生产城市级实景三维地理场景模型成果水平,湖北省地理国情监测中心联合武汉大学、武汉大势智慧科技有限公司等单位制定了《基于倾斜摄影测量的城市级实景三维地理场景模型生产技术规程》,经湖北省市场监管局批准、备案,被收录为…

如何调用occtproxy放入自己的wpf文件

1.创建一个wpf程序 2.添加项目occtproxy.vcxproj 3.把该项目配置类型设为dll 4.添加引用 5.报错显示,这是因为还没有生成dll 6.把occtproxy设为启动项目运行,设定输出目录在该目录下,生成dll 7.再运行,即可

Oracle 控制文件详解

1、控制文件存储的数据信息 1)数据库名称和数据库唯一标识符(DBID) 2)创建数据库的时间戳 3)有关数据文件、联机重做日志文件、归档重做日志文件的信息 4)表空间信息 5)检查点信息 6)日志序列号…

tcp和udp分别是什么?udp和tcp的区别

TCP和UDP是计算机网络中常见的两种传输层协议,它们在实际应用中具有不同的特点和用途。本文将对TCP和UDP进行介绍,并分析它们之间的区别。 TCP和UDP分别是什么? TCP(Transmission Control Protocol) TCP是一种面向连…

Spring Boot | SpringBoo“开发入门“

目录 : 1.SpringBoot的“介绍”SpringBoot”概述” :SpringBoot”简介“SpringBoot的“优点” 2. SpringBoot入门程序环境准备使用 “Maven”方式构建SpringBoot 项目使用“Spring Initializr”方式构建Spring Boot 项目 3. “单元测试” 和“热部署”单元测试热部署…