当前位置: 首页 > news >正文

鸿蒙ArkUI布局与样式进阶(十六)——页面级变量、函数注入与 @BuilderParam 插槽机制全解析(附详细注释)

🚀 鸿蒙开发入门必看!30 分钟掌握 ArkUI 界面开发

       大家好,我又来更新我的学习笔记啦!📒 这是我在学习HarmonyOS ArkUI 开发 时新的整理与思考。本篇内容比较全面,说实话,光靠看官方文档很难完全消化知识点,而把它们转化为笔记,再写成文章,能加深很多理解。所以这篇文章里,我不仅整理了原始代码,还会穿插一些自己的见解和体会,帮助你更好地掌握这些知识。  

      本文整合自鸿蒙 ArkUI 实战笔记重点讲解了 TypeScript 在 ArkUI 应用开发中的模块组织、组件封装与泛型编程思想。
所有示例均为实际项目代码,可直接运行、改写和复用。

    在鸿蒙 ArkUI 中,组件化是构建现代鸿蒙应用的核心能力。本篇文章将带你深入理解「组件封装」的底层逻辑,重点讲解:

目录

一、📘 页面级变量与状态变量的区别

成员变量:

二、🏗️ 实战:封装布局组件 MyPanel

三、🎨 动态插槽:@BuilderParam 的魔力

✅ 基本概念

四、🧩 多插槽组件(多个 @BuilderParam)

五、🔁 刷新与事件触发机制

六、🌟 综合实战场景:动态卡片组件

七、💬 总结

一、📘 页面级变量与状态变量的区别

在 ArkUI 中,组件中的变量主要分为两类:

类型装饰器特性是否触发刷新
状态变量@State、@Prop、@Link 等响应式,变化自动刷新 UI✅ 是
页面变量无装饰器定义的变量普通成员变量,不具备响应式特性❌ 否

🧠 定义与理解

页面级变量通常用于:
    •    存放非响应式数据(例如接口缓存、临时状态)
    •    定义组件内部逻辑函数(例如事件处理)
    •    作为外部可覆盖的行为钩子

它不触发 UI 更新,因此效率更高,也更易控制。

成员变量:

🧩 示例:组件内定义页面级变量与函数

@Component
struct HelloComponent {// ✅ 1. 响应式状态变量:变化时自动刷新 UI@State msg: string = '初始消息'// ✅ 2. 页面级变量:普通数据,不触发刷新info: string = '默认信息'// ✅ 3. 页面级函数:可被外部组件覆盖sayHello() {console.log('默认 sayHello 执行')}// ✅ 4. 页面级函数:可被外部替换或内部使用sayHi() {console.log('默认 sayHi 执行')}
 build() {Column({space: 10}) {Text(this.msg)Text(this.info)Button('触发 sayHello').onClick(() => this.sayHello())Button('触发 sayHi').onClick(() => this.sayHi())}.padding(20).backgroundColor('#f7f7f7')}
}

🔧 外部传值与函数覆盖

外部引用组件时,可以通过传参来覆盖组件的页面变量和函数:

