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![Video_2023-03-17_120758](figures/Video_2023-03-17_120758.gif)
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![Video_2023-03-17_144824](figures/Video_2023-03-17_144824.gif)
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![Video_2023-03-17_144605](figures/Video_2023-03-17_144605.gif)
149