HarmonyOS NEXT - 样式装饰器:@Styles和@Extend

如果每个组件的样式都需要单独设置,在开发过程中会出现大量代码在进行重复样式设置,虽然可以复制粘贴,但为了代码简洁性和后续方便维护,推出了可以提炼公共样式进行复用的装饰器@Styles。

@Styles装饰器可以将多条样式设置提炼成一个方法,直接在组件声明的位置调用。通过@Styles装饰器可以快速定义并复用自定义样式。

@Styles装饰器:定义组件重用样式 @Styles装饰器可以将多条样式设置提炼成一个方法,直接在组件声明的位置调用。通过@Styles装饰器可以快速定义并复用自定义样式。

@Styles装饰器缺点:

  • @Styles仅支持通用属性和通用事件。
  • @Styles方法不支持参数

@Styles装饰器限制条件:

  • @Styles方法不能有参数,编译期会报错,提醒开发者@Styles方法不支持参数。
  • @Styles方法内不支持使用逻辑组件,在逻辑组件内的属性不生效。

@Extend用于扩展原生组件样式

@Extend(UIComponentName) function functionName { ... }
  • @Extend仅支持在全局定义,不支持在组件内部定义
  • @Extend装饰的方法支持参数

@Extend使用规则

  • @Extend支持封装指定组件的私有属性、私有事件和自身定义的全局方法。
  • @Extend装饰的方法支持参数,开发者可以在调用时传递参数,调用遵循TS方法传值调用。
  • @Extend装饰的方法的参数可以为function,作为Event事件的句柄。
  • @Extend的参数可以为状态变量,当状态变量改变时,UI可以正常的被刷新渲染。

@Extend限制条件 @Extend仅支持在全局定义,不支持在组件内部定义。

代码实例

@Entry
@Component
struct StylesPage {
  @State message: string = '@Styles And @Extend';

  @Styles
  reuseStyle(){
    .backgroundColor(Color.Orange)
    .width(200)
    .margin(10)
    // .fontSize(20)
  }

  build() {
    Column() {
      Text(this.message)
        .fontSize(20)
        .fontWeight(FontWeight.Bold)

      Text('1').reuseStyle()
      Text('2').reuseStyle()
      Text('3').reuseStyle()

      Text('a').textStyle(100)
      Text('b').textStyle(150)
      Text('c').textStyle(200)
    }
    .height('100%')
    .width('100%')
  }
}

@Extend(Text)
function textStyle(w:number){
  .width(w)
  .backgroundColor(Color.Green)
  .margin(10)
  .fontSize(20)
}

@Styles和stateStyles联合使用 @Styles仅仅应用于静态页面的样式复用,stateStyles可以依据组件的内部状态的不同,快速设置不同样式。 代码实例

@Entry
@Component
struct MyComponent {
  @Styles normalStyle() {
    .backgroundColor(Color.Gray)
  }

  @Styles pressedStyle() {
    .backgroundColor(Color.Red)
  }

  build() {
    Column() {
      Text('Text1')
        .fontSize(50)
        .fontColor(Color.White)
        .stateStyles({
          normal: this.normalStyle,
          pressed: this.pressedStyle,
        })
    }
  }
}

stateStyles可以通过this绑定组件内的常规变量和状态变量

@Entry
@Component
struct CompWithInlineStateStyles {
  @State focusedColor: Color = Color.Red;
  normalColor: Color = Color.Green

  build() {
    Column() {
      Button('clickMe').height(100).width(100)
        .stateStyles({
          normal: {
            .backgroundColor(this.normalColor)
          },
          focused: {
            .backgroundColor(this.focusedColor)
          }
        })
        .onClick(() => {
          this.focusedColor = Color.Pink
        })
        .margin('30%')
    }
  }
}
全部评论

相关推荐

要点:1.leetcode必刷,hot100题,基本都是中等题2.操作系统、计算组成原理需要熟悉核心要点,比如网络七层模型、IO模型等等3.Java基础知识:多线程、锁等核心要了解原理4.mysql、resdis、kafka、es等中间件要熟悉原理以及使用要点5.多看看高并发场景设计题,基本逻辑都是一致的,参考https://cloud.tencent.com/developer/article/2327500这篇文档掌握以上要点!面试基本没啥大问题!最后给大家安利一个机会!【拼多多集团-PDD实习生招聘】内推链接:https://careers.pddglobalhr.com/campus/intern?t=l33sJKghOV,内推码:l33sJKghOV。期待你的加入!我们一起,无拼不青春!(通过此链接投递计入内推,内推简历优先筛选~)拼多多核心电商促销岗位,业务复杂,并发量高,技术提升能力速度快!工作:    电商核心岗位,业务直面用户与商家,业务体量大、并发量高、复杂度高,极具挑战性,提升能力速度快!    新人有专门导师带,完全不用担心业务复杂、技术能力的问题,导师非常负责任、非常有耐心!    工作氛围融洽,经常一起讨论问题,一起review代码!福利:    免费三餐外加夜宵,非常丰盛,日常还有免费各种饮料!    经常团建,晚上下班打车报销!真实工作体验:    1.下班免费打车报销。    2.公司提供免费的四餐(三餐+夜宵),餐品种类丰富,有肯德基、周黑鸭这些,而且有不限量的各种饮料提供!    3.进公司之后,有导师带着做项目需求,任何不懂的问题都可以去问导师,成长速度比较快!备注:大家如果需要面试经验,可以在投递的时候私聊我,知无不言!#牛客AI配图神器#
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务