@Entry
@Component
struct CustomComponentDemo {build() {Column({space: 10}) {// ✅ 使用默认定义HelloComponent()// ✅ 传入数据覆盖 info、msgHelloComponent({info: '外部传入信息', msg: 'Hello ArkUI'})// ✅ 覆盖函数逻辑HelloComponent({sayHello: () => {console.log('外部 sayHello 被调用')AlertDialog.show({message: '外部逻辑执行成功!'})}})}.padding(20)}
}

🧠 理解要点:
    •    @State 用于响应式 UI;
    •    页面变量仅是普通属性;
    •    外部传入的值若同名,会覆盖组件内部定义;
    •    可用于注入外部行为逻辑,如自定义事件回调。

二、🏗️ 实战:封装布局组件 MyPanel

在 ArkUI 项目中,我们经常需要封装「可复用布局」。
下面是一个典型的面板组件封装示例:

@Component
struct MyPanel {build() {Column() {// ✅ 标题区域Row() {Text('订单中心').fontSize(18).fontColor('#000')Text('查看更多').fontSize(16).fontColor('#666')}.justifyContent(FlexAlign.spaceBetween).padding({bottom: 10})// ✅ 内容区Row() {Text('这里是订单的内容部分')}.padding(20).width('100%').height(200).borderRadius(10).backgroundColor(Color.White).margin({bottom: 15})}}
}@Entry
@Component
struct Index {build() {Column() {MyPanel()MyPanel()}.width('100%').height('100%').backgroundColor('#f2f2f2')}
}

💡 个人理解:
    •    封装组件可以极大提升代码复用率;
    •    若配合 @BuilderParam,可以将内容区域「插槽化」,让外部决定展示什么内容;
    •    这是 ArkUI 组件化的核心思想。

三、🎨 动态插槽:@BuilderParam 的魔力

✅ 基本概念

@BuilderParam 是 ArkUI 中的「插槽机制」,允许父组件向子组件传入 UI 构建函数(Builder)。
也就是说,子组件不再固定显示内容,而是交由父组件决定。

🌱 基础示例:单插槽组件

@Entry
@Component
struct Index {build() {Column({space: 10}) {// ✅ 传入自定义内容SonCom() {Button('我是插入的按钮').backgroundColor(Color.Blue)}}}
}@Component
struct SonCom {// ✅ 定义插槽:接受外部 UI 构建函数@BuilderParam ContentBuilder: () => void = this.defaultBuilder// ✅ 默认内容@BuilderdefaultBuilder() {Text('默认显示内容')}build() {Column() {this.ContentBuilder()}.padding(15).borderRadius(8).backgroundColor('#fff')}
}

🧩 结果说明:
    •    若父组件传入了内容,则显示传入的内容;
    •    若未传入,则渲染默认内容;
    •    这相当于 Vue 的「默认插槽」与 React 的「children」。

🧠 场景价值
    •    用于组件「内容定制」;
    •    可在不同页面以不同 UI 内容复用同一组件;
    •    减少硬编码,降低耦合;
    •    常用于 Card、ListItem、Dialog、Panel 等组件。

四、🧩 多插槽组件(多个 @BuilderParam)

复杂组件可能有多个区域(如 header、content、footer),
这时我们可以使用多个 @BuilderParam。

@Component
struct SonCom {// ✅ 定义两个插槽区域@BuilderParam headerBuilder: () => void = this.defaultHeader@BuilderParam contentBuilder: () => void = this.defaultContent// 默认标题插槽@BuilderdefaultHeader() {Text('默认标题').fontSize(20)}// 默认内容插槽@BuilderdefaultContent() {Text('默认内容区域')}build() {Column() {this.headerBuilder()this.contentBuilder()}.padding(20).backgroundColor('#fafafa').borderRadius(10)}
}@Entry
@Component
struct Index {@BuildermyHeader() {Text('自定义标题').fontSize(22).fontColor(Color.Red)}@BuildermyContent() {Text('这是外部传入的内容区').fontSize(18)}build() {Column({space: 10}) {SonCom({headerBuilder: this.myHeader,contentBuilder: this.myContent})}.padding(15)}
}

🧠 理解:
    •    每个插槽可单独传入;
    •    没传入时使用默认内容;
    •    插槽组合让组件结构更灵活,适配更多页面。

五、🔁 刷新与事件触发机制

在插槽中,我们可以通过页面级变量与函数交互,触发局部刷新或行为。

@Entry
@Component
struct MyPanel {@State counter: number = 0// 普通函数:触发事件逻辑addCount() {this.counter++console.log('计数:', this.counter)}build() {Column({space: 10}) {Text(`当前计数:${this.counter}`)Button('点击增加').onClick(() => this.addCount())}.padding(20).backgroundColor('#fff')}
}

💡 开发技巧:
    •    页面变量适合封装函数;
    •    状态变量适合更新 UI;
    •    @BuilderParam 可传入外部逻辑函数与 UI;
    •    三者结合可实现灵活组件行为控制。

六、🌟 综合实战场景:动态卡片组件

@Component
struct CardPanel {@BuilderParam HeaderBuilder: () => void = this.defaultHeader@BuilderParam ContentBuilder: () => void = this.defaultContent@Builder defaultHeader() {Text('默认卡片标题').fontSize(20)}@Builder defaultContent() {Text('默认卡片内容')}build() {Column() {this.HeaderBuilder()Divider()this.ContentBuilder()}.padding(20).borderRadius(10).backgroundColor('#fff').shadow({radius: 6, color: '#ccc'})}
}@Entry
@Component
struct Index {@Builder Header() {Text('🔥 我的订单').fontSize(22).fontColor(Color.Blue)}@Builder Content() {Text('您有 3 个未支付订单').fontSize(18).fontColor('#333')}build() {Column({space: 10}) {CardPanel({HeaderBuilder: this.Header,ContentBuilder: this.Content})}.padding(15)}
}

七、💬 总结

能力  说明使用场景
页面级变量非响应式数据存储临时值、函数逻辑
页面级函数可注入行为逻辑外部传入自定义逻辑
@State响应式状态UI 刷新驱动
@BuilderParam 动态插槽灵活内容渲染
多插槽 组件结构细分Header / Content / Footer

