ArkTS的状态管理机制(State)

什么是ArkTS的状态管理机制 

声明式UI中,是以状态(State)来驱动视图更新的(View)。

状态是指驱动视图更新的数据(被装饰器标记的变量)。

视图是指UI描述渲染得到的用户页面。

互动事件可以改变状态的值。状态改变以后,又会触发事件,渲染页面。

这就形成了ArkTS的状态管理机制。

ArkTS的装饰器

ArkTS中的状态管理分为很多种不同的装饰器,他们有多种不一样的作用

@state 、 @Prop、 @Link 、@Provide 、 @Consume 、 @Observed 、 @ObjectLink

State装饰器

注意:

  1. @State装饰器标记的变量必须初始化,不能为空值
  2. @State装饰器支持Object、class、string、number、boolean、enum等类型以及这些类型的数据,不可以any、union等复杂类型。
  3. 嵌套类型以及数组中的对象无法触发视图更新。

案例 HelloWorld

@Entry
@Component
struct Index {
  @State message: string = 'Hello World'

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(()=>{
            this.message = 'Hello ArkTS'
          })
      }
      .width('100%')
      .height('100%')
      .justifyContent(FlexAlign.Center)
    }

  }
}

我们将@State去掉 就不能产生这个效果。 因为普通变量不能触发状态的渲染。

验证@State装饰器的作用

1.@State装饰器必须初始化

我们发现State装饰器没有初始值会报错。所以State装饰器必须要有初始值。

2.@State装饰器的支持类型

1.基本类型

 我们前面使用的是基本类型string,证明@State是支持基本类型的。

2.对象类型

我们定义一个类,@State使用对象类型来做声明。 


class Person{
  name:string
  age:number

  constructor(name:string,age:number) {
    this.name = name
    this.age = age
  }
}

@Entry
@Component
struct StatePage {
  @State p:Person = new Person('zhangsan',21)
  build() {
    Row() {
      Column() {
        Text(`${this.p.name} : ${this.p.age}`)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(()=>{
            this.p.age++
          })
      }
      .width('100%')
      .height('100%')
      .justifyContent(FlexAlign.Center)
    }

  }
}

我们会发现对象类型也可以动态的修改状态。

3.嵌套类型

嵌套类型中的属性改变不会触发视图的更新。


class Person{
  name:string
  age:number
  gf: Person

  constructor(name:string,age:number,gf?: Person) {
    this.name = name
    this.age = age
    this.gf = gf
  }
}

@Entry
@Component
struct StatePage {
  @State p:Person = new Person('zhangsan',21,new Person('LiSi',19))
  build() {
    Row() {
      Column() {
        Text(`${this.p.name} : ${this.p.age}`)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(()=>{
            this.p.age++
          })
        Text(`${this.p.gf.name} : ${this.p.gf.age}`)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(()=>{
            this.p.gf.age++
          })
      }
      .width('100%')
      .height('100%')
      .justifyContent(FlexAlign.Center)
    }

  }
}

我们会发现使用嵌套类型的时候,嵌套的对象不可以触发视图的更新。但其实值是加上的,在点击对象类型的时候,触发了渲染。 

4.数组

当@State声明的类型是一个数组的时候,数组的增添会触发视图的渲染,但是数组中如果存在对象,对象内的属性的更改不会触发渲染。


class Person{
  name:string
  age:number
  gf: Person

  constructor(name:string,age:number,gf?: Person) {
    this.name = name
    this.age = age
    this.gf = gf
  }
}

@Entry
@Component
struct StatePage {
  idx: number = 1
  @State p:Person = new Person('zhangsan',21,new Person('LiSi',19))
  @State gfs: Person[] = [
    new Person('WangWu',18),
    new Person('LaoLiu',78)
  ]
  build() {
    Row() {
      Column() {
        Text(`${this.p.name} : ${this.p.age}`)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(()=>{
            this.p.age++
          })
        Button('添加女友')
          .onClick(() => {
            this.gfs.push(new Person(`女友` + this.idx++,20))
          })
       Text('=女友列表=')
         .fontSize(50)
         .fontWeight(FontWeight.Bold)
        ForEach(
          this.gfs,
          (item,index) => {
            Row(){
              Text(`${item.name} : ${item.age}`)
                .fontSize(30)
                .onClick(()=>{
                  item.age++
                })
              Button("删除")
                .onClick(() => {
                  this.gfs.splice(index,1)
                })
            }
            .width('100%')
            .justifyContent(FlexAlign.SpaceAround)

          }
        )
      }
      .width('100%')
      .height('100%')
      .justifyContent(FlexAlign.Center)
    }

  }
}

