网站如何做3d产品/友妙招链接怎么弄

网站如何做3d产品,友妙招链接怎么弄,网页在线客服免费,网络营销顾问工作内容一、简介 为了解决页面和组件加载缓慢的问题,ArkUI框架引入了动态操作功能,支持组件的预创建,并允许应用在运行时根据实际需求动态加载和渲染组件。 这些动态操作包括动态创建组件(即动态添加组件)和动态卸载组件&am…
一、简介

为了解决页面和组件加载缓慢的问题,ArkUI框架引入了动态操作功能,支持组件的预创建,并允许应用在运行时根据实际需求动态加载和渲染组件。

这些动态操作包括动态创建组件(即动态添加组件)动态卸载组件(即动态删除组件)

动态创建组件是指在build生命周期之外提前创建组件,这种方式不仅能节省组件创建时间,提升用户体验,还能将独立逻辑封装起来,助力应用的模块化开发。

而动态卸载组件则是对动态创建的组件进行卸载和删除操作。

二、组件预创建原理

在传统的声明式开发范式中,组件仅在build阶段被创建,开发者无法在其他生命周期阶段进行组件创建,这往往会导致页面加载速度较慢。

然而,ArkUI框架提供的UI动态操作支持组件的预创建,允许开发者在非build生命周期阶段提前创建组件。这些预创建的组件可以在页面加载时直接使用,从而大幅提升页面的响应速度

如图1所示,利用组件预创建机制,可以在动画执行过程中的空闲时间进行组件预创建和属性设置。当动画结束后,再进行属性和布局的更新,从而节省组件创建时间,加快页面渲染速度

图1组件预创建原理图 

三、FrameNode自定义节点在动态布局场景下的优势
1.减少自定义组件创建开销


在声明式开发范式中,使用ArkUI的自定义组件对节点树中的每个节点进行定义时,往往会遇到节点创建效率低下的问题。

这是因为在ArkTS引擎中,每个节点都需要分配内存空间来存储应用程序的自定义组件和状态变量,并且在节点创建过程中还需执行组件ID、组件闭包以及状态变量之间的依赖关系收集等操作。相比之下,使用ArkUI的FrameNode可以避免创建自定义组件对象和状态变量对象,无需进行依赖收集,从而显著提升组件创建速度。

2.组件更新更快


在动态布局框架的更新场景中,通常存在一个由树形数据结构ViewModelA创建的UI组件树TreeA。当需要使用新的数据结构ViewModelB来更新TreeA时,尽管声明式开发范式可以实现数据驱动的自动更新,但这一过程中伴随着大量的diff操作。

对于ArkTS引擎而言,在对一个复杂组件树(深度超过30层,包含100至200个组件)执行diff算法时,几乎无法在120Hz的刷新率下保持满帧运行。然而,使用ArkUI的FrameNode扩展,框架能够自主掌控更新流程,实现高效的按需剪枝。特别是对于那些仅服务于少数特定业务的动态布局框架,利用这一扩展可以实现快速的更新操作。

3.直接操作组件树


在声明式开发范式中,组件树结构更新操作较为困难。例如,将组件树中的一个子树从当前子节点完整移到另一个子节点时,声明式开发范式无法直接调整组件实例的结构关系,只能通过重新渲染整棵组件树来实现。

而使用ArkUI的FrameNode扩展,则可以通过操作FrameNode轻松操控该子树,将其移植到另一个节点,从而实现局部渲染刷新,性能更优。

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


动态添加组件的过程包括以下步骤:

  1. 创建自定义节点。

  2. 实现NodeController,用于管理自定义节点的创建、显示、更新等操作,并负责将自定义节点挂载到NodeContainer上。

  3. 实现NodeController的makeNode方法,该方法会在NodeController实例绑定NodeContainer时被回调,并将返回的节点挂载至NodeContainer。

  4. 使用NodeContainer显示自定义节点。

2、创建自定义节点


首先,准备好需要挂载的节点,代码如下所示:

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})}
}
3、实现NodeController


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 {return null;}
}
4、实现NodeController的makeNode方法


