HarmonyOS鸿蒙-@State@Prop装饰器限制条件
一、组件Components级别的状态管理:
@State组件内状态限制条件
1.@State装饰的变量必须初始化,否则编译期会报错。
// 错误写法,编译报错
@State count: number;// 正确写法
@State count: number = 10;
2.嵌套属性的赋值观察不到。
// 嵌套的属性赋值观察不到
this.title.name.value = 'ArkUI';
3.数组项中属性的赋值观察不到。
// 嵌套的属性赋值观察不到
this.title[0].value = 6;
4.@State不支持装饰Function类型的变量,框架会抛出运行时错误。
5.@State装饰简单使用场景,执行Button组件的更新方法,实现按需刷新。
@Entry
@Component
struct MyComponent {@State count: number = 0;build() {Button(`click times: ${this.count}`).onClick(() => {this.count += 1;})}
}
6.@State支持联合类型和undefined和null
@State count: number | undefined = 0;
二、@Prop装饰器:父子单向同步 限制条件
1.概述
@Prop装饰的变量和父组件建立单向的同步关系:
@Prop变量允许在本地修改,但修改后的变化不会同步回父组件。
当数据源更改时,@Prop装饰的变量都会更新,并且会覆盖本地所有更改。因此,数值的同步是父组件到子组件(所属组件),子组件数值的变化不会同步到父组件。
2.限制条件
@Prop装饰变量时会进行深拷贝,在拷贝的过程中除了基本类型、Map、Set、Date、Array外,都会丢失类型。例如PixelMap等通过NAPI提供的复杂类型,由于有部分实现在Native侧,因此无法在ArkTS侧通过深拷贝获得完整的数据。
@Prop装饰器不能在@Entry装饰的自定义组件中使用。
3.当使用undefined和null的时候,建议显式指定类型,
遵循TypeScript类型校验,比如:
@Prop a : string | undefined = undefined 是推荐的,
@Prop a: string = undefined 不推荐
4.嵌套传递层数,更建议使用@ObjectLink。
在组件复用场景,建议@Prop深度嵌套数据不要超过5层,
嵌套太多会导致深拷贝占用的空间过大以及GarbageCollection(垃圾回收),
引起性能问题,此时更建议使用@ObjectLink。
5.@Prop装饰的变量是私有的,只能在组件内访问。
6. @Prop 观察不到第二层的变化, 对于这种嵌套场景,如果class是被@Observed装饰的,可以观察到class属性的变化,@Prop嵌套场景。
@Prop title: Model;
// 可以观察到第一层的变化
this.title.value = 'Hi';
// 观察不到第二层的变化
this.title.info.value = 'ArkUI';
7.@Prop装饰的数据更新依赖其所属自定义组件的重新渲染,所以在应用进入后台后,@Prop无法刷新,推荐使用@Link代替。
8.@Prop装饰状态变量未初始化错误
@Prop需要被初始化,如果没有进行本地初始化的,则必须通过父组件进行初始化。
如果进行了本地初始化,那么是可以不通过父组件进行初始化的。
PS: 看代码中注释部分
@Observed
class Commodity {public price: number = 0;constructor(price: number) {this.price = price;}
}@Component
struct PropChild1 {@Prop fruit: Commodity; // 未进行本地初始化build() {Text(`PropChild1 fruit ${this.fruit.price}`).onClick(() => {this.fruit.price += 1;})}
}@Component
struct PropChild2 {@Prop fruit: Commodity = new Commodity(1); // 进行本地初始化build() {Text(`PropChild2 fruit ${this.fruit.price}`).onClick(() => {this.fruit.price += 1;})}
}@Entry
@Component
struct Parent {@State fruit: Commodity[] = [new Commodity(1)];build() {Column() {Text(`Parent fruit ${this.fruit[0].price}`).onClick(() => {this.fruit[0].price += 1;})// @PropChild1本地没有初始化,必须从父组件初始化PropChild1({ fruit: this.fruit[0] })// @PropChild2本地进行了初始化,可以不从父组件初始化,也可以从父组件初始化PropChild2()PropChild2({ fruit: this.fruit[0] })}}
}
9.使用a.b(this.object)形式调用,不会触发UI刷新
PS: 看代码中注释部分
class Score {value: number;constructor(value: number) {this.value = value;}static changeScore1(score:Score) {score.value += 1;}
}@Entry
@Component
struct Parent {@State score: Score = new Score(1);build() {Column({space:8}) {Text(`The value in Parent is ${this.score.value}.`).fontSize(30).fontColor(Color.Red)Child({ score: this.score })}.width('100%').height('100%')}
}@Component
struct Child {@Prop score: Score;changeScore2(score:Score) {score.value += 2;}build() {Column({space:8}) {Text(`The value in Child is ${this.score.value}.`).fontSize(30)Button(`changeScore1`).onClick(()=>{// 通过静态方法调用,无法触发UI刷新// Score.changeScore1(this.score); -- 不推荐// 通过赋值添加 Proxy 代理 -- 推荐let score1 = this.score;Score.changeScore1(score1); })Button(`changeScore2`).onClick(()=>{// 使用this通过自定义组件内部方法调用,无法触发UI刷新// this.changeScore2(this.score); -- 不推荐// 通过赋值添加 Proxy 代理 -- 推荐let score2 = this.score;this.changeScore2(score2);})}}
}
谢谢大家!!!
文档中心
HarmonyOS鸿蒙-ArkUI状态管理--多种装饰器-CSDN博客
HarmonyOS鸿蒙- 一行代码自动换行技巧_鸿蒙换行-CSDN博客
HarmonyOS鸿蒙 - 判断手机号、身份证(正则表达式)_鸿蒙 正则表达式-CSDN博客
HarmonyOS鸿蒙- 延时执行_鸿蒙 延迟执行-CSDN博客
HarmonyOS鸿蒙- 跳转系统应用能力_鸿蒙系统应用跳转设置-CSDN博客
HarmonyOS鸿蒙-DevEco Studio工具_select a device first.-CSDN博客
相关文章:
HarmonyOS鸿蒙-@State@Prop装饰器限制条件
一、组件Components级别的状态管理: State组件内状态限制条件 1.State装饰的变量必须初始化,否则编译期会报错。 // 错误写法,编译报错 State count: number;// 正确写法 State count: number 10; 2.嵌套属性的赋值观察不到。 // 嵌套的…...
Java Web开发进阶——Spring Boot与Spring Data JPA
Spring Data JPA 是 Spring 提供的一种面向数据访问的持久化框架,它简化了 JPA 的实现,为开发者提供了一种快速操作数据库的方式。在结合 Spring Boot 使用时,开发者能够快速完成数据库访问层的开发。 1. 介绍Spring Data JPA 1.1 什么是Spr…...
Vue Router4
Vue Router 是 Vue.js 官方的路由管理器。Vue Router 基于路由和组件的映射关系,监听页面路径的变化,渲染对应的组件。 安装: npm install vue-router。 基本使用: // src/router/index.js import {createRouter, createWebHa…...
计算机网络之---应用层协议概述
应用层协议概述 应用层协议是OSI模型中的第7层(应用层)定义的一组规则,用于支持和管理不同应用程序之间的通信。应用层协议定义了数据交换的格式、规则和约定,使得不同的系统或应用能够互相理解并正确地交换数据。它直接面向用户并…...
html + css 顶部滚动通知栏示例
前言 在现代网页设计中,一个吸引人的顶部滚动通知栏不仅能够有效传达重要信息,还能提升用户体验。通过使用HTML和CSS,我们可以创建既美观又功能强大的组件,这些组件可以在不影响网站整体性能的情况下提供实时更新或紧急通知。 本…...
【Rust自学】11.6. 控制测试运行:并行和串行(连续执行)测试
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.6.1. 控制测试的运行方式 cargo test和cargo run一样,cargo test也会编译代码并生成一个二进制文件用于测试,…...
某漫画网站JS逆向反混淆流程分析
文章目录 1. 写在前面1. 接口分析2. 反混淆分析 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Pyth…...
React 中事件机制详细介绍:概念与执行流程如何更好的理解
React 的事件机制是一个非常重要的概念,它涉及到 React 如何处理用户的交互事件。React 的事件系统与传统的 DOM 事件系统有所不同,它在底层使用了事件委托和合成事件(Synthetic Events)来优化性能。下面,我们将从 Rea…...
Day04-后端Web基础(Maven基础)
目录 Maven课程内容1. Maven初识1.1 什么是Maven?1.2 Maven的作用1.2.1 依赖管理1.2.2 项目构建1.2.3 统一项目结构 2. Maven概述2.1 Maven介绍2.2 Maven模型2.3 Maven仓库2.4 Maven安装2.4.1 下载2.4.2 安装步骤 3. IDEA集成Maven3.1 配置Maven环境3.1.2 全局设置 3.2 Maven项…...
vue3模板语法+响应式基础
模板语法 1. disabled指令,可以用于禁用按钮 <button :disabled"isButtonDisabled">Button</button> //:disabled是一个指令,用于根据isButtonDisabled的值来动态控制按钮的禁用状态。 使用场景: 1.防止用户重复点击…...
【面试题】简单聊一下什么是云原生、什么是k8s、容器,容器与虚机相比优势
云原生(Cloud Native) 定义:云原生是一种构建和运行应用程序的方法,旨在充分利用云计算的优势。它涵盖了一系列技术和理念,包括容器化、微服务架构、自动化部署与管理等。特点:云原生应用程序被设计为可弹性…...
数据挖掘实训:天气数据分析与机器学习模型构建
随着气候变化对各行各业的影响日益加剧,精准的天气预测已经变得尤为重要。降雨预测在日常生活中尤其关键,例如农业、交通和灾害预警等领域。本文将通过机器学习方法,利用历史天气数据预测明天是否会下雨,具体内容包括数据预处理、…...
STM32如何使用内部晶振作为晶振
目录 前言 首先说明一下芯片内部并没有时钟, 而是内部振荡。使用内部振荡的好处是外部无需设计晶振电路 ,再说的简单点 ,不用外部晶振依然可以让单片机正常运转。 环境: 芯片:STM32F103C8T6 Keil:V5.24…...
【Maui】导航栏样式调整
前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。 使用 .NET MAUI,可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。 .NET MAUI 是一款开放源代码应用,是 X…...
【黑马程序员三国疫情折线图——json+pyechart=数据可视化】
json数据在文末 将海量的数据处理成我们肉眼可以进行分析的形式,数据的可视化,可以分为两个步骤: 数据处理:利用三方网站厘清json层次格式化,再对文件的读取、检查是否符合JSON规范以及规范化、JSON格式的转化&#…...
如何实现多级缓存?
本文重点说一说在Java应用中,多级缓存如何实现。 多级缓存是比较常见的一种性能优化的手段,一般来说就是本地缓存分布式缓存。 本地缓存一般采用Caffeine和Guava,这两种是性能比较高的本地缓存的框架。他们都提供了缓存的过期、管理等功能。…...
Saas数据库迁移单租户数据
1、背景 租户使用Saas系统,用一段时间后要将系统、数据搬迁到自建服务器。该Saas系统没有按租户分库,且数据库数据量太大,需要将单租户的数据抽取出来。Saas系统使用Mysql5.7数据库,主要使用INFORMATION_SCHEMA.COLUMNS表进行数据…...
LeetCode100之括号生成(22)--Java
1.问题描述 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例1 输入:n 3 输出:["((()))","(()())","(())()","()(())","()()()&qu…...
阿里云ios镜像源
阿里云镜像源:阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 下载centos7...
芯片:为何英伟达的GPU能在AI基础设施领域扮演重要角色?
英伟达的GPU之所以能在AI基础设施领域扮演重要角色,主要源于其硬件架构的优势以及其与深度学习算法的高度兼容性。以下是几个关键因素: 1. 并行计算能力 GPU(图形处理单元)本质上是为处理大量并行计算任务而设计的。与CPU相比&a…...
OpenClaw性能对比测试:Qwen3-4B与Qwen3-32B模型任务执行效率
OpenClaw性能对比测试:Qwen3-4B与Qwen3-32B模型任务执行效率 1. 测试背景与目标 最近在本地部署OpenClaw时遇到了一个实际选择难题:作为个人开发者,到底该选择Qwen3-4B这样的轻量模型,还是直接上Qwen3-32B这样的"大家伙&qu…...
OpenClaw多模态技能库:Qwen3.5-9B-AWQ-4bit实现10种图片处理场景
OpenClaw多模态技能库:Qwen3.5-9B-AWQ-4bit实现10种图片处理场景 1. 为什么需要多模态技能库? 去年我接手了一个个人项目,需要批量处理几百张产品照片。手动用PS抠图、调色、加文字,花了两周才完成。当时就想:如果能…...
揭秘冷轧精密带钢DC03-C340:3大核心特性如何赋能精密制造?
朋友们,今天咱们不聊虚的,就聊聊工厂车间里最实在的东西——材料。你是不是也遇到过这样的烦心事:花大价钱买回来的钢带,一上冲床就开裂,废品率居高不下;或者热处理后表面出现诡异的蓝线,抛光怎…...
PyAutoGUI实战:给你的旧软件做个‘外挂’,自动完成游戏日常或软件测试
PyAutoGUI实战:用Python打造智能自动化助手,解放双手提升效率 在数字时代,重复性任务如同无形的枷锁,消耗着我们的时间和精力。想象一下,每天打开电脑后,你需要重复点击十几个相同的按钮,填写相…...
使用Image - To - image条件生成对抗网络评估乳腺癌新辅助化疗反应的动态对比增强MRI血管渗透性映射
论文总结1、提出了一种基于条件生成对抗网络(cGAN)的新方法,用于将动态对比增强磁共振成像(DCE MRI)快速转换为药代动力学(PK)血管通透性参数图(Ktrans),以早…...
[STM32问题解决(2)]编译错误:Error: L6218E的深度解析与实战排查指南
1. 认识Error: L6218E编译错误 当你正在Keil MDK环境下开发STM32项目时,突然弹出一个红色错误提示:"Error: L6218E: Undefined symbol xxx (referred from xxx.o)",这可能是每个STM32开发者都会遇到的经典问题。我第一次遇到这个错…...
从原理到代码:用Python实现简易变焦跟踪算法(OpenCV实战)
从原理到代码:用Python实现简易变焦跟踪算法(OpenCV实战) 在计算机视觉领域,变焦跟踪是一个既基础又关键的技术难题。想象一下,当你用手机拍摄远处景物时,镜头从广角切换到长焦的过程中,画面往往…...
clusterProfiler进阶指南:如何利用R语言进行多组学数据的功能富集分析与可视化
clusterProfiler进阶指南:如何利用R语言进行多组学数据的功能富集分析与可视化 在生物信息学领域,功能富集分析是将高通量组学数据转化为生物学洞见的关键步骤。作为R/Bioconductor生态中的明星工具,clusterProfiler以其强大的分析能力和丰富…...
translategemma-4b-it优化升级:Ollama部署后提升翻译质量的4个技巧
translategemma-4b-it优化升级:Ollama部署后提升翻译质量的4个技巧 你已经成功用Ollama部署了translategemma-4b-it,看着它把图片里的英文变成中文,是不是觉得挺神奇的?但用了几次后,你可能会发现一些问题:…...
Bambu Studio 3D打印切片实战指南:从技术原理到场景应用
Bambu Studio 3D打印切片实战指南:从技术原理到场景应用 【免费下载链接】BambuStudio PC Software for BambuLab and other 3D printers 项目地址: https://gitcode.com/GitHub_Trending/ba/BambuStudio Bambu Studio作为一款专为3D打印优化的开源切片软件&…...
