鸿蒙开发 -- ui结构样式复用

本文介绍了ReactNative中组件的局部样式(@Styles)、全局样式和结构复用(@Builder,@Extend)的方法,包括它们的使用规则、限制以及参数传递机制,帮助开发者优化代码复用和性能。
摘要由CSDN通过智能技术生成

一、样式复用

@Styles  

1.组件内的 @styles 方法只能在当前组件中使用,全局的 @styles 方法目前只允许在当前的 .ets文件 中使用

2.组件内定义 @styles 方法时不需要使用 function 关键字,全局的 @styles 方法需要使用 function 关键字
3. @styles 方法中只能包含通用属性方法和通用事件方法
4. @styles 方法不支持参数

@Entry
@Component
struct Index {

  build() {
      Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) {

        Button('确认', { type: ButtonType.Capsule, stateEffect: true })
          .compButtonStyle()
        Button('取消', { type: ButtonType.Capsule, stateEffect: true })
          .globalButtonStyle()
        })
    }
    .width('100%').height('100%')
  }
  
  // 局部样式
  @Styles compButtonStyle() {
    .width(100)
    .height(40)
    .fontSize(20)
  }
}

// 全局样式
@Styles function globalButtonStyle() {
  .width(100)
  .height(40)
  .fontSize(20)
}

@Extend

1.@Extend 方法只能定义在全局,使用范围目前只限于当前的.ets文件
2.@Extend 方法用于特定类型的组件,因此可包含该组件的专有属性方法和专有事件方法
3.@Extend 方法支持参数

@Entry
@Component
struct Index {

  build() {
      Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) {

        Button('确认')
          .buttonStyle(Color.Gray)
        Button('取消')
          .width(100)
          .height(40)
          .fontSize(20)
          .type(ButtonType.Capsule)
          .backgroundColor(Color.Green)
        })
    }
    .width('100%').height('100%')
  }
}

// 全局样式
@Extend function buttonStyle(color: Color) {
  .width(100)
  .height(40)
  .fontSize(20)
  .type(ButtonType.Normal)
  .backgroundColor(color)
}

二、结构复用

@Builder

1.组件内的 @Builder 方法可通过 this 访问当前组件的属性和方法,而全局的 @Builder 方法则不能

2.组件内的 @Builder 方法只能用于当前组件,全局的 @Builder 方法导出(export )后,可用于整个应用。

@Entry
@Component
struct Index {

  build() {
      Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) {
        
        // 局部 结构复用
        compButtonBuilder($r('app.media.icon_send'), Color.Red, '发送', () => console.log('发送'))

        Button('取消'){
            Row({ space: 10 }) {
                Image($r('app.media.icon_cancel'))
                    .width(25).height(25)
                Text('取消')
                    .fontColor(Color.Green)
                    .fontSize(25)
            }
        }.width(100).height(40).onClick(() => {
            console.log('取消')
        })
        
        // 全局 结构复用
        globButtonBuilder($r('app.media.icon_cancel'), Color.Green, '取消', () => console.log('取消'))
    }
    .width('100%').height('100%')
  }

  // 局部
  @Builder compButtonBuilder(icon: Resource, color: Color, value: string, callback: () => 
  void) {
    Button(){
      Row({ space: 10 }) {
        Image(icon)
          .width(25).height(25)
        Text(value)
          .fontColor(color)
          .fontSize(25)
      }
    }.width(100).height(40).onClick(callback)
  }
}

// 全局
@Builder export function globButtonBuilder(icon: Resource, color: Color, value: string, callback: () => void) {
  Button(){
    Row({ space: 10 }) {
      Image(icon)
        .width(25).height(25)
      Text(value)
        .fontColor(color)
        .fontSize(25)
    }
  }.width(100).height(40).onClick(callback)
}

@Builder 方法具有两种参数传递机制-按值传递和按引用传递。当只有一个参数且参数为对象字面量时为按引用传递,其余情况均为按值传递。
按引用传递时,若传递的参数为状态变量,则状态变量的变化将会触发 @Builder 方法内部UI的刷新;按值传递时则不会

若复用的UI结构没有状态,推荐使用 @Builder 方法,否则使用自定义组件。

@BuilderParam

@Builderparam 用于装饰自定义组件(struct)中的属性,其装饰的属性可作为一个U!结构的占位符,待创建该组件时,可通过参数为其传入具体的内容。(其作用类似于Vue框架中的slot)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值