我们会发现,增添和删除是可以触发页面的刷新呢,但是,数组中的对象的更改不会触发页面的渲染。

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

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

相关文章

电子取证中Chrome各版本解密Cookies、LoginData账号密码、历史记录

文章目录 1.前置知识点2.对于80.X以前版本的解密拿masterkey的几种方法方法一 直接在目标机器运行Mimikatz提取方法二 转储lsass.exe 进程从内存提取masterkey方法三 导出SAM注册表 提取user hash 解密masterkey文件(有点麻烦不太推荐)方法四 已知用户密…

QT作业4

实现一个闹钟&#xff0c;当输入时间后&#xff0c;点击启动到达时间后循环播报三遍&#xff0c;便签内容 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTextToSpeech> //文本转语言类 #include <QTimerEvent> //定…

国产数据库适配-达梦(DM)

1、通用性 达梦数据库管理系统兼容多种硬件体系&#xff0c;可运行于X86、X64、SPARC、POWER等硬件体系之上。DM各种平台上的数据存储结构和消息通信结构完全一致&#xff0c;使得DM各种组件在不同的硬件平台上具有一致的使用特性。 达梦数据库管理系统产品实现了平台无关性&…

机器视觉系统选型-线光源分类及应用场景

标准线光源 从线性LED的发光面照射漫射光 玻璃划痕检测印刷字符检测手机屏幕检测PCB板检测 高亮线光源 从线性LED的发光面照射高亮度漫射光高速流水线检测表面印刷检测表面缺陷检测 集光型线光源 从线性LED的发光面照射直射光划痕缺陷检测印刷字符检测布料检测 同轴线光源 与相…

基于深度学习的人脸测距&社交距离过近警报系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 近年来&#xff0c;随着深度学习技术的快速发展&#xff0c;人脸识别技术在各个领域得到了广泛应用。其中&#xff0c;人脸测距和社交距离过近警报系统成为了人们…

Leetcode刷题笔记题解(C++):328. 奇偶链表

思路&#xff1a;遍历链表生成奇链表和偶链表&#xff0c;然后拼接两个链表生成新的链表。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), ne…

链路追踪详解(四):分布式链路追踪的事实标准 OpenTelemetry 概述

目录 OpenTelemetry 是什么&#xff1f; OpenTelemetry 的起源和目标 OpenTelemetry 主要特点和功能 OpenTelemetry 的核心组件 OpenTelemetry 的工作原理 OpenTelemetry 的特点 OpenTelemetry 的应用场景 小结 OpenTelemetry 是什么&#xff1f; OpenTelemetry 是一个…

ubuntu20.04在noetic下编译orbslam2

ubuntu20.04在noetic下编译orbslam2 参考链接1&#xff1a;https://blog.csdn.net/qq_58869016/article/details/128660588 参考链接2&#xff1a;https://blog.csdn.net/dong123456789e/article/details/129693837 在noetic下的安装环境 1.库安装 sudo apt-get update sudo …

从零到一:influxdb时序性数据库的基本概念与操作指南

目录 ​编辑 引言 数据库(database) 创建数据库 删除数据库 进入数据库 展示influxdb中所有数据库 测量&#xff08;measurement&#xff09; 写入测量 展示测量 总结 引言 InfluxDB是一个开源的时序数据库&#xff0c;专门设计用于处理时间序列数据。它是由InfluxD…

详解MySQL中一条SQL执行过程

MySQL基本架构 如下图所示&#xff0c;从宏观角度来说MySQL架构可以分为server层和存储引擎层&#xff0c;其中Server层包含如下: 连接器:进行身份认证和权限相关校验。查询缓存:MySQL8.0已废弃&#xff0c;查询缓存主要是用于提高查询效率而加的一层缓存。分析器:对SQL执行动…

