🚀 鸿蒙开发入门必看!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、msg
      HelloComponent({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

  // ✅ 默认内容
  @Builder
  defaultBuilder() {
    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

  // 默认标题插槽
  @Builder
  defaultHeader() {
    Text('默认标题').fontSize(20)
  }

  // 默认内容插槽
  @Builder
  defaultContent() {
    Text('默认内容区域')
  }

  build() {
    Column() {
      this.headerBuilder()
      this.contentBuilder()
    }
    .padding(20)
    .backgroundColor('#fafafa')
    .borderRadius(10)
  }
}

@Entry
@Component
struct Index {
  @Builder
  myHeader() {
    Text('自定义标题').fontSize(22).fontColor(Color.Red)
  }

  @Builder
  myContent() {
    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博客

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