HarmonyOS 5.0应用开发——ContentSlot的使用

【高心星出品】

文章目录

ContentSlot的使用

用于渲染并管理Native层使用C-API创建的组件同时也支持ArkTS创建的NodeContent对象。

支持混合模式开发,当容器是ArkTS组件,子组件在Native侧创建时,推荐使用ContentSlot占位组件。

ContentSlot只是一个语法节点,无通用属性,不参与布局和渲染,所以布局属性是其父容器提供。

使用方法
复制代码
ContentSlot(content: Content)

这里的content一般提供NodeContent对象,NodeContent对象里面一般放入typenode节点对象,而typenode节点对象可以增加新的typenode节点对象,也可以将@builder全局构建函数转化为ComponentContent加入到typenode对象中,所以ContentSlot的使用结构为:

复制代码
contentslot---->nodecontent--->typenode--->componentcontent--->@builder全局构建函数
案例

接下来通过一个案例展示使用typenode的appchild来增加子节点,和通过addComponentContent来增加子节点两种方式渲染UI界面的方法。

运行结果

全局构建函数

生成一个文本布局

复制代码
interface param {
  str: string
  num: number
}

@Builder
function genitem(p: param) {
  Text(p.str + p.num).fontSize(24).fontWeight(FontWeight.Bolder)
}

typenode生成线性布局

typenode生成线性布局并且设置相关属性。

复制代码
// 创建水平线性布局
let row = typeNode.createNode(this.context, 'Row')
// 设置相关属性
row.attribute.width('100%')
row.attribute.backgroundColor(Color.Red)
row.attribute.justifyContent(FlexAlign.SpaceEvenly)
row.attribute.padding(20)
// 初始化
row.initialize()

typenode生成文本组件和按钮组件

复制代码
// 创建text组件
let text1 = typeNode.createNode(this.context, 'Text')
text1.attribute.fontColor(Color.White).fontWeight(FontWeight.Bolder)
// 初始化文本
text1.initialize('typenode--child1')
// 创建button组件
let button1 = typeNode.createNode(this.context, 'Button')
// 按钮绑定事件  一处文本组件
button1.attribute.onClick(()=>{
  row.removeChild(text1)
})
// 初始化按钮文本
button1.initialize('typenode--child2')
// 加入线性布局中
row.appendChild(text1)
// 加入线性布局中
row.appendChild(button1)

typenode加入componentcontent

复制代码
// 生成componentcontent
let buildercontent = new ComponentContent(this.context, wrapBuilder<[param]>(genitem),
  { str: 'componentcontent--child', num: 1 } as param, { nestingBuilderSupported: true })
// 创建新的线性布局
let row1 = typeNode.createNode(this.context, 'Row')
row1.attribute.padding(20)
row1.initialize()
// 增加节点
row1.addComponentContent(buildercontent)
// 将两个线性布局加入nodecontent
this.content.addFrameNode(row1)
this.content.addFrameNode(row)

在build函数中显示

复制代码
build() {
  Column() {
    //contentslot---->nodecontent--->typenode--->componentcontent
    // 使用contentslot方法显示布局
    ContentSlot(this.content)

  }
  .height('100%')
  .width('100%')
}
完整代码
复制代码
import { ComponentContent, FrameNode, NodeContent, typeNode } from '@kit.ArkUI';

interface param {
  str: string
  num: number
}

@Builder
function genitem(p: param) {
  Text(p.str + p.num).fontSize(24).fontWeight(FontWeight.Bolder)
}

@Entry
@Component
struct Nodecontentpage {
  @State message: string = 'Hello World';
  private context: UIContext = this.getUIContext()
  private content: NodeContent = new NodeContent()

  aboutToAppear(): void {
    // 创建水平线性布局
    let row = typeNode.createNode(this.context, 'Row')
    // 设置相关属性
    row.attribute.width('100%')
    row.attribute.backgroundColor(Color.Red)
    row.attribute.justifyContent(FlexAlign.SpaceEvenly)
    row.attribute.padding(20)
    // 初始化
    row.initialize()
    // 创建text组件
    let text1 = typeNode.createNode(this.context, 'Text')
    text1.attribute.fontColor(Color.White).fontWeight(FontWeight.Bolder)
    // 初始化文本
    text1.initialize('typenode--child1')
    // 创建button组件
    let button1 = typeNode.createNode(this.context, 'Button')
    // 按钮绑定事件  一处文本组件
    button1.attribute.onClick(()=>{
      row.removeChild(text1)
    })
    // 初始化按钮文本
    button1.initialize('typenode--child2')
    // 加入线性布局中
    row.appendChild(text1)
    // 加入线性布局中
    row.appendChild(button1)
    // 生成componentcontent
    let buildercontent = new ComponentContent(this.context, wrapBuilder<[param]>(genitem),
      { str: 'componentcontent--child', num: 1 } as param, { nestingBuilderSupported: true })
    // 创建新的线性布局
    let row1 = typeNode.createNode(this.context, 'Row')
    row1.attribute.padding(20)
    row1.initialize()
    // 增加节点
    row1.addComponentContent(buildercontent)
    // 将两个线性布局加入nodecontent
    this.content.addFrameNode(row1)
    this.content.addFrameNode(row)
  }

  build() {
    Column() {
      //contentslot---->nodecontent--->typenode--->componentcontent
      // 使用contentslot方法显示布局
      ContentSlot(this.content)

    }
    .height('100%')
    .width('100%')
  }
}
     //contentslot---->nodecontent--->typenode--->componentcontent
      // 使用contentslot方法显示布局
      ContentSlot(this.content)

    }
    .height('100%')
    .width('100%')
  }
}
相关推荐
翼辉cto3 天前
网络请求与数据交互:http 模块、拦截器与状态封装
移动开发·harmonyos·arkts·鸿蒙·arkui
翼辉cto3 天前
鸿蒙生态与 ArkTS 入门:环境搭建与第一个应用
移动开发·harmonyos·arkts·鸿蒙·arkui
想你依然心痛3 天前
【共创季稿事节】HarmonyOS 6.1 沉浸光感助力音乐 App 氛围感设计案例
音乐播放器·arkui·沉浸光感·harmonyos 6.1·封面取色·动态主题·全屏沉浸
2301_768103494 天前
HarmonyOS趣味相机实战第14篇:装饰素材强类型建模、锚点语义与套装组合校验
harmonyos·arkts·数据建模·arkui·相机贴纸
想你依然心痛4 天前
【共创季稿事节】HarmonyOS 6.1 悬浮页签重塑阅读 App 多任务体验实战
性能优化·状态管理·arkui·harmonyos 6.1·悬浮页签·多文档阅读·进度保持
风华圆舞4 天前
鸿蒙HarmonyOS 多模态输入实战 —— 图片与文档输入智谱/DeepSeek
开发语言·人工智能·华为·php·harmonyos·arkts·arkui
大师兄66685 天前
HarmonyOS7 转场动画 Transition:页面切换更顺滑
arkui·harmonyos7·实战讲解
高地捣蛋鬼6 天前
HarmonyOS7 表单验证实战:实时校验与错误提示的完整方案
arkts·arkui·harmonyos7
大师兄66686 天前
HarmonyOS7 状态驱动 UI 原理:为什么改了数据视图就变
ui·arkui·实战案例·harmonyos7
不才难以繁此生8 天前
HarmonyOS 图片列表滑动卡顿怎么办:中式美食菜谱封面怎么做占位、缓存和失败兜底
harmonyos·image·arkui·中式美食·列表性能