当前位置:   article > 正文

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(基本语法 五)_arkts伪类

arkts伪类

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

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

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

装饰器使用说明

  • 当前@Styles仅支持通用属性和通用事件。
  • @Styles方法不支持参数,反例如下。
  1. // 反例: @Styles不支持参数
  2. @Styles function globalFancy (value: number) {
  3. .width(value)
  4. }
  • @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 heightVlaue: number = 100
  4. @Styles fancy() {
  5. .height(this.heightVlaue)
  6. .backgroundColor(Color.Yellow)
  7. .onClick(() => {
  8. this.heightVlaue = 200
  9. })
  10. }
  11. }
  • 组件内@Styles的优先级高于全局@Styles。

    框架优先找当前组件内的@Styles,如果找不到,则会全局查找。

使用场景

以下示例中演示了组件内@Styles和全局@Styles的用法。

  1. // 定义在全局的@Styles封装的样式
  2. @Styles function globalFancy () {
  3. .width(150)
  4. .height(100)
  5. .backgroundColor(Color.Pink)
  6. }
  7. @Entry
  8. @Component
  9. struct FancyUse {
  10. @State heightVlaue: number = 100
  11. // 定义在组件内的@Styles封装的样式
  12. @Styles fancy() {
  13. .width(200)
  14. .height(this.heightVlaue)
  15. .backgroundColor(Color.Yellow)
  16. .onClick(() => {
  17. this.heightVlaue = 200
  18. })
  19. }
  20. build() {
  21. Column({ space: 10 }) {
  22. // 使用全局的@Styles封装的样式
  23. Text('FancyA')
  24. .globalFancy ()
  25. .fontSize(30)
  26. // 使用组件内的@Styles封装的样式
  27. Text('FancyB')
  28. .fancy()
  29. .fontSize(30)
  30. }
  31. }
  32. }

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

在前文的示例中,可以使用@Styles用于样式的扩展,在@Styles的基础上,我们提供了@Extend,用于扩展原生组件样式。

语法

@Extend(UIComponentName) function functionName { ... }

用规则

  • 和@Styles不同,@Extend仅支持定义在全局,不支持在组件内部定义。
  • 和@Styles不同,@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. }
  • 和@Styles不同,@Extend装饰的方法支持参数,开发者可以在调用时传递参数,调用遵循TS方法传值调用。
  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事件的句柄。
  1. @Extend(Text) function makeMeClick(onClick: () => void) {
  2. .backgroundColor(Color.Blue)
  3. .onClick(onClick)
  4. }
  5. @Entry
  6. @Component
  7. struct FancyUse {
  8. @State label: string = 'Hello World';
  9. onClickHandler() {
  10. this.label = 'Hello ArkUI';
  11. }
  12. build() {
  13. Row({ space: 10 }) {
  14. Text(`${this.label}`)
  15. .makeMeClick(this.onClickHandler.bind(this))
  16. }
  17. }
  18. }
  • @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. }

使用场景

以下示例声明了3个Text组件,每个Text组件均设置了fontStyle、fontWeight和backgroundColor样式。

  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. }

stateStyles:多态样式

@Styles和@Extend仅仅应用于静态页面的样式复用,stateStyles可以依据组件的内部状态的不同,快速设置不同样式。这就是我们本章要介绍的内容stateStyles(又称为:多态样式)。

概述

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

  • focused:获焦态。
  • normal:正常态。
  • pressed:按压态。
  • disabled:不可用态。

使用场景

基础场景

下面的示例展示了stateStyles最基本的使用场景。Button处于第一个组件,默认获焦,生效focused指定的粉色样式。按压时显示为pressed态指定的黑色。如果在Button前再放一个组件,使其不处于获焦态,就会生效normal态的黄色。

  1. @Entry
  2. @Component
  3. struct StateStylesSample {
  4. build() {
  5. Column() {
  6. Button('Click me')
  7. .stateStyles({
  8. focused: {
  9. .backgroundColor(Color.Pink)
  10. },
  11. pressed: {
  12. .backgroundColor(Color.Black)
  13. },
  14. normal: {
  15. .backgroundColor(Color.Yellow)
  16. }
  17. })
  18. }.margin('30%')
  19. }
  20. }

图1 获焦态和按压态

 

@Styles和stateStyles联合使用

以下示例通过@Styles指定stateStyles的不同状态。

  1. @Entry
  2. @Component
  3. struct MyComponent {
  4. @Styles normalStyle() {
  5. .backgroundColor(Color.Gray)
  6. }
  7. @Styles pressedStyle() {
  8. .backgroundColor(Color.Red)
  9. }
  10. build() {
  11. Column() {
  12. Text('Text1')
  13. .fontSize(50)
  14. .fontColor(Color.White)
  15. .stateStyles({
  16. normal: this.normalStyle,
  17. pressed: this.pressedStyle,
  18. })
  19. }
  20. }
  21. }

图2 正常态和按压态

 

在stateStyles里使用常规变量和状态变量

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

  1. @Entry
  2. @Component
  3. struct CompWithInlineStateStyles {
  4. @State focusedColor: Color = Color.Red;
  5. normalColor: Color = Color.Green
  6. build() {
  7. Button('clickMe').height(100).width(100)
  8. .stateStyles({
  9. normal: {
  10. .backgroundColor(this.normalColor)
  11. },
  12. focused: {
  13. .backgroundColor(this.focusedColor)
  14. }
  15. })
  16. .onClick(() => {
  17. this.focusedColor = Color.Pink
  18. })
  19. .margin('30%')
  20. }
  21. }

Button默认获焦显示红色,点击事件触发后,获焦态变为粉色。

图3 点击改变获焦态样式

​​​​​​​

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

闽ICP备14008679号