@Styles:定义组件重用样式、@Extend:定义扩展组件样式,stateStyles:多态样式

@Styles(不支持传参)

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

@Styles组件内和全局@Styles的用法示例
// 定义在全局的@Styles封装的样式
@Styles function globalFancy  () {
  .width(150)
  .height(100)
  .backgroundColor(Color.Pink)
}

@Entry
@Component
struct FancyUse {
  @State heightValue: number = 100
  // 定义在组件内的@Styles封装的样式
  @Styles fancy() {
    .width(200)
    .height(this.heightValue)
    .backgroundColor(Color.Yellow)
    .onClick(() => {
      this.heightValue = 200
    })
  }

  build() {
    Column({ space: 10 }) {
      // 使用全局的@Styles封装的样式
      Text('FancyA')
        .globalFancy()
        .fontSize(30)
      // 使用组件内的@Styles封装的样式
      Text('FancyB')
        .fancy()
        .fontSize(30)
    }
  }
}

@Extend(支持传参,function,)

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

// @Extend(Text)可以支持Text的私有属性fontColor
@Extend(Text) function fancy () {
  .fontColor(Color.Red)
}
// superFancyText可以调用预定义的fancy
@Extend(Text) function superFancyText(size:number) {
    .fontSize(size)
    .fancy()
}

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

参数可以指定初始值,如果该参数指定了初始值,父组件调用时可以不传参使用初始值

参数类型可以是枚举类型,如Color,FontWeight,InputType.....


@Extend(Text) function fancy (colorEnum:Color = Color.Red,fontSize: number) {
  .fontColor(colorEnum)
  .fontSize(fontSize)
}

@Entry
@Component
struct FancyUse {
  build() {
    Row({ space: 10 }) {
      Text('Fancy')
        .fancy(16)
      Text('Fancy')
        .fancy(Color.Black,24)
    }
  }
}

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

@Extend(Text) function makeMeClick(onClick: () => void) {
  .backgroundColor(Color.Blue)
  .onClick(onClick)
}

@Entry
@Component
struct FancyUse {
  @State label: string = 'Hello World';

  onClickHandler() {
    this.label = 'Hello ArkUI';
  }

  build() {
    Row({ space: 10 }) {
      Text(`${this.label}`)
        .makeMeClick(() => {this.onClickHandler()})
    }
  }
}

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

@Extend(Text) function fancy (fontSize: number) {
  .fontColor(Color.Red)
  .fontSize(fontSize)
}

@Entry
@Component
struct FancyUse {
  @State fontSizeValue: number = 20
  build() {
    Row({ space: 10 }) {
      Text('Fancy')
        .fancy(this.fontSizeValue)
        .onClick(() => {
          this.fontSizeValue = 30
        })
    }
  }
}

stateStyles(属性状态)

stateStyles是属性方法,可以根据UI内部状态来设置样式,类似于css伪类,但语法不同。ArkUI提供以下五种状态:

  • focused:获焦态。

  • normal:正常态。

  • pressed:按压态。

  • disabled:不可用态。

  • selected10+:选中态。

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

  build() {
    Column() {
      Button('Button1')
        .stateStyles({
           //获焦态
          focused: {
            .backgroundColor(Color.Pink)
          },
           //正常态
          normal: {
            .backgroundColor(Color.Black)
          },
           //按压态
          pressed: {
            .backgroundColor(Color.Red)
          }
          //@Styles和stateStyles联合使用
          //disabled: this.normalStyle,
        })
    }.margin('30%')
  }
}

综合:

@Styles装饰器可以将多条样式设置提炼成一个方法但是不能传参

@Extend支持传参,可以为function,作为Event事件的句柄,参数也可以为状态变量,状态变量改变时,UI可以被刷新渲染。

stateStyles可以看作是css的伪类只是语法不同,一共有五种状态。

  • focused:获焦态。

  • normal:正常态。

  • pressed:按压态。

  • disabled:不可用态。

  • selected10+:选中态。

### 多态样式定义与使用 在前端开发领域,`stateStyles` 是专门用来定义多态样式的关键词[^1]。它允许开发者基于组件的不同状态(如 `focused`, `normal`, 和 `pressed`),快速设置不同的样式表现[^4]。 #### stateStyles 的基本概念 `stateStyles` 提供了一种机制来描述组件在其生命周期中的多种可能状态下的外观变化。这种特性使得 UI 开发更加灵活和高效,尤其是在处理交互性强的应用场景时尤为有用。 以下是 `stateStyles` 结合其他装饰器使用的代码示例: ```javascript @Entry @Component struct StateStylesSample { @Styles normalStyle() { .backgroundColor(Color.Gray) } build() { Column() { Button('Button1') .stateStyles({ focused: { .backgroundColor(Color.Pink) }, normal: { .backgroundColor(Color.Black) }, pressed: { .backgroundColor(Color.Red) } }) }.margin('30%') } } ``` 上述代码展示了如何利用 `stateStyles` 来配置按钮在不同状态下(聚焦、默认、按下)的背景颜色变化。 #### Extend 与其他关键字的区别 虽然 `@Extend` 可以用于继承已有组件样式,但它并不具备直接定义多态样式的功能。而 `@Styles` 则主要用于提取重复的样式逻辑以便于复用[^2]。相比之下,`stateStyles` 更专注于解决组件状态切换时的样式管理需求。 对于更复杂的动态属性调整情况,还可以考虑采用 `AttributeModifier` 工具[^3]。尽管它的灵活性更高,但在简单的状态样式设定上,`stateStyles` 显得更为直观易懂。 ### 使用方法总结 为了实现多态样式定义,应优先选用 `stateStyles` 进行操作,并可根据实际项目复杂度决定是否引入辅助工具如 `AttributeModifier` 或者结合 `@Styles` 装饰器共同完成任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值