React中类组件和函数组件的区别?

面试官&#xff1a;说说对React中类组件和函数组件的理解&#xff1f;有什么区别&#xff1f; 一、类组件 类组件&#xff0c;顾名思义&#xff0c;也就是通过使用ES6类的编写形式去编写组件&#xff0c;该类必须继承React.Component 如果想要访问父组件传递过来的参数&#…

winform使用CefSharp嵌入VUE网页并交互

1、NuGet添加CefSharp 如果下载慢或失败可以更新下载源 腾讯资源https://mirrors.cloud.tencent.com/nuget/华为资源https://repo.huaweicloud.com/repository/nuget/v3/index.json 2、将项目平台改为X64 3、在winform窗体添加cef using CefSharp; using CefSharp.WinForms; u…

TSINGSEE青犀基于opencv的安全帽/反光衣/工作服AI检测算法自动识别及应用

安全帽/反光衣/工作服自动识别检测算法可以通过opencvyolo网络对现场画面中人员穿戴着装进行实时分析检测&#xff0c;判断人员是否穿着反光衣/安全帽。在应用场景中&#xff0c;安全帽/反光衣/工作服检测应用十分重要&#xff0c;通过对人员的规范着装进行实时监测与预警&…

Hexo Butterfly博客添加Google分析

Hexo Butterfly博客添加Google分析 进入谷歌分析官网:https://analytics.google.com/analytics/web/ 如下图所示: 点击开始评估 输入账户名,随便填就行,点击下一步 输入属性名称(随便填),填上你的博客域名,点击下一步 剩下的步骤按自己的情况填就行 最后会弹出一个弹窗,上面…

Spring相关面试题

文章目录 1.Spring用到了哪些设计模式&#xff1f;2.Spring支持几种bean的作用域3.单例bean是线程安全的吗&#xff1f;4.Spring如何处理线程并发问题的&#xff1f;5. Component, Controller, Repository,Service有什么区别&#xff1f;6. Resource 和 Autowired这两个注解有什…

城轨线路列车时刻表与车站客流控制协同优化方法

文章信息 论文题目为《城轨线路列车时刻表与车站客流控制协同优化方法》&#xff0c;该文于2021年发表于《交通运输系统工程与信息》上。文章考虑换入客流影响下列车时刻表与客流控制的协同优化问题&#xff0c;以最小化乘车延误人数为目标&#xff0c;以列车时刻表、客流控制和…

网络基础(九):VLAN的概述及配置

目录 前言 一、分割广播域的方法 二、VLAN 1、VLAN的概述及优势 1.1VLAN的概述 1.2VLAN的优势 2、VLAN的种类 3、VLAN的三种端口类型 4、VLAN 的工作原理 4.1VLAN数据帧 4.2VLAN的范围 4.2VLAN的access类型工作原理 4.3VLAN的trunk类型工作原理 4.4VLAN的Hybird类…

简单使用selenium抓取微博热搜话题存储进Excel表格中

#test.pyimport requests from selenium import webdriver import time from write import write#首先打开浏览器 drive webdriver.Chrome()#设置隐式等待&#xff1a;等待元素找到&#xff0c;如果找到元素则马上继续执行语句&#xff0c;如果找不到元素&#xff0c;会在设定…

机器人行业数据闭环实践:从对象存储到 JuiceFS

JuiceFS 社区聚集了来自各行各业的前沿科技用户。本次分享的案例来源于刻行&#xff0c;一家商用服务机器人领域科技企业。 商用服务机器人指的是我们日常生活中常见的清洁机器人、送餐机器人、仓库机器人等。刻行采用 JuiceFS 来弥补对象存储性能不足等问题。 值得一提的是&am…

C/C++: 关键路径

关键路径在找最早发生时间的时候要正着找&#xff0c;找最晚发生时间的时候要找到最后一个终点的最早发生时间后&#xff0c;倒着减去每个边的权值&#xff0c;就是各点的最晚发生时间。 具体注释在文中。 /** * * Althor: Hacker Hao * Create: 2023.12.13 /!ATTENTION!/ …