首先,使用构造函数创建BuilderNode实例。创建BuilderNode对象时,必须传入对应的UIContext对象。如果BuilderNode作为RenderNode的子节点存在,则需要设置RenderOptions的selfIdealSize属性。然后,使用BuilderNode的build方法构建组件树。build()方法需要传入两个参数:第一个参数是通过wrapBuilder()封装的全局@Builder方法;第二个参数是对应的@Builder方法所需的参数对象。如果@Builder方法不带参数或者存在默认参数,则build()的第二个参数可以省略。

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 {this.textNode = new BuilderNode(context);this.textNode.build(wrapBuilder<[Params]>(buildText), new Params(this.message));return this.textNode.getFrameNode();}
}
5、显示自定义节点


显示自定义节点依赖于声明式渲染容器NodeContainer和对应的控制类NodeController。NodeController的makeNode方法返回的节点会显示在对应的NodeContainer中。由于makeNode需要返回一个FrameNode,因此如果预期显示BuilderNode,需要调用BuilderNode的getFrameNode方法来获取其根节点。详细代码如下:

@Entry
@Component
struct Index {@State message: string = "hello";private textNodeController: TextNodeController = new TextNodeController(this.message);build() {Row() {Column() {NodeContainer(this.textNodeController).width('100%').height(100).backgroundColor('#FFF0F0F0')}.width('100%').height('100%')}.height('100%')}
}
6、更新自定义节点


更新自定义节点可以参考BuilderNode的update方法。

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

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

相关文章

MongoDB 7 分片副本集升级方案详解(上)

#作者&#xff1a;任少近 文章目录 前言&#xff1a;Mongodb版本升级升级步骤环境1.1环境准备1.2standalone升级1.3分片、副本集升级 前言&#xff1a;Mongodb版本升级 在开始升级之前&#xff0c;请参阅 MongoDB下个版本中的兼容性变更文档&#xff0c;以确保您的应用程序和…

AI前端开发:跨领域合作的新引擎

随着人工智能技术的飞速发展&#xff0c;AI代码生成器等工具的出现正深刻地改变着软件开发的模式。 AI前端开发的兴起&#xff0c;不仅提高了开发效率&#xff0c;更重要的是促进了跨领域合作&#xff0c;让数据科学家、UI/UX设计师和前端工程师能够更紧密地协同工作&#xff0…

DeepSeek 助力 Vue 开发:打造丝滑的返回顶部按钮(Back to Top)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

Java练习(20)

