HarmonyOS开发案例:创建全局自定义组件复用池-BuilderNode

news2025/1/11 12:47:44

介绍

本示例是全局自定义组件复用实现的示例代码,主要讲解如何通过BuilderNode创建全局的自定义组件复用池,实现跨页面的组件复用。

效果图预览

使用说明

  1. 继承NodeController,实现可复用的NodeItem组件。
  2. 使用单例模式创建NodePool组件复用池,根据传入的type类型查找复用池中是否存在可复用的组件,如果有则直接使用,如果没有则重新创建。
  3. 使用NodeContainer组件占位,从复用池NodePool中获取组件加载到页面中。

实现思路

  1. 使用List+Swiper实现Tabs页面切换,详细代码请参考BuilderNodePoolDemo.ets。

    ...
    Swiper(this.swiperController) {
      LazyForEach(this.array, () => {
        TabNode()
      }, (title: string) => title)
    }
    ...
  2. 继承NodeController,实现makeNode,用于组件的创建或刷新,并在组件隐藏时(aboutToDisappear)回收组件,详细代码请参考BuilderNodePool.ets中的NodeItem实现。

    export class NodeItem extends NodeController {
      private callback: UpdaterCallback | null = null;
      ...
      // 父类方法,用于创建子组件
      makeNode(uiContext: UIContext): FrameNode | null {
        if (!this.node) {
          this.node = new BuilderNode(uiContext);
          this.node.build(this.builder, this.data);
        } else {
          this.node.update(this.data);
          this.update(this.data);
        }
        return this.node.getFrameNode();
      }
      // 组件隐藏时回收组件
      aboutToDisappear(): void {
        NodePool.getInstance().recycleNode(this.type, this);
      }
      ...
    }
  3. 使用单例模式实现复用池,应用内统一管理组件复用。添加getNode方法,根据传入的type参数,获取对应的Node组件,如果未找到,则重新创建,实现recycleNode方法,回收Node组件,详细代码请参考BuilderNodePool.ets中的NodePool实现。

    ...
    export class NodePool {
      private static instance: NodePool;
      ...
    
      private constructor() {
        this.nodePool = new HashMap();
        this.nodeHook = new HashSet();
        this.idGen = 0;
      }
      // 单例模式,可以全局统一管理
      public static getInstance() {
        if (!NodePool.instance) {
          NodePool.instance = new NodePool();
        }
        return NodePool.instance;
      }
      ...
      public getNode(type: string, data: ESObject, builder: WrappedBuilder<ESObject>): NodeItem | undefined {
        let node: NodeItem | undefined = this.nodePool.get(type)?.pop();
        if (!node) {
          node = new NodeItem(builder, data, type);
          this.nodeHook.add(node);
        } else {
          node.data = data;
        }
        node.data.callback = (callback: UpdaterCallback) => {
          if (node) {
            node.registerUpdater(callback);
          }
        }
        return node;
      }
      // 回收Node组件,提供给下次复用
      public recycleNode(type: string, node: NodeItem) {
        let nodeArray: Array<NodeItem> = this.nodePool.get(type);
        if (!nodeArray) {
          nodeArray = new Array();
          this.nodePool.set(type, nodeArray);
        }
        nodeArray.push(node);
      }
    }
    ...
  4. 使用NodeContainer占位轮播图组件和瀑布流子组件的位置,并通过NodePool获取组件加载到页面中,详细代码请参考TabNode.ets。

    ...
    FlowItem() {
      NodeContainer(NodePool.getInstance().getNode('reuse_type_', {
        item: item,
        itemHeight: this.itemHeightArray[index % 100],
        itemColor: this.colors[index % 5],
        updater: (item: ViewItem) => {
          this.fillNewData(item);
        },
        callback: null
      }, flowItemWrapper))
    }
    ...

高性能知识点

通过BuilderNode实现全局自定义组件复用池,解决常规复用中只能在父组件中复用的问题,实现组件的跨父组件、跨页面复用,减少页面的创建耗时,优化应用性能。

工程结构&模块类型

