1e41f4b71Sopenharmony_ci# stateStyles:多态样式 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci 4e41f4b71Sopenharmony_ci\@Styles仅仅应用于静态页面的样式复用,stateStyles可以依据组件的内部状态的不同,快速设置不同样式。这就是我们本章要介绍的内容stateStyles(又称为:多态样式)。 5e41f4b71Sopenharmony_ci 6e41f4b71Sopenharmony_ci> **说明**: 7e41f4b71Sopenharmony_ci> 8e41f4b71Sopenharmony_ci> 多态样式仅支持通用属性 9e41f4b71Sopenharmony_ci 10e41f4b71Sopenharmony_ci## 概述 11e41f4b71Sopenharmony_ci 12e41f4b71Sopenharmony_cistateStyles是属性方法,可以根据UI内部状态来设置样式,类似于css伪类,但语法不同。ArkUI提供以下五种状态: 13e41f4b71Sopenharmony_ci 14e41f4b71Sopenharmony_ci- focused:获焦态。 15e41f4b71Sopenharmony_ci 16e41f4b71Sopenharmony_ci- normal:正常态。 17e41f4b71Sopenharmony_ci 18e41f4b71Sopenharmony_ci- pressed:按压态。 19e41f4b71Sopenharmony_ci 20e41f4b71Sopenharmony_ci- disabled:不可用态。 21e41f4b71Sopenharmony_ci 22e41f4b71Sopenharmony_ci- selected<sup>10+</sup>:选中态。 23e41f4b71Sopenharmony_ci 24e41f4b71Sopenharmony_ci 25e41f4b71Sopenharmony_ci## 使用场景 26e41f4b71Sopenharmony_ci 27e41f4b71Sopenharmony_ci 28e41f4b71Sopenharmony_ci### 基础场景 29e41f4b71Sopenharmony_ci 30e41f4b71Sopenharmony_ci下面的示例展示了stateStyles最基本的使用场景。Button1处于第一个组件,Button2处于第二个组件。按压时显示为pressed态指定的黑色。使用Tab键走焦,先是Button1获焦并显示为focus态指定的粉色。当Button2获焦的时候,Button2显示为focus态指定的粉色,Button1失焦显示normal态指定的蓝色。 31e41f4b71Sopenharmony_ci 32e41f4b71Sopenharmony_ci 33e41f4b71Sopenharmony_ci```ts 34e41f4b71Sopenharmony_ci@Entry 35e41f4b71Sopenharmony_ci@Component 36e41f4b71Sopenharmony_cistruct StateStylesSample { 37e41f4b71Sopenharmony_ci build() { 38e41f4b71Sopenharmony_ci Column() { 39e41f4b71Sopenharmony_ci Button('Button1') 40e41f4b71Sopenharmony_ci .stateStyles({ 41e41f4b71Sopenharmony_ci focused: { 42e41f4b71Sopenharmony_ci .backgroundColor('#ffffeef0') 43e41f4b71Sopenharmony_ci }, 44e41f4b71Sopenharmony_ci pressed: { 45e41f4b71Sopenharmony_ci .backgroundColor('#ff707070') 46e41f4b71Sopenharmony_ci }, 47e41f4b71Sopenharmony_ci normal: { 48e41f4b71Sopenharmony_ci .backgroundColor('#ff2787d9') 49e41f4b71Sopenharmony_ci } 50e41f4b71Sopenharmony_ci }) 51e41f4b71Sopenharmony_ci .margin(20) 52e41f4b71Sopenharmony_ci Button('Button2') 53e41f4b71Sopenharmony_ci .stateStyles({ 54e41f4b71Sopenharmony_ci focused: { 55e41f4b71Sopenharmony_ci .backgroundColor('#ffffeef0') 56e41f4b71Sopenharmony_ci }, 57e41f4b71Sopenharmony_ci pressed: { 58e41f4b71Sopenharmony_ci .backgroundColor('#ff707070') 59e41f4b71Sopenharmony_ci }, 60e41f4b71Sopenharmony_ci normal: { 61e41f4b71Sopenharmony_ci .backgroundColor('#ff2787d9') 62e41f4b71Sopenharmony_ci } 63e41f4b71Sopenharmony_ci }) 64e41f4b71Sopenharmony_ci }.margin('30%') 65e41f4b71Sopenharmony_ci } 66e41f4b71Sopenharmony_ci} 67e41f4b71Sopenharmony_ci``` 68e41f4b71Sopenharmony_ci 69e41f4b71Sopenharmony_ci 70e41f4b71Sopenharmony_ci **图1** 获焦态和按压态 71e41f4b71Sopenharmony_ci 72e41f4b71Sopenharmony_ci 73e41f4b71Sopenharmony_ci 74e41f4b71Sopenharmony_ci 75e41f4b71Sopenharmony_ci### \@Styles和stateStyles联合使用 76e41f4b71Sopenharmony_ci 77e41f4b71Sopenharmony_ci以下示例通过\@Styles指定stateStyles的不同状态。 78e41f4b71Sopenharmony_ci 79e41f4b71Sopenharmony_ci 80e41f4b71Sopenharmony_ci 81e41f4b71Sopenharmony_ci```ts 82e41f4b71Sopenharmony_ci@Entry 83e41f4b71Sopenharmony_ci@Component 84e41f4b71Sopenharmony_cistruct MyComponent { 85e41f4b71Sopenharmony_ci @Styles normalStyle() { 86e41f4b71Sopenharmony_ci .backgroundColor(Color.Gray) 87e41f4b71Sopenharmony_ci } 88e41f4b71Sopenharmony_ci 89e41f4b71Sopenharmony_ci @Styles pressedStyle() { 90e41f4b71Sopenharmony_ci .backgroundColor(Color.Red) 91e41f4b71Sopenharmony_ci } 92e41f4b71Sopenharmony_ci 93e41f4b71Sopenharmony_ci build() { 94e41f4b71Sopenharmony_ci Column() { 95e41f4b71Sopenharmony_ci Text('Text1') 96e41f4b71Sopenharmony_ci .fontSize(50) 97e41f4b71Sopenharmony_ci .fontColor(Color.White) 98e41f4b71Sopenharmony_ci .stateStyles({ 99e41f4b71Sopenharmony_ci normal: this.normalStyle, 100e41f4b71Sopenharmony_ci pressed: this.pressedStyle, 101e41f4b71Sopenharmony_ci }) 102e41f4b71Sopenharmony_ci } 103e41f4b71Sopenharmony_ci } 104e41f4b71Sopenharmony_ci} 105e41f4b71Sopenharmony_ci``` 106e41f4b71Sopenharmony_ci 107e41f4b71Sopenharmony_ci **图2** 正常态和按压态 108e41f4b71Sopenharmony_ci 109e41f4b71Sopenharmony_ci 110e41f4b71Sopenharmony_ci 111e41f4b71Sopenharmony_ci 112e41f4b71Sopenharmony_ci### 在stateStyles里使用常规变量和状态变量 113e41f4b71Sopenharmony_ci 114e41f4b71Sopenharmony_cistateStyles可以通过this绑定组件内的常规变量和状态变量。 115e41f4b71Sopenharmony_ci 116e41f4b71Sopenharmony_ci 117e41f4b71Sopenharmony_ci```ts 118e41f4b71Sopenharmony_ci@Entry 119e41f4b71Sopenharmony_ci@Component 120e41f4b71Sopenharmony_cistruct CompWithInlineStateStyles { 121e41f4b71Sopenharmony_ci @State focusedColor: Color = Color.Red; 122e41f4b71Sopenharmony_ci normalColor: Color = Color.Green 123e41f4b71Sopenharmony_ci 124e41f4b71Sopenharmony_ci build() { 125e41f4b71Sopenharmony_ci Column() { 126e41f4b71Sopenharmony_ci Button('clickMe').height(100).width(100) 127e41f4b71Sopenharmony_ci .stateStyles({ 128e41f4b71Sopenharmony_ci normal: { 129e41f4b71Sopenharmony_ci .backgroundColor(this.normalColor) 130e41f4b71Sopenharmony_ci }, 131e41f4b71Sopenharmony_ci focused: { 132e41f4b71Sopenharmony_ci .backgroundColor(this.focusedColor) 133e41f4b71Sopenharmony_ci } 134e41f4b71Sopenharmony_ci }) 135e41f4b71Sopenharmony_ci .onClick(() => { 136e41f4b71Sopenharmony_ci this.focusedColor = Color.Pink 137e41f4b71Sopenharmony_ci }) 138e41f4b71Sopenharmony_ci .margin('30%') 139e41f4b71Sopenharmony_ci } 140e41f4b71Sopenharmony_ci } 141e41f4b71Sopenharmony_ci} 142e41f4b71Sopenharmony_ci``` 143e41f4b71Sopenharmony_ci 144e41f4b71Sopenharmony_ciButton默认normal态显示绿色,第一次按下Tab键让Button获焦显示为focus态的红色,点击事件触发后,再次按下Tab键让Button获焦,focus态变为粉色。 145e41f4b71Sopenharmony_ci 146e41f4b71Sopenharmony_ci **图3** 点击改变获焦态样式 147e41f4b71Sopenharmony_ci 148e41f4b71Sopenharmony_ci 149