当前位置:   article > 正文

HarmonyOS入门 -1.自定义组件

HarmonyOS入门 -1.自定义组件

自定义组件结构

  1. @Entry
  2. @Component
  3. struct Task {
  4. build() {
  5. }
  6. }

@Entry 装饰的自定义组件将作为UI页面的入口。在单个UI页面中,最多可以使用@Entry 装饰一个自定义组件。 @Entry可以接受一个可选的LocalStorage的参数

build() 函数

声明在build() 函数的语言,我们统称为UI描述,UI描述需要遵循以下规则。

@Entry装饰的自定义组件,其build()下的根节点唯一且必要,必须为容器组件,其中ForEach禁止作为根节点。

@Component装饰的自定义组件,其build()下的根节点唯一且必要,可以为非容器组件,其中ForEach禁止为根节点。

  1. @Entry
  2. @Component
  3. struct MyComponent {
  4. build() {
  5. // 根节点唯一且必要,必须为容器组件
  6. Row() {
  7. ChildComponent()
  8. }
  9. }
  10. }
  11. @Component
  12. struct ChildComponent {
  13. build() {
  14. //根节点唯一且必要,可以为非容器组件
  15. Image($r('app.media.app_icon'))
  16. .width(60)
  17. }
  18. }

@Builder修饰器

@Builder修饰器修饰一个函数,将@Builder装饰的函数也称为“自定义构建函数”。

组件内自定义构建函数

@Builder MyBuilderFunction(){ ... }

 使用方法

this.MyBuilderFunction()
  • 允许在自定义组件内定义一个或多个@Builder方法,该方法被认为是该组件的私有、特殊类型的成员函数。
  • 自定义构建函数可以在所属组件的build方法和其他自定义构建函数中调用,但不允许在组件外调用。
  • 在自定义函数体中,this指代当前所属组件,组件的状态变量可以在自定义构建函数内访问。建议通过this访问自定义组件的状态变量而不是参数传递。

全局自定义构建函数 

@Builder function MyGlobalBuilderFunction(){ ... }

使用方法

MyGlobalBuilderFunction()
  • 全局的自定义构建函数可以被整个应用获取,不允许使用this和bind方法。
  • 如果不涉及组件状态变化,建议使用全局的自定义构建方法。

按值传递参数

调用@Builder装饰的函数默认按值传递。当传递的参数为状态变量时,状态变量的改变不会引起@Builder方法内的UI刷新。所以当使用状态变量的时候,推荐使用按引用传递

  1. @Builder function overBuilder(paramA1: string) {
  2. Row() {
  3. Text(`UseStateVarByValue: ${paramA1} `)
  4. }
  5. }
  6. @Entry
  7. @Component
  8. struct Parent {
  9. @State label: string = 'Hello';
  10. build() {
  11. Column() {
  12. overBuilder(this.label)
  13. }
  14. }
  15. }

 按引用传递参数

按引用传递参数时,传递的参数可为状态变量,且状态变量的改变会引起@Builder方法内的UI刷新。ArkUI提供$$作为按引用传递参数的范式。

  1. @Builder function overBuilder($$: { paramA1: string }) {
  2. Row() {
  3. Text(`UseStateVarByReference: ${$$.paramA1} `)
  4. }
  5. }
  6. @Entry
  7. @Component
  8. struct Parent {
  9. @State label: string = 'Hello';
  10. build() {
  11. Column() {
  12. // 在Parent组件中调用ABuilder的时候,将this.label引用传递给ABuilder
  13. overBuilder({ paramA1: this.label })
  14. Button('Click me').onClick(() => {
  15. // 点击“Click me”后,UI从“Hello”刷新为“ArkUI”
  16. this.label = 'ArkUI';
  17. })
  18. }
  19. }
  20. }