customreusablepool                                 // har类型
|---constants                                      // 常量
|---|---Constants.ets                              // 常量类
|---data                                           // 数据类型
|---|---MockData.ets                               // 模拟数据
|---|---TitleBean.ets                              // 标题类
|---|---TitleDataSource.ets                        // 标题懒加载数据类   
|---|---ViewItem.ets                               // 瀑布流子组件数据类
|---|---WaterFlowDataSource.ets                    // 瀑布流子组件懒加载数据类
|---pages                                          // 页面   
|---|---BuilderNodePoolDemo.ets                    // 全局自定义组件复用池页面               
|---utils                                          // 工具类
|---|---BuilderNodePool.ets                        // 自定义组件复用池
|---view                                           // 组件   
|---|---FlowItemNode.ets                           // 自定义组件复用池的瀑布流子组件
|---|---TabNode.ets                                // 自定义组件复用池的Swiper页面   
|---|---TitleView.ets                              // 标题View   
|---|---SwiperView.ets                             // 瀑布流中的轮播图

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为资料太多,太杂,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

为了确保高效学习,建议规划清晰的学习路线,涵盖以下关键阶段:

 点击→【纯血版鸿蒙全套最新学习资料】希望这一份鸿蒙学习资料能够给大家带来帮助~


 鸿蒙(HarmonyOS NEXT)最新学习路线

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

点击→纯血版全套鸿蒙HarmonyOS学习资料

2.视频学习资料+学习PDF文档

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、(南向驱动、嵌入式等)鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

HarmonyOS Next 最新全套视频教程

​​

 (鸿蒙语法ArkTS、TypeScript、ArkUI教程……)

 纯血版鸿蒙全套学习资料(面试、文档、全套视频等)

                   

鸿蒙南向开发技术

​​

鸿蒙APP开发必备

​​

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

​​

《鸿蒙开发基础》

​​

《鸿蒙开发进阶》

《鸿蒙进阶实战》

​​


点击→纯血版全套鸿蒙HarmonyOS学习资料

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线

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

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

相关文章

leetcode算法题之N皇后

N皇后也是一道很经典的问题&#xff0c;问题如下&#xff1a; 题目地址 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你…

2:html:基础语法2

目录 2.1图像的一些注意点 2.2表格 2.2.1基本的表格 2.2.2表头与边框 2.3列表 2.3.1无序列表 2.3.2有序列表 2.4块 2.4.1块级元素 2.4.2内联元素 2.1图像的一些注意点 在上一篇中&#xff0c;我们已经知道了怎么样去将图片运用到我们的网站中&#xff0c;但是这里还…

荣耀Magicbook x14 扩容1TB固态

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 固态硬盘规格 在官网查看加装固态硬盘的接口规格 https://www.honor.com/cn/laptops/honor-magicbook-x14-2023/ https://club.honor.com/cn/thread-2847379…

XYplorer v26.30.0200绿色版

软件介绍 XYplorers是一款多标签文件管理器&#xff0c;支持多标签页栏&#xff0c;浏览文件管理时就跟使用Chrome之类的浏览器感觉一般&#xff0c;从浏览方便性&#xff0c;和切换滑顺程度&#xff0c;要比原本Windows10的Explorer文件管理器要得多。可以大部分程度上替代系…

树莓派5环境配置笔记 新建虚拟python环境—安装第三方库—配置Thonny解释器

树莓派5虚拟环境配及第三方库的安装&#x1f680; 在完成了树莓派的系统下载和各项基础配置之后进入到了&#xff0c;传感器开发部分&#xff0c;在测试传感器开发之前我打算先安装一下自己需要的库&#xff0c;但是在我直接在系统的根目录下运行pip命令的时候总会报环境错误&a…

sudo执行带重定向命令时仍提示无权限:Permission denied问题详解以及linux里的更高效下载命令mwget安装和使用效率对比

一、sudo执行带重定向命令时仍提示无权限&#xff1a;Permission denied问题详解 小问题&#xff0c;在此记录一下&#xff0c;有时在shell下执行命令重定向到文件时提示无权限-bash: temp_20181015.log: Permission denied&#xff0c;而且加sudo执行依提示无权限&#xff0c;…

CDD数据库文件制作(四)——Data Type(0x22/0x2E)

