如题:哪位大佬可以提供HarmonyOS Next组件预创建示例代码?
本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。
如题:哪位大佬可以提供HarmonyOS Next组件预创建示例代码?
本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。
以下是一个HarmonyOS Next组件预创建的示例代码,该示例展示了如何通过BuilderNode实现全局自定义组件复用池,从而实现组件的预创建和复用:
// BuilderNodePool.ets
import { NodeController, FrameNode, UIContext, WrappedBuilder, HashMap, HashSet, UpdaterCallback, NodeItem as BaseNodeItem } from '@ohos.arkui';
export class NodePool {
private static instance: NodePool;
private nodePool: HashMap<string, Array<BaseNodeItem>>;
private nodeHook: HashSet<BaseNodeItem>;
private idGen: number;
private constructor() {
this.nodePool = new HashMap();
this.nodeHook = new HashSet();
this.idGen = 0;
}
// 单例模式,可以全局统一管理
public static getInstance(): NodePool {
if (!NodePool.instance) {
NodePool.instance = new NodePool();
}
return NodePool.instance;
}
// 获取节点,如果不存在则创建新的节点
public getNode(type: string, data: ESObject, builder: WrappedBuilder<ESObject>): BaseNodeItem | undefined {
let node: BaseNodeItem | undefined = this.nodePool.get(type)?.pop();
if (!node) {
node = new NodeItem(builder, data, type);
this.nodeHook.add(node);
} else {
node.update(data);
}
node.data.callback = (callback: UpdaterCallback) => {
if (node) {
node.registerUpdater(callback);
}
};
return node;
}
// 回收节点,提供给下次复用
public recycleNode(type: string, node: BaseNodeItem) {
let nodeArray: Array<BaseNodeItem> = this.nodePool.get(type);
if (!nodeArray) {
nodeArray = new Array();
this.nodePool.set(type, nodeArray);
}
nodeArray.push(node);
}
}
export class NodeItem extends NodeController {
private callback: UpdaterCallback | null = null;
private data: ESObject;
private builder: WrappedBuilder<ESObject>;
private type: string;
constructor(builder: WrappedBuilder<ESObject>, data: ESObject, type: string) {
super();
this.builder = builder;
this.data = data;
this.type = type;
}
// 父类方法,用于创建子组件
makeNode(uiContext: UIContext): FrameNode | null {
if (!this.node) {
this.node = new FrameNode(uiContext);
this.node.build(this.builder, this.data);
} else {
this.node.update(this.data);
}
return this.node;
}
// 更新数据
update(data: ESObject): void {
this.data = data;
if (this.node) {
this.node.update(data);
}
}
// 组件隐藏时回收组件
aboutToDisappear(): void {
NodePool.getInstance().recycleNode(this.type, this);
}
// 注册更新回调
registerUpdater(callback: UpdaterCallback): void {
this.callback = callback;
}
}
// 使用示例
@Entry
@Component
struct BuilderNodePoolDemo {
@State array: Array<string> = ['Tab1', 'Tab2', 'Tab3'];
private swiperController: any;
build() {
Column() {
Swiper(this.swiperController) {
LazyForEach(this.array, () => {
TabNode()
}, (title: string) => title)
}
.width('100%')
.height('100%')
}
}
}
@Component
struct TabNode {
build() {
NodeContainer(NodePool.getInstance().getNode('reuse_type_', { /* 数据 */ }, this.builder))
}
}
解释:
getNode
和recycleNode
两个方法,分别用于获取和回收组件节点。NodeController
的自定义组件类,它实现了makeNode
、update
和aboutToDisappear
等方法,用于创建、更新和回收组件节点。Swiper
和LazyForEach
来创建多个可切换的页面(或称为Tab)。每个Tab都使用NodeContainer
来加载从复用池中获取的组件。NodeContainer
来占位,并从复用池中获取组件加载到页面中。通过上述代码,你可以实现HarmonyOS Next中的组件预创建和复用,从而提高应用的性能和响应速度。
1 回答496 阅读✓ 已解决
1 回答507 阅读
1 回答438 阅读
464 阅读
462 阅读
450 阅读
411 阅读
下面的代码,模拟了应用冷启动的流程,在应用启动后先进入广告页(Index页面),并在广告页进行组件预创建。
不过这种方式在冷启动时进行预创建,当组件数量较多时,会引起主线程的阻塞,增加冷启动耗时
本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。