当前位置: 首页 > article >正文

鸿蒙4.0开发笔记之ArkTS装饰器语法基础@Extend扩展组件样式与stateStyles多态样式(十一)

一、Extend扩展组件样式

1、作用
前文提到可以使用@Styles用于样式的扩展,在@Styles的基础上,ArkTS语法还提供了@Extend,⽤于扩展原生组件样式,包括Text、Button等等。

2、定义语法

@Extend(UIComponentName) function functionName { ... } 
//UIComponentName表示原生组件,如Text、Button...
//functionName为样式函数名

3、使用规则(和@Styles不同)

  • @Extend仅支持定义在全局,不支持在组件内部定义。
  • @Extend支持封装指定的组件的私有属性和私有事件和预定义相同组件的@Extend的方法。
  • @Extend装饰的方法支持参数,开发者可以在调用时传递参数,调用遵循ts方法传值调用。
@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装饰的⽅法的参数可以为function,作为Event事件的句柄。
@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
			})
		}
	}
}

二、stateStyles多态样式

1、概念
@Styles和@Extend仅仅应用于静态页面的样式复用,stateStyles可以依据组件的内部状态的不同,快速设置不同样式,即多态样式。

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

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

3、注意
Button处于第⼀个组件,会默认获焦,生效focused下面的属性样式。

三、@Extend与stateStyles练习

1、@Extend练习任务
使用Extend扩展样式对Text和Button两类组件进行渲染,并需要传递相应参数,其中Button组件的参数需要包括一个函数,以实现点击按钮能够将按钮上的数字进行累加。

2、stateStyles练习任务
按压时显示为pressed态指定的红色。如果在Button前再放⼀个组件,使其不处于获焦态,就会生效normal态的橙色。若果在Button前没有组件,则会默认获焦,生效focused态的蓝色。

3、练习代码

@Entry
@Component
struct Index {
  @State message: string = '@Extend\n扩展样式'
  //用于按钮计数的状态值
  @State count: number = 0

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .margin({bottom:15})
        Divider()
        //调用Extend扩展样式函数
        Text('取之无禁,').textDefined(40,Color.Brown)
        Text('用之不竭。').textDefined(30,'green')
        Text('是造物者之无尽藏也,').textDefined(20,'#00AABB')
        Text('而吾与子之所共适!').textDefined(40,Color.Red)

        //对按钮进行Extend扩展函数的调用
        //错误调用:Button(this.count),必须转为字符串类型
        Button(this.count.toString()).btnDefined(()=>{
          this.count++
        }
        )

        //多态样式:也是一种属性方法,但是可以同时写不同状态下的属性
        Button('多态样式').width('90%').fontSize(40).margin({top:15})
          .stateStyles({
            normal: {
              .backgroundColor(Color.Orange)
            },
            focused:{
              .backgroundColor(Color.Blue)
            },
            pressed:{
              .backgroundColor(Color.Red)
            }
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

//定义文本扩展样式
@Extend(Text) function textDefined(fs:number, fc:Color|string){
  .fontSize(fs)
  .fontColor(fc)
  .fontWeight(FontWeight.Bold)
  .fontStyle(FontStyle.Italic)
}

//定义按钮扩展样式
//自定义组件的参数可以是一个函数
//或者定义为:@Extend(Button) function btnDefined(click:Function){
@Extend(Button) function btnDefined(click:()=>void){
  .fontSize(50)
  .width(200)
  //调用传递过来的函数(形式参数)
  .onClick(()=>{
    click()
  })
}

4、测试效果
3.4.1


http://www.kler.cn/news/149988.html

相关文章:

  • 仿美团外卖源码/在线外卖平台源码PHP/支持多商户+多样化配送费+本土外卖+支持第三方配送
  • 【独家OD2023C卷真题】20天拿下华为OD笔试【贪心】2023C-分配土地最大面积【欧弟算法】全网注释最详细分类最全的华为OD真题题解
  • 网络运维与网络安全 学习笔记2023.11.29
  • 【计算机毕业设计】nodejs+vue音乐播放器系统 微信小程序83g3s
  • J-Flash工具的使用---擦除、烧录及校验
  • NineData:帮助开发者用好数据和云
  • uniapp上架app store详细攻略
  • 人机交互2——任务型多轮对话的控制和生成
  • vue3+ts+vite 打包报错 TS2304: Cannot find name ‘xxx‘
  • 【Vue3】Vue3引入DataV |BIN-DATAV 开发大屏
  • 初刷leetcode题目(11)——数据结构与算法
  • leetCode 841. 钥匙和房间 图遍历 深度优先遍历+广度优先遍历 + 图解
  • XML映射文件
  • 基于UDP的TFTP文件传输
  • 关于X86机器上运行GnuCobol的研究
  • 【Pytorch】Visualization of Feature Maps(5)——Deep Dream
  • Java常见的面试题(很基础那种)
  • 【Java】泛型的简单使用
  • Leetcode(面试题 08.01.)三步问题
  • 【开题报告】海洋多源数据质量控制应用服务的WebServer设计与实现
  • 大数据-之LibrA数据库系统告警处理(ALM-37003 GTM主备不同步或者GTM主备断连)
  • C语言——深入理解指针(3)
  • 轻量封装WebGPU渲染系统示例<38>- 动态构建WGSL材质Shader(源码)
  • 【从删库到跑路 | MySQL总结篇】表的增删查改(进阶下)
  • Spine深入学习———— 渲染
  • Buzz库python代码示例
  • 通往AGI的大模型MultiAgent的RL是对的但HF有上限
  • Windows 10和11的一个专用的设置菜单,让清理空间变得方便快捷
  • pkpmbs 建设工程质量监督系统 文件上传漏洞复现
  • QML TextField Button 属性 pyside6