我可以: 邀请好友来看>>
ZOL星空(中国) > 软件星空(中国) > 电脑综合星空(中国) > 操作系统星空(中国) > 鸿蒙开发:走进stateStyles多态样式
返回列表
签到
手机签到经验翻倍!
快来扫一扫!

鸿蒙开发:走进stateStyles多态样式

20浏览 / 1回复

vrn0hn

vrn0hn

0
精华
172
帖子

等  级:Lv.5
经  验:4227
  • Z金豆: 655

    千万礼品等你来兑哦~快点击这里兑换吧~

  • 城  市:
  • 注  册:2024-03-26
  • 登  录:2025-06-13
发表于 2025-02-27 11:06:39
电梯直达 确定
楼主

前言

一个组件,多种状态下,我们如何实现呢?举一个很简单的案例,一个按钮,默认状态下是黑色背景,点击后是红色,手指放开后还原黑色。

我们自然而然的就会想到利用手势的按下和抬起,改变其背景颜色即可,代码如下:

Button("点击")
        .backgroundColor(this.clickBackgroundColor)
        .onTouch((event: TouchEvent) => {
            if (event.type == TouchType.Down) {
              this.clickBackgroundColor = Color.Red 
          } else if (event.type == TouchType.Up) {
            this.clickBackgroundColor = Color.Black         
          }      
       })

除了onTouch之外,gesture也可以实现其效果,无论哪种实现,我们都是要定义变量,改变某一个属性,有没有一种方式,直接更改属性呢?当然是有的,这就是stateStyles。

同样是上一个案例,我们使用stateStyles来实现一下,代码如下:

Button("点击")       
            .stateStyles({          
             pressed: { //按压           
               .backgroundColor(Color.Red)    
             },       
            normal: { //正常态       
               .backgroundColor(Color.Black)    
            }     
        })

可以发现,效果是和上述一模一样的。

简单概述

stateStyles为多态样式,可以依据组件的内部状态的不同,快速设置不同样式,比如背景颜色,颜色、大小等等常见的通用属性,此种行为,很类似于css中的伪类,但语法稍有不同,目前支持的有以下五种状态:

状态
概述
focused
获焦态
normal
正常态
pressed
按压态
disabled
不可用态
selected
选中态

实际场景


具体的场景主要适用于多状态的切换,比如前言中的案例,当然了,它是支持多个属性的,比如,我们再增加宽高属性:


Button("点击")       
            .stateStyles({         
             pressed: { //按压          
                .backgroundColor(Color.Red)        
                .width(200)          
                .height(100)      
              },      
              normal: { //正常态       
                   .backgroundColor(Color.Black)     
                   .width(100)       
                   .height(50)       
                  }      
               })

除了多个属性之外,另外也可以直接传递样式:

定义Styles:

@Styles 
 normalStyle() {
   
   .backgroundColor(Color.Black)
   
   .width(100)
   
   .height(50)
 
 }

 @Styles  
 pressedStyle() {
   
   .backgroundColor(Color.Red)
   
   .width(200)
   
   .height(100)
 
 }

使用Styles:

Button("点击")        
           .stateStyles({         
            pressed: this.pressedStyle,          
            normal: this.normalStyle       
         })

总结

selected状态一般用于可选择的组件,比如Checkbox,比如Radio,目前支持的组件如下:

支持组件
支持的参数/属性
起始API版本
Checkbox
select
10
CheckboxGroup
selectAll
10
Radio
checked
10
Toggle
isOn
10
ListItem
selected
10
GridItem
selected
10
MenuItem
selected
10

简单案例:

Radio({ value: 'Radio1', group: 'radioGroup1' })        
          .checked(this.value)        
          .height(50)        
          .width(50)       
          .borderRadius(50)        
          .radioStyle({ checkedBackgroundColor: Color.Red })       
          .onClick(() => {          
              this.value = !this.value       
           })      
           .stateStyles({         
             normal: {          
                .backgroundColor(Color.Black)         
           },         
         selected: {            
            .backgroundColor(Color.Red)         
          },        
        })

vrn0hn

vrn0hn


精华

帖子

等  级:Lv.5
经  验:4227
发表于 2025-02-27 15:44:43 1楼

顺便吆喝一句,如果有在看机会的朋友,感兴趣可以看看,技术大厂,前后端测试捞人,待遇给的还可以!→https://jsj.top/f/o38ijj

高级模式
星空(中国)精选大家都在看24小时热帖7天热帖大家都在问最新回答

针对ZOL星空(中国)您有任何使用问题和建议 您可以 联系星空(中国)管理员查看帮助  或  给我提意见

快捷回复 APP下载 返回列表