@Styles 装饰器  定义组件重用样式

  • 当前@Styles仅支持通用属性通用事件
  • @Styles方法不支持参数
  • @Styles可以定义在组件内或全局,在全局定义时需在方法名前面添加function关键字,组件内定义时则不需要添加function关键字。
  1. // 全局
  2. @Styles function functionName() { ... }
  3. // 在组件内
  4. @Component
  5. struct FancyUse {
  6. @Styles fancy() {
  7. .height(100)
  8. }
  9. }

 定义在组件内的@Styles可以通过this访问组件的常量和状态变量,并可以在@Styles里通过事件来改变状态变量的值,示例如下

  1. @Component
  2. struct FancyUse {
  3. @State heightValue: number = 100
  4. @Styles fancy() {
  5. .height(this.heightValue)
  6. .backgroundColor(Color.Yellow)
  7. .onClick(() => {
  8. this.heightValue = 200
  9. })
  10. }
  11. }

 @Extend 装饰器 定义扩展组件样式

仅支持定义在全局

@Extend支持封装指定的组件的私有属性和私有事件和预定义相同组件的@Extend的方法。

  1. // @Extend(Text)可以支持Text的私有属性fontColor
  2. @Extend(Text) function fancy () {
  3. .fontColor(Color.Red)
  4. }
  5. // superFancyText可以调用预定义的fancy
  6. @Extend(Text) function superFancyText(size:number) {
  7. .fontSize(size)
  8. .fancy()
  9. }

 @Extend 装饰的方法支持参数,开发者可以在调用时传递参数

  1. // xxx.ets
  2. @Extend(Text) function fancy (fontSize: number) {
  3. .fontColor(Color.Red)
  4. .fontSize(fontSize)
  5. }
  6. @Entry
  7. @Component
  8. struct FancyUse {
  9. build() {
  10. Row({ space: 10 }) {
  11. Text('Fancy')
  12. .fancy(16)
  13. Text('Fancy')
  14. .fancy(24)
  15. }
  16. }
  17. }

@Extend装饰的方法的参数可以为function,作为Event事件的句柄

@Extend的参数可以为状态变量,当状态变量改变时,UI可以正常的被刷新渲染

  1. @Extend(Text) function fancy (fontSize: number) {
  2. .fontColor(Color.Red)
  3. .fontSize(fontSize)
  4. }
  5. @Entry
  6. @Component
  7. struct FancyUse {
  8. @State fontSizeValue: number = 20
  9. build() {
  10. Row({ space: 10 }) {
  11. Text('Fancy')
  12. .fancy(this.fontSizeValue)
  13. .onClick(() => {
  14. this.fontSizeValue = 30
  15. })
  16. }
  17. }
  18. }

 使用场景:

不使用@Extend

  1. @Entry
  2. @Component
  3. struct FancyUse {
  4. @State label: string = 'Hello World'
  5. build() {
  6. Row({ space: 10 }) {
  7. Text(`${this.label}`)
  8. .fontStyle(FontStyle.Italic)
  9. .fontWeight(100)
  10. .backgroundColor(Color.Blue)
  11. Text(`${this.label}`)
  12. .fontStyle(FontStyle.Italic)
  13. .fontWeight(200)
  14. .backgroundColor(Color.Pink)
  15. Text(`${this.label}`)
  16. .fontStyle(FontStyle.Italic)
  17. .fontWeight(300)
  18. .backgroundColor(Color.Orange)
  19. }.margin('20%')
  20. }
  21. }

@Extend将样式组合复用,示例如下

  1. @Extend(Text) function fancyText(weightValue: number, color: Color) {
  2. .fontStyle(FontStyle.Italic)
  3. .fontWeight(weightValue)
  4. .backgroundColor(color)
  5. }

通过@Extend组合样式后,使得代码更加简洁,增强可读性。

  1. @Entry
  2. @Component
  3. struct FancyUse {
  4. @State label: string = 'Hello World'
  5. build() {
  6. Row({ space: 10 }) {
  7. Text(`${this.label}`)
  8. .fancyText(100, Color.Blue)
  9. Text(`${this.label}`)
  10. .fancyText(200, Color.Pink)
  11. Text(`${this.label}`)
  12. .fancyText(300, Color.Orange)
  13. }.margin('20%')
  14. }
  15. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/324577
推荐阅读
相关标签
  

闽ICP备14008679号