赞
踩
如果每个组件的样式都需要单独设置,在开发过程中会出现大量代码在进行重复样式设置,虽然可以复制粘贴,但为了代码简洁性和后续方便维护,我们推出了可以提炼公共样式进行复用的装饰器@Styles。
@Styles装饰器可以将多条样式设置提炼成一个方法,直接在组件声明的位置调用。通过@Styles装饰器可以快速定义并复用自定义样式。用于快速定义并复用自定义样式。
- // 反例: @Styles不支持参数
- @Styles function globalFancy (value: number) {
- .width(value)
- }
- // 全局
- @Styles function functionName() { ... }
-
- // 在组件内
- @Component
- struct FancyUse {
- @Styles fancy() {
- .height(100)
- }
- }
- @Component
- struct FancyUse {
- @State heightVlaue: number = 100
- @Styles fancy() {
- .height(this.heightVlaue)
- .backgroundColor(Color.Yellow)
- .onClick(() => {
- this.heightVlaue = 200
- })
- }
- }
框架优先找当前组件内的@Styles,如果找不到,则会全局查找。
以下示例中演示了组件内@Styles和全局@Styles的用法。
- // 定义在全局的@Styles封装的样式
- @Styles function globalFancy () {
- .width(150)
- .height(100)
- .backgroundColor(Color.Pink)
- }
-
- @Entry
- @Component
- struct FancyUse {
- @State heightVlaue: number = 100
- // 定义在组件内的@Styles封装的样式
- @Styles fancy() {
- .width(200)
- .height(this.heightVlaue)
- .backgroundColor(Color.Yellow)
- .onClick(() => {
- this.heightVlaue = 200
- })
- }
-
- build() {
- Column({ space: 10 }) {
- // 使用全局的@Styles封装的样式
- Text('FancyA')
- .globalFancy ()
- .fontSize(30)
- // 使用组件内的@Styles封装的样式
- Text('FancyB')
- .fancy()
- .fontSize(30)
- }
- }
- }
在前文的示例中,可以使用@Styles用于样式的扩展,在@Styles的基础上,我们提供了@Extend,用于扩展原生组件样式。
@Extend(UIComponentName) function functionName { ... }
- // @Extend(Text)可以支持Text的私有属性fontColor
- @Extend(Text) function fancy () {
- .fontColor(Color.Red)
- }
- // superFancyText可以调用预定义的fancy
- @Extend(Text) function superFancyText(size:number) {
- .fontSize(size)
- .fancy()
- }
- // xxx.ets
- @Extend(Text) function fancy (fontSize: number) {
- .fontColor(Color.Red)
- .fontSize(fontSize)
- }
-
- @Entry
- @Component
- struct FancyUse {
- build() {
- Row({ space: 10 }) {
- Text('Fancy')
- .fancy(16)
- Text('Fancy')
- .fancy(24)
- }
- }
- }
- @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.bind(this))
- }
- }
- }
- @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
- })
- }
- }
- }
以下示例声明了3个Text组件,每个Text组件均设置了fontStyle、fontWeight和backgroundColor样式。
- @Entry
- @Component
- struct FancyUse {
- @State label: string = 'Hello World'
-
- build() {
- Row({ space: 10 }) {
- Text(`${this.label}`)
- .fontStyle(FontStyle.Italic)
- .fontWeight(100)
- .backgroundColor(Color.Blue)
- Text(`${this.label}`)
- .fontStyle(FontStyle.Italic)
- .fontWeight(200)
- .backgroundColor(Color.Pink)
- Text(`${this.label}`)
- .fontStyle(FontStyle.Italic)
- .fontWeight(300)
- .backgroundColor(Color.Orange)
- }.margin('20%')
- }
- }
@Extend将样式组合复用,示例如下。
- @Extend(Text) function fancyText(weightValue: number, color: Color) {
- .fontStyle(FontStyle.Italic)
- .fontWeight(weightValue)
- .backgroundColor(color)
- }
通过@Extend组合样式后,使得代码更加简洁,增强可读性。
- @Entry
- @Component
- struct FancyUse {
- @State label: string = 'Hello World'
-
- build() {
- Row({ space: 10 }) {
- Text(`${this.label}`)
- .fancyText(100, Color.Blue)
- Text(`${this.label}`)
- .fancyText(200, Color.Pink)
- Text(`${this.label}`)
- .fancyText(300, Color.Orange)
- }.margin('20%')
- }
- }
@Styles和@Extend仅仅应用于静态页面的样式复用,stateStyles可以依据组件的内部状态的不同,快速设置不同样式。这就是我们本章要介绍的内容stateStyles(又称为:多态样式)。
stateStyles是属性方法,可以根据UI内部状态来设置样式,类似于css伪类,但语法不同。ArkUI提供以下四种状态:
下面的示例展示了stateStyles最基本的使用场景。Button处于第一个组件,默认获焦,生效focused指定的粉色样式。按压时显示为pressed态指定的黑色。如果在Button前再放一个组件,使其不处于获焦态,就会生效normal态的黄色。
- @Entry
- @Component
- struct StateStylesSample {
- build() {
- Column() {
- Button('Click me')
- .stateStyles({
- focused: {
- .backgroundColor(Color.Pink)
- },
- pressed: {
- .backgroundColor(Color.Black)
- },
- normal: {
- .backgroundColor(Color.Yellow)
- }
- })
- }.margin('30%')
- }
- }
图1 获焦态和按压态
以下示例通过@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,
- })
- }
- }
- }
图2 正常态和按压态
stateStyles可以通过this绑定组件内的常规变量和状态变量。
- @Entry
- @Component
- struct CompWithInlineStateStyles {
- @State focusedColor: Color = Color.Red;
- normalColor: Color = Color.Green
-
- build() {
- Button('clickMe').height(100).width(100)
- .stateStyles({
- normal: {
- .backgroundColor(this.normalColor)
- },
- focused: {
- .backgroundColor(this.focusedColor)
- }
- })
- .onClick(() => {
- this.focusedColor = Color.Pink
- })
- .margin('30%')
- }
- }
Button默认获焦显示红色,点击事件触发后,获焦态变为粉色。
图3 点击改变获焦态样式
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。