HarmonyOS :通过 BuilderNode + NodeController 实现 UI 动态操作

引言

UI动态操作包含组件的动态创建、卸载、更新等相关操作。

通过组件预创建,可以满足开发者在非build生命周期中进行组件创建,创建后的组件可以进行属性设置、布局计算等操作。之后在页面加载时进行使用,可以极大提升页面响应速度。

UI 动态操作(创建、显示、更新)

下面是一个简单的示例:

通过 BuilderNode + NodeController + Builder 使用 UI 动态操作。

    1. 准备好需要挂载的节点及要绑定的数据模型
ts 复制代码
// 要绑定的数据模型
class Params {
  text: string = ''

  constructor(text: string) {
    this.text = text
  }
}

// 这个就是我们要挂载的节点内容
@Builder
function customNodeBuilder(params: Params) {
  Column() {
    Text(params.text)
      .fontSize(25)
      .margin({ bottom: 15 })
  }
}
    1. 封装 controller 用于实现自定义节点的创建、显示、更新等操作
ts 复制代码
class CustomNodeController extends NodeController {
  private customNode: BuilderNode<[Params]> | null = null;
  private message: string = "";

  constructor(message: string) {
    super()
    this.message = message
  }

  makeNode(context: UIContext): FrameNode | null {
    this.customNode = new BuilderNode(context);
    this.customNode.build(wrapBuilder<[Params]>(customNodeBuilder), new Params(this.message))
    return this.customNode.getFrameNode();
  }

  // 提供 update 方法供外部调用进行节点更新
  update(message: string) {
    if (this.customNode !== null) {
      this.customNode.update(new Params(message));
    }
  }
}
    1. 使用、显示自定义节点
ts 复制代码
@Component
export struct BuilderNodeExample {
  private textNodeController: CustomNodeController = new CustomNodeController('hello');
  private count = 0;

  build() {
    Row() {
      Column() {
        NodeContainer(this.textNodeController)
          .width('100%')
          .height(100)
          .align(Alignment.Center)
        Button('Update')
          .onClick(() => {
          // 点击按钮主动触发自定义节点的更新
            this.count += 1;
            this.textNodeController.update("Update " + this.count.toString());
          })
      }
      .width('100%')
      .height('100%')
      .justifyContent(FlexAlign.Center)
    }
    .height('100%')
    .alignItems(VerticalAlign.Center)
  }
}

以上示例效果如下:

扩展:NodeController 内各方法回调时机

方法名称 触发时机
makeNode 当实例绑定的NodeContainer创建的时候进行回调。或者可以通过NodeController的rebuild()方法进行回调的触发
aboutToAppear 当NodeController绑定的NodeContainer挂载显示时触发此回调
aboutToDisappear 当NodeController绑定的NodeContainer卸载消失时触发此回调
aboutToResize 当NodeController绑定的NodeContainer布局的时候触发此回调
onTouchEvent 当NodeController绑定的NodeContainer收到Touch事件时触发此回调
rebuild 调用此接口通知NodeContainer组件重新回调makeNode方法,更改子节点

附注(Example)

Demo示例(基于API11开发,支持NEXT及以上版本运行)已上传可供参考,包含如下内容:

  • 静态库+动态包+多模块设计
  • 状态管理
  • 统一路由管理(router+navPathStack)
  • 网络请求、Loading 等工具库封装
  • 自定义组件、自定义弹窗(解耦)
  • EventBus 事件通知
  • 扩展修饰器,实现 节流、防抖、权限申请
  • 动态路由 (navPathStack + 动态import + WrappedBuilder)
  • UI动态节点操作 (BuilderNode + NodeController)
相关推荐
粉末的沉淀11 小时前
css:制作带边框的气泡框
前端·javascript·css
A***071712 小时前
HarmonyOS在智能家居中的安防系统
华为·智能家居·harmonyos
N***738512 小时前
Vue网络编程详解
前端·javascript·vue.js
e***716712 小时前
Spring Boot项目接收前端参数的11种方式
前端·spring boot·后端
程序猿小蒜12 小时前
基于springboot的的学生干部管理系统开发与设计
java·前端·spring boot·后端·spring
银空飞羽12 小时前
让Trae CN SOLO自主发挥,看看能做出一个什么样的项目
前端·人工智能·trae
爱笑的眼睛1112 小时前
HarmonyOS Scroll滚动容器深度性能优化实践
华为·harmonyos
Eshine、13 小时前
解决前端项目中,浏览器无法正常加载带.gz名称的文件
前端·vue3·.gz·.gz名称的js文件无法被加载
用户479492835691513 小时前
别再当 AI 的"人肉定位器"了:一个工具让 React 组件秒定位
前端·aigc·ai编程
WYiQIU14 小时前
面了一次字节前端岗,我才知道何为“造火箭”的极致!
前端·javascript·vue.js·react.js·面试