鸿蒙Next合理使用状态管理总结

在使用鸿蒙Next进行开发时,合理的状态管理对于优化UI性能和提升用户体验至关重要。许多开发者由于对状态管理特性了解不足,常遇到UI不刷新或刷新性能差的问题。本文将从合理使用属性、合理使用ForEach/LazyForEach等方面进行总结,帮助开发者掌握合理使用状态管理的方法。

一、合理使用属性

1. 将简单属性数组合并成对象数组

  • 问题场景:开发中常需设置多个组件的同一种属性,如Text组件内容、组件宽度高度等样式信息,将这些属性保存在简单类型数组中配合ForEach使用时,存在“冗余刷新”问题。例如,一个被@State修饰的number类型数组,改变其中一个元素值,其他绑定该数组元素的未改变值的Text组件也会刷新,这对UI刷新性能有负面影响。
  • 解决方法:将属性数组转变为对象数组,配合自定义组件,实现精准控制更新范围。例如,定义一个包含多个属性的对象类,将多个属性合并到该对象中,再将对象数组用于ForEach。这样,当改变对象内某个属性时,对于数组来说对象未变化,不会触发不必要的刷新。

2. 将复杂大对象拆分成多个小对象的集合

  • 问题场景:定义一个包含很多样式相关属性的大对象,并在父子组件间传递绑定到组件上时,修改其中某些属性会导致所有关联组件刷新,即使它们的属性未改变。如点击按钮更改UIStyle对象中的属性,会使所有关联uiStyle的组件刷新,影响应用性能。
  • 解决方法:将复杂大对象拆分成多个小对象的集合,减少“冗余刷新”,实现精准控制组件更新范围。拆分原则如下:
    • 只作用在同一个组件上的多个属性可拆分进同一个新类(如NeedRenderImage),适用于组件常因不关联属性改变而刷新的场景。
    • 经常被同时使用的属性可拆分进同一个新类(如NeedRenderScale等),适用于属性成对出现或作用在同一样式的情况。
    • 可能被用在多个组件上或相对独立的属性应单独拆分进一个新类(如NeedRenderAlpha等),适用于属性作用在多个组件或与其他属性无联系的情况。

3. 使用@Observed装饰或被声明为状态变量的类对象绑定组件

  • 被@Observed装饰或声明为状态变量的类对象,可用于组件间的数据传递和绑定,能有效管理组件状态,确保UI正确更新。

二、合理使用ForEach/LazyForEach

1. 减少使用LazyForEach的重建机制刷新UI

  • 问题场景:LazyForEach在数据发生变化时,会重新创建所有子组件,这可能导致性能问题,尤其是在数据量较大时。
  • 解决方法:尽量减少不必要的数据更新,避免频繁触发LazyForEach的重建机制。可以通过优化数据更新逻辑,只在必要时更新数据,减少UI的重新渲染次数。

2. 在ForEach中使用自定义组件搭配对象数组

  • 优点:在ForEach中使用自定义组件搭配对象数组,可以提高代码的可读性和可维护性,同时方便精准控制组件更新范围,避免不必要的刷新。
  • 示例:如上述将简单属性数组合并成对象数组的示例中,通过自定义组件Information与对象数组InfoList配合ForEach使用,实现了更精准的UI更新控制。

3. 注意事项

  • 在使用ForEach和LazyForEach时,确保数据的稳定性和唯一性,避免因数据变化导致组件异常更新。同时,注意合理设置组件的key值,以提高组件更新的效率和准确性。

通过合理使用属性、ForEach/LazyForEach等方法,开发者可以有效解决UI不刷新、刷新性能差等问题,提升鸿蒙Next应用的性能和用户体验。在实际开发中,应根据具体场景选择合适的状态管理策略,遵循相关原则和方法,以确保应用的高效稳定运行。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows如何安装Php 7.4

一、进入官网,选择其他版本 https://windows.php.net/download/ 二、配置环境变量 将解压后的php 路径在系统环境变量中配置一下 cmd 后输入 php-v

ensp 静态路由配置

A公司有广州总部、重庆分部和深圳分部3个办公地点,各分部与总部之间使用路由器互联。广州、重庆、深圳的路由器分别为R1、R2、R3,为路由器配置静态路由,使所有计算机能够互相访问,实训拓扑图如图所示 绘制拓扑图 给pc机配置ip地址…

红米Note 9 Pro5G刷LineageOS

LineageOS介绍 LineageOS 是一个基于 Android 的开源操作系统,是面向智能手机和平板电脑等设备的替代性操作系统。它是 CyanogenMod 的继承者,而 CyanogenMod 是曾经非常受欢迎的一个第三方 Android 定制 ROM。 在 2016 年,CyanogenMod 项目因…

ECharts实现数据可视化入门详解

文章目录 ECharts实现数据可视化入门详解一、引言二、基础配置1.1、代码示例 三、动态数据与交互2.1、代码示例 四、高级用法1、多图表组合1.1、在同一容器中绘制多个图表1.2、创建多个容器并分别初始化 ECharts 实例1.3、实现多图联动 五、总结 ECharts实现数据可视化入门详解…

盲盒3.0版h5版-可打包app-新优化版紫色版

