如题:HarmonyOS Next如何直接操作组件树?
本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。
如题:HarmonyOS Next如何直接操作组件树?
本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。
HarmonyOS Next 可以通过 BuilderNode 来直接操作组件树。BuilderNode 提供能够挂载原生组件的能力,支持通过无状态的 UI 方法全局 @Builder 生成组件树,并可以通过 getFrameNode 获取组件树的根 FrameNode 节点。以下是一些关键点和操作方式:
以下是一个简单的示例,展示了如何使用 BuilderNode 来创建和挂载一个文本组件:
import { BuilderNode, FrameNode, NodeController, UIContext } from '@kit.ArkUI';
class Params {
text: string = "";
constructor(text: string) {
this.text = text;
}
}
@Builder
function buildText(params: Params) {
return Column() {
Text(params.text)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.margin({ bottom: 36 });
}
}
class TextNodeController extends NodeController {
private textNode: BuilderNode<[Params]> | null = null;
private message: string = "DEFAULT";
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();
}
}
@Entry
@Component
struct Index {
@State message: string = "hello";
build() {
Row() {
Column() {
NodeContainer(new TextNodeController(this.message))
.width('100%')
.height(100)
.backgroundColor('#FFF0F0F0');
}
.width('100%')
.height('100%');
}
.height('100%');
}
}
在这个示例中,我们定义了一个 TextNodeController
类,它继承自 NodeController
。在 makeNode
方法中,我们创建了一个 BuilderNode
实例,并通过 build
方法构建了一个文本组件树。然后,我们将构建好的组件树的根节点(FrameNode)返回,并将其挂载到 NodeContainer
下以实现显示。
综上所述,HarmonyOS Next 通过 BuilderNode 提供了直接操作组件树的能力,开发者可以利用这一能力来实现更复杂的 UI 交互和组件管理。
1 回答632 阅读✓ 已解决
1 回答893 阅读
1 回答614 阅读
1 回答709 阅读
1 回答689 阅读
1 回答596 阅读
1 回答573 阅读
使用声明式开发范式还存在组件树结构更新操作困难的痛点,比如将组件树中的一个子树从当前子节点完整移到另一个子节点,使用声明式开发范式无法直接调整组件实例的结构关系,只能通过重新渲染整棵组件树的方式实现上述操作。而使用ArkUI的FrameNode扩展,则可以通过操作FrameNode来很方便的操控该子树,将其移植到另一个节点,这样只会进行局部渲染刷新,性能更优。
本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。