文章目录 1、新建Data Type步骤2、Data Types类型2.1 raw value2.1.1 ASCII读取和写入:零件号…2.1.2 “多字节的十六进制” 读取和写入:密钥,种子…2.1.3 “多字节的十进制” 读取和写入:参数标定和显示2.2 text table2.3 Linear2.3.1 分辨率和偏移量非1和0的读取和写入2.…

linux:进程优先级、环境变量、地址空间

进程优先级 什么叫进程优先级&#xff1f; 进程优先级是指进程获取某些资源的先后顺序 上文中的task_struct&#xff0c;也叫进程控制块&#xff08;PCB&#xff09;&#xff0c;本质上是结构体&#xff0c;我们的优先级就被写在结构体里面&#xff08;内部字段&#xff09;…

Python | Leetcode Python题解之第345题反转字符串中的元音字母

题目&#xff1a; 题解&#xff1a; class Solution:def reverseVowels(self, s: str) -> str:def isVowel(ch: str) -> bool:return ch in "aeiouAEIOU"n len(s)s list(s)i, j 0, n - 1while i < j:while i < n and not isVowel(s[i]):i 1while j …

模型 神经网络(通俗解读)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。仿脑智能&#xff0c;深度学习&#xff0c;精准识别。 1 神经网络的应用 1.1 鸢尾花分类经典问题 神经网络的一个经典且详细的经典应用是鸢尾花分类问题 。主要是通过构建一个神经网络模型来自动区分…

【数学建模备赛】Ep04:假设性检验

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、假设性检验&#xff1a;☀️☀️☀️1. 整体步骤2. 例子① 确定原假设和备择假设② 根据要检测的量构造一个分布③ 画出分布的概率密度图④ 给出一个置信水平β⑤ 最常见的置信水平&#xff08;95 %&#xff09;⑥…

Java流程控制07:嵌套for循环

本节教学视频链接&#xff1a;https://www.bilibili.com/video/BV12J41137hu?p41&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p41&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 在Java中&#xff0c;‌嵌套for循环是指将…

Linux之HTTP服务器的构建

欢迎诸位来阅读在下的博文~ 在这里&#xff0c;在下会不定期发表一些浅薄的知识和经验&#xff0c;望诸位能与在下多多交流&#xff0c;共同努力! 江山如画&#xff0c;客心如若&#xff0c;欢迎到访&#xff0c;一展风采 文章目录 参考环境参考书籍一、HTTP的工作原理1. 建立连…

k8s查看容器的日志

查询运行容器命令&#xff1a;kubectl get po -n pro 如果想查看cams系统&#xff0c;那么执行命令&#xff1a; kubectl logs pro -f -n pro &#xff08;容器名称&#xff09;|more

【HarmonyOS】端云一体化初始化项目

简介 端云一体化开发是HarmonyOS对云端开发的支持、实现端云联动。云开发服务提供了云函数、云数据库、云存储等服务&#xff0c;可以使开发者专注于应用的业务逻辑开发&#xff0c;无需关注基础设施&#xff0c;例如&#xff1a;服务器、操作系统等问题。 因此&#xff0c;…

CentOS下分布式消息系统kafka的安装和使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前沿一、Windows主机&#xff08;G:\share&#xff09;和Linux虚拟机&#xff08;/mnt/hgfs/share&#xff09;之间文件共享1.添加Windows主机的路径2.linux安装VMw…

比特位的计算

给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;[0,1,1] 解释&#xff1a; 0 --> 0 1 --> …

我的创作纪念日【2048】

机缘 2048&#xff0c;是计算机二进制世界里很奇妙的数字&#xff0c;在CSDN上创作的第六年&#xff0c;记录从事本行业的知识学习与总结&#xff0c;好记性不如烂笔头&#xff0c;或许写的东西不如大佬的文章&#xff0c;那么有深度&#xff0c;但自己也是在坚持&#xff0c;…

计算机毕业设计选什么题目好?Java财会信息管理系统

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

Ciallo~(∠・ω・ )⌒☆第二十篇 入门mysql 数据库

要入门MySQL数据库&#xff0c;首先需要了解数据库的基本概念和原理。MySQL是一种广泛使用的开源关系型数据库管理系统&#xff0c;它能够处理大量的数据&#xff0c;并提供了多种功能。 一、创建数据库 连接到MySQL后&#xff0c;你可以使用SQL语句来创建数据库。例如&#x…