整体界面ui美观大气,盲盒项目也是一直比较热门的,各大平台一直自己也有做。 感兴趣的小伙伴可以搭建做自己的项目。盲盒项目的利润率还是很大的。

MacbookPro M1 安装Hive

前提注意⚠️⚠️⚠️ 1)在安装Hive前确实需要安装MySQL,因为Hive可以使用MySQL作为元数据存储 2)在安装Hive之前,需要先安装Hadoop。Hive是一个构建在Hadoop之上的数据仓库软件,它使用Hadoop的HDFS(分布…

Crawl4AI:一个为大型语言模型(LLM)和AI应用设计的网页爬虫和数据提取工具实战

这里写目录标题 一、crawl4AI功能及简介1、简介2、特性 二、项目地址三、环境安装四、大模型申请五、代码示例1.生成markdown2.结构化数据 一、crawl4AI功能及简介 1、简介 Crawl4AI 是一个开源的网页爬虫和数据抓取工具,一个python项目,主要为大型语言…

游戏引擎学习第50天

仓库: https://gitee.com/mrxiao_com/2d_game Minkowski 这个算法有点懵逼 回顾 基本上,现在我们所处的阶段是,回顾最初的代码,我们正在讨论我们希望在引擎中实现的所有功能。我们正在做的版本是初步的、粗略的版本,涵盖我们认…

深度解读:Top14金融顶刊

作者Toby:来源:Python风控模型,Top14金融顶刊 各位同学好,我是Toby老师,今天为大家介绍金融风控领域的顶级学术期刊,用于小论文发布平台参考。 金融风控领域内有许多顶级学术期刊,它们发表高质…

【k8s】在ingress-controlller中Admission Webhook 的作用

介绍1 在 NGINX Ingress Controller 中,Admission Webhook 是一种用于增强 Kubernetes API 请求的机制,它允许你在资源(如 Ingress)被创建或更新之前对这些请求进行验证或修改。具体来说,Admission Webhook 在 NGINX I…

数据库管理-第271期 Oracle 23ai:用MongoDB的方式来操作JSON二元性(20241214)

数据库管理271期 2024-12-14 数据库管理-第271期 Oracle 23ai:用MongoDB的方式来操作JSON二元性(20241214)1 初始化数据1.1 创建用户1.2 导入数据1.3 创建JSON关系二元性视图 2 创建ORDS服务2.1 下载JDK172.2 安装ORDS2.3 启用MongoDB API2.4…

计网_虚拟局域网VLAN

2024.12.08:计算机网络虚拟局域网VLAN学习笔记 虚拟局域网VLAN VLAN背景(认真看)VLAN定义(最大的好处是隔离广播域)VLAN以太网帧格式的扩展划分虚拟局域网VLAN的方式虚拟局域网的优点 VLAN背景(认真看&…

深入探索JavaScript网络编程:AJAX与Axios库的完美结合

深入探索JavaScript网络编程:AJAX与Axios库的完美结合 在现代Web开发中,网络编程是不可或缺的一部分。AJAX(Asynchronous JavaScript and XML)技术使得网页能够在不重新加载整个页面的情况下与服务器进行数据交换,从而…

使用ENSP实现NAT(2)

一、NAT的类型 二、静态NAT 1.项目拓扑 2.项目实现 路由器AR1配置: 进入系统视图 sys将路由器命名为AR1 sysname AR1关闭信息中心 undo info-center enable 进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为192.168.10.254/24 ip address 192.168.10.254 24进…

lombok常用注解的功能和效果

官网:https://www.projectlombok.org github源码地址:https://github.com/rzwitserloot/lombok Lombok是一个Java库,它能通过注解的方式自动生成一些Java代码,从而减少代码冗余。以下是一些Lombok常用的注解: Data 功…

Oracle PDB的开启和关闭

[生产环境关闭与开启Oracle PDB] 【运维场景】 在运维Oracle PDB的时候经常要开启和关闭PDB,对关闭和开启PDB的操作要非常熟悉。 【操作方法】 1. PDB的打开与关闭 关闭和开启DB的时候要看DB的警告日志,日志位置(在Oracle用户下查看&…

【树莓派4B】MindSpore lite 部署demo

一个demo,mindspore lite 部署在树莓派4B ubuntu22.04中,为后续操作开个门! 环境 开发环境:wsl-ubuntu22.04分发版部署环境:树莓派4B,操作系统为ubuntu22.04mindspore lite版本:mindspore-li…

LivePortrait 部署笔记

LivePortrait 开源地址: https://github.com/KwaiVGI/LivePortrait 模型下载: export HF_ENDPOINThttps://hf-mirror.com huggingface-cli download --resume-download KwaiVGI/LivePortrait --local-dir models--KwaiVGI--LivePortrait

yarn修改缓存位置

查看缓存位置 以下三个命令分别为:bin是yarn存储命令的二进制文件,global存储全局node_modules ,cache存储用下下载缓存,查看本机目前的目录: 查看bin目录命令:yarn global bin 查看global目录命令&…

安卓 流量相关功能实现记录

1. 静态声明权限&#xff0c;在AndroidManifest.xml中申明 <uses-permission xmlns:tools"http://schemas.android.com/tools"android:name"android.permission.PACKAGE_USAGE_STATS"tools:ignore"ProtectedPermissions" /> 2.判断并动态…