ps:练习来自力扣 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 class Solution {pu…

Tetragon:一款基于eBPF的运行时环境安全监控工具

关于Tetragon Tetragon是一款基于eBPF的运行时环境安全监控工具&#xff0c;该工具可以帮助广大研究人员检测并应对安全重大事件&#xff0c;例如流程执行事件、系统调用活动、I/O活动&#xff08;包括网络和文件访问等&#xff09;。 在 Kubernetes 环境中使用时&#xff0c;…

Qt多线程技术【线程池】:QRunnable 和 QThreadPool

在现代软件开发中&#xff0c;尤其是在处理大量并发任务时&#xff0c;线程池技术是一种高效的解决方案。线程池不仅能提高程序的性能&#xff0c;还能有效管理线程的生命周期&#xff0c;避免频繁的线程创建和销毁所带来的性能损失。本文将以Qt中的 QThreadPool 和 QRunnable …

218.子结构判断

class Solution {/*** 判断树 B 是否是树 A 的子结构* param A 树 A 的根节点* param B 树 B 的根节点* return 如果 B 是 A 的子结构&#xff0c;返回 true&#xff1b;否则返回 false*/public boolean isSubStructure(TreeNode A, TreeNode B) {// 如果树 B 为空&#xff0c;…

Navicat导入海量Excel数据到数据库(简易介绍)

目录 前言正文 前言 此处主要作为科普帖进行记录 原先Java处理海量数据的导入时&#xff0c;由于接口超时&#xff0c;数据处理不过来&#xff0c;后续转为Navicat Navicat 是一款功能强大的数据库管理工具&#xff0c;支持多种数据库系统&#xff08;如 MySQL、PostgreSQL、…

文化财经t8优质短线期货交易量化模型源码

// 参数设置 BOLL_PERIOD : 20; // 布林带周期 RSI_PERIOD : 14; // RSI 周期 OVERSOLD : 30; // 超卖线 OVERBOUGHT : 70; // 超买线 // 计算布林带 MID : MA(CLOSE, BOLL_PERIOD); UPPER : MID 2 * STD(CLOSE, BOLL_PERIOD); LOWER : MID - 2 * STD(CLOSE,…

[AI]Mac本地部署Deepseek R1模型 — — 保姆级教程

[AI]Mac本地部署DeepSeek R1模型 — — 保姆级教程 DeepSeek R1是中国AI初创公司深度求索&#xff08;DeepSeek&#xff09;推出大模型DeepSeek-R1。 作为一款开源模型&#xff0c;R1在数学、代码、自然语言推理等任务上的性能能够比肩OpenAI o1模型正式版&#xff0c;并采用MI…

【UE5】PeerStream像素流部署

视频教程 https://www.bilibili.com/video/BV1GhiuecEpK?spm_id_from333.788.videopod.sections&vd_source02dd8acc3a83a728e375ff61f1ebe725步骤 下载PeerStream代码 代码结构和项目如图 github地址:https://github.com/inveta/PeerStreamEnterprise下载node node 对应…

老牌系统工具箱,现在还能打!

今天给大家分享一款超实用的电脑软硬件检测工具&#xff0c;虽然它是一款比较“资深”的软件&#xff0c;但依然非常好用&#xff0c;完全能满足我们的日常需求。 电脑软硬件维护检测工具 功能强大易用 这款软件非常贴心&#xff0c;完全不需要安装&#xff0c;直接打开就能用…

java商城解决方案

数字化时代&#xff0c;电子商务已成为企业拓展市场的重要渠道。对于想要建立在线商店的企业来说&#xff0c;选择正确的技术堆栈至关重要。 Java作为一种成熟且广泛使用的编程语言&#xff0c;为构建购物中心提供了强大的功能和灵活性。 商城Java源码&#xff1a;商城开发的核…

软件的生命周期和需求

什么是软件的生命周期? 定义(描述) --> 创建 --> 使用 --> 销毁 (这一整个过程就是事物的生命周期) 生命周期 那么软件的生命周期又分为哪些呢? 一共分为十步: 可行性研究: 通过分析软件开发要求,确定软件项目的性质、目标和规模,得出可行性研究报告,如果可行性研…

【linux学习指南】线程同步与互斥

文章目录 &#x1f4dd;线程互斥&#x1f320; 库函数strncpy&#x1f309;进程线程间的互斥相关背景概念&#x1f309;互斥量mutex &#x1f320;线程同步&#x1f309;条件变量&#x1f309;同步概念与竞态条件&#x1f309; 条件变量函数 &#x1f6a9;总结 &#x1f4dd;线…

MySQL索引优化,性能飙升的秘密!

0.前言 假设你经营一家电商平台&#xff0c;某天用户突然投诉商品搜索加载时间超过10秒。技术团队紧急排查&#xff0c;发现一条原本执行0.1秒的查询语句&#xff0c;在百万级数据量下竟变成了全表扫描。这时&#xff0c;数据库索引犹如深夜急诊室里的救命仪器——它的存在与否…

【C语言】C语言 实践课题选题系统(源码+报告+数据文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 系C语言 实践课题选题系统&#xff08;源码报告数据…

基于SpringBoot的“高考志愿智能推荐系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“高考志愿智能推荐系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 系统首页界面 系统注册页…

React 低代码项目:组件设计

React 低代码项目&#xff1a;组件设计 Date: February 6, 2025 React表单组件 **目标&#xff1a;**使用 Ant Design 表单组件&#xff0c;开发登录、注册、搜索功能 内容&#xff1a; 使用 React 表单组件、受控组件使用 Ant Design 表单组件使用 表单组件的校验和错误提…

QCustomplot库运用

最近需要用到这个库显示数据&#xff0c;需要在一个曲线图4个Y轴共用一个X轴&#xff0c;并且做游标&#xff0c;跟随鼠标移动&#xff0c;并且实时反馈数据到表格中。记录一下程序。 customPlot new QCustomPlot(this); customPlot->setBackground(QBrush(QColor(204,204,…