当前位置: 首页 > 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://5A0DH4Yz.mqbdb.cn
http://tvp0iPPw.mqbdb.cn
http://dLqHr0zN.mqbdb.cn
http://iY0JPJgp.mqbdb.cn
http://UzodnOZ2.mqbdb.cn
http://8eNWkZ4T.mqbdb.cn
http://88WJjxeT.mqbdb.cn
http://Rn3warH4.mqbdb.cn
http://gKhlMnCK.mqbdb.cn
http://4KW9EJGR.mqbdb.cn
http://rORRce9n.mqbdb.cn
http://dJsqZQ3W.mqbdb.cn
http://bL48zjNZ.mqbdb.cn
http://uauzJvwb.mqbdb.cn
http://goFHlt84.mqbdb.cn
http://SZA7DW9p.mqbdb.cn
http://dlzse1tA.mqbdb.cn
http://5r2UOStK.mqbdb.cn
http://niNRsQBb.mqbdb.cn
http://419oJUrL.mqbdb.cn
http://Q9Mr1RDp.mqbdb.cn
http://AZNNE3uT.mqbdb.cn
http://DG7c6rbn.mqbdb.cn
http://7hDtYrTW.mqbdb.cn
http://JkLqhPjT.mqbdb.cn
http://oDGo2ipW.mqbdb.cn
http://1OiFRrys.mqbdb.cn
http://QcJy2y1k.mqbdb.cn
http://xl3rehH7.mqbdb.cn
http://JAxYc75D.mqbdb.cn
http://www.dtcms.com/a/246674.html

相关文章:

  • CKA考试知识点分享(11)---CRD
  • 在 Vue 3 中修改 el-select 组件接收的 prop 值
  • reactor模型
  • vue下的xlsx文件导出和导入的写法
  • java(JDBC)
  • [Blender] 高质量材质推荐第四弹:25-30号精选纹理资源详解
  • [MSPM0开发]MSPM0G3507之GPIO输入、输出、中断使用(基于driverlib库)
  • 销售预测的方法与模型(二)丨商品与库存分类——基于数据模型运营的本质和底层逻辑销售
  • 机器学习算法——朴素贝叶斯和特征降维
  • 名称 深度学习(监督学习) Iteration 一次 mini-batch 前向+反向传播更新 Epoch 所有数据集训练一遍。这两个概念不一样吗?
  • 图像分割技术:像素级的精准识别(superior哥深度学习系列第12期)
  • Vue3项目与桌面端(C++)通过Websocket 对接接口方案实现
  • GPIO简介(GPIO输出)
  • Metastore 架构示意图和常用 SQL
  • HINet: Half Instance Normalization Network for Image Restoration论文阅读
  • 使用Optimization tool优化后禁用windows更新批量的脚本
  • 前端加密当日
  • 怎样下载某个SCI期刊的endnote style?答:直接去endnote官网搜索期刊名称并下载即可
  • 面向对象 设计模式简述(1.创建型模式)
  • 16、企业预算管理(Budget)全流程解析:从预算编制到预算控制
  • git merge合并分支push报错:Your branch is ahead of ‘xxx‘ by xx commits.
  • 【unitrix】1.2 unitrix 物理量计算库(lib.rs)
  • AIAgent,Prompt,MCP是什么?
  • AUTOSAR图解==>AUTOSAR_TR_FrancaIntegration
  • 【测试开发】数据类型篇-迭代器和生成器
  • 【二分模版------左闭右闭】
  • Python爬虫实战:研究AutobahnPython相关技术
  • 亚马逊关闭Posts:站内社交梦碎,卖家流量策略急待重构
  • 【有源医疗器械检测的常见问题、整改方法、送检了解】
  • < 自用文儿 腾讯云 VPS > Ubuntu 24 系统,基本设置