      恭喜您,迈出了鸿蒙应用开发坚实的一步!🎉
🤔 接下来,我将继续为大家更新鸿蒙开发的相关知识点,如果喜欢,记得关注驻波

那年窗外下的雪.-CSDN博客

http://www.dtcms.com/a/577523.html

相关文章:

  • 网站加载页面怎么做seo网站设计外包
  • sqlserver2019中,一列为计算项目,一列为计算公式及计算项目代表的数字,如何找出一个计算项目是数字改变时,会有多个涉及的计算项目
  • 网站截图可以做证据吗微信小程序模板免费下载
  • 手机兼容测试服务提供商对比分析:腾讯优测Utest的优势与挑战
  • repo xml语法
  • 如何选择能够高效运行的云手机
  • IFC转换为3DXML的技术指南在线转换推荐
  • 站长之家工具网页界面设计的内容五大设计要素
  • MAUI劝退:内部消息机制(社区工具包)
  • 西安 网站 公司wordpress同步微信公众号
  • Xshell效率实战:SSH管理秘籍技术大纲
  • 和平精英java 游戏程序
  • 【Java】异常详解+实例演示+知识总结
  • 【大模型训练】sglang 权重绑定和roll HF Meg相互转化
  • 有那个网站可以做报名链接的网站开发项目简单描述
  • C++ 链表 模拟 递归 迭代 力扣 24. 两两交换链表中的节点 题解 每日一题
  • 北京做网站的外包公司百度小程序注册
  • GitHub 全方位指南(续):实战进阶与生态拓展​
  • 二十四、STM32的DMA
  • 新能源汽车高压系统“隐形守护者”:X电容、Y电容、支撑电容、共模电感与薄膜电容的关系全解析
  • OpenCV(二十一):HSV与HSL
  • 东莞seo建站优化方法做网站最小的字体是多少钱
  • Linux安装镜像initrd深度解析:从Lorax构建到故障排查
  • 基础篇:IoC(六):资源和资源加载器
  • Qt之元对象系统
  • 宿州网站建设设计公司海口可信的海南网站建设
  • Go Map 实现原理解析:从数据结构到核心机制
  • 百度做的网站国外可以打开吗软件开发过程五个步骤
  • 快速入门 - 开始使用 Azure Digital Twins Explorer 中的示例场景
  • 快速入门 - Azure 数字孪生的 3D 场景工作室(预览版)入门