当前位置: 首页 > news >正文

【鸿蒙开发】组件动态创建

组件动态创建的原理

在声明式范式中,所有的组件在build环节被创建出来,并挂在到组件书中。当组件非多多时,一次性全部创建出来将非常耗时,而通过动态创建组件可以在build环节之前对组件进行预创建,在页面实际加载时可以很快的拿来直接使用,从而加快页面渲染速度。

结合动画:

  • 没有预创建时:必须等待动画结束后进行组件创建。
  • 有预创建时:可以在动画加载中就开始创建组件,等动画结束后可以很快的显示组件。

动态创建组件的优势

减少自定义组件的创建开销

组件更新更快

灵活性高,可以自由控制组件中节点的更新,实现高效的节点树裁剪。

直接操作组件树

通过makeNode和replaceBuilderNode可以自由控制组件的创建和更新。

组件的动态添加、更新和删除

代码参考,可以直接在v5.0.5上运行。

import { BuilderNode, FrameNode, NodeController } from '@kit.ArkUI';// 动态组件的业务参数
class Params {text: string = 'Hello World';constructor(text: string) {this.text = text;}
}// 构建动态组件
@Builder
function buildText(params: Params) {Column() {Text(params.text).fontSize(50).fontWeight(FontWeight.Bold).margin({ bottom: 36 })}
}// 通过继承NodeController来控制动态组件的生命周期
class TextNodeController extends NodeController {private textNode: BuilderNode<[Params]> | null = null;private message: string = '';constructor(message: string) {super();this.message = message;}// 动态创建组件节点makeNode(context: UIContext): FrameNode | null {if (this.textNode == null) {this.textNode = new BuilderNode(context);this.textNode.build(wrapBuilder<[Params]>(buildText), new Params(this.message));}return this.textNode.getFrameNode();}// 动态替换组件节点replaceBuilderNode(newNode: BuilderNode<Object[]>) {this.textNode = newNode;this.rebuild();}}@Entry
@Component
struct Index {@State message: string = "hello";@State isShow: boolean = true;private textNodeController: TextNodeController = new TextNodeController(this.message);build() {Row() {Column() {if (this.isShow) { // 控制动态删除组件NodeContainer(this.textNodeController) // 动态添加组件.width('100%').height(100).backgroundColor('#FFF0F0F0')}Button('replaceNode').onClick(() => {// 通过按钮事件来动态更新组件// 用新的节点替换之前的节点this.textNodeController.replaceBuilderNode(this.buildNewNode());})}.width('100%').height('100%')}.height('100%')}// 生成新的节点buildNewNode(): BuilderNode<[Params]> {let uiContext: UIContext = this.getUIContext();let message = 'newNode';let textNode = new BuilderNode<[Params]>(uiContext);textNode.build(wrapBuilder<[Params]>(buildText), new Params(message))return textNode;}}

NodeController生命周期

NodeController用于控制和反馈对应的NodeContainer上的节点的行为,需要与NodeContainer一起使用。下面,对其常用生命周期函数进行说明。

  • makeNode必须要重写的方法,用于构建节点树、返回节点挂载在对应NodeContainer中。在对应NodeContainer创建绑定当前NodeController的时候调用、或者通过rebuild方法调用刷新。
  • aboutToResize当controller对应的NodeContainer在Mesure的时候进行回调,入参为节点的布局大小。
  • aboutToAppear当controller对应的NodeContainer在onAppear的时候进行回调。
  • aboutToDisappear当controller对应的NodeContainer在onDisappear的时候进行回调。
export abstract class NodeController {abstract makeNode(uiContext: UIContext): FrameNode | null;aboutToResize?(size: Size): void;aboutToAppear?(): void;aboutToDisappear?(): void;abstract rebuild(): void;onTouchEvent?(event: TouchEvent): void;
}
http://www.xdnf.cn/news/998713.html

相关文章:

  • Linux检验库是否安装成功
  • 多线程(4)
  • 【大模型】实践之1:macOS一键部署本地大模型
  • std::make_shared简化智能指针 `std::shared_ptr` 的创建过程,并提高性能(减少内存分配次数,提高缓存命中率)
  • Tomcat 和 Spring MVC
  • SQL进阶之旅 Day 29:NoSQL结合使用策略
  • docker-自动启动java 包
  • 使用VSCode开发FastAPI指南
  • Python 实现 Web 请求与响应
  • VSCode - Trae 插件关闭弹出框代码补全
  • 【C++学习笔记】 std::atomic 拷贝构造错误解析
  • docker-compose容器单机编排
  • el-select+el-tree实现树形下拉选择
  • tabs页签嵌套表格,切换表格保存数据不变并回勾
  • CSS 外边距合并(Margin Collapsing)问题研究
  • Karate 与Playwright的比较和融合
  • spring boot项目整合mybatis实现多数据源的配置
  • RAG Food Project
  • GAN+ECA注意力机制实现图像超分辨率重建
  • ESP32-C3FH4X—低功耗、高集成度的 MCU 系统级芯片 (SoC)
  • 基于数据库实现配置管理和定时任务启停
  • 强化学习:策略梯度概念
  • word用endnote插入国标参考文献
  • 在 Flutter 项目中iOS 的 App 图标和 App 名称 的设置
  • 探索 Excel-to-JSON:高效数据转换的利器
  • Linux Alias 魔法:命令行效率提升秘籍
  • R语言缓释制剂QBD解决方案之四
  • RK3588 + Ubuntu24.04 部署 rknn 模型——不用[特殊字符]版全流程教程
  • 管家婆软件下载中心-管家婆软件辉煌安装包下载、应用程序、最新版软件
  • STL难记忆却常用的用法集合(持续更新中)