当前位置:   article > 正文

HarmonyOS--ArkTS(1)--基本语法(2)

HarmonyOS--ArkTS(1)--基本语法(2)

目录

@Styles装饰器:定义组件重用样式 

@Extend装饰器:定义扩展组件样式 

stateStyles:多态样式 

@Builder装饰器:自定义构建函数

自定义组件内自定义构建函数

全局自定义构建函数

@BuilderParam装饰器:引用@Builder函数 


@Styles装饰器:定义组件重用样式 

  • @Styles可以定义在组件内或全局,在全局定义时需在方法名前面添加function关键字,组件内定义时则不需要添加function关键字。
  • 定义在组件内的@Styles可以通过this访问组件的常量和状态变量,并可以在@Styles里通过事件来改变状态变量的值,示例如下:
  • 组件内@Styles的优先级高于全局@Styles。

    框架优先找当前组件内的@Styles,如果找不到,则会全局查找。

  1. // 定义在全局的@Styles封装的样式
  2. @Styles function globalFancy () {
  3. .width(150)
  4. .height(100)
  5. .backgroundColor(Color.Pink)
  6. }
  7. @Entry
  8. @Component
  9. struct FancyUse {
  10. @State heightValue: number = 100
  11. // 定义在组件内的@Styles封装的样式
  12. @Styles fancy() {
  13. .width(200)
  14. .height(this.heightValue)
  15. .backgroundColor(Color.Yellow)
  16. .onClick(() => {
  17. this.heightValue = 200
  18. })
  19. }
  20. build() {
  21. Column({ space: 10 }) {
  22. // 使用全局的@Styles封装的样式
  23. Text('FancyA')
  24. .globalFancy ()
  25. .fontSize(30)
  26. // 使用组件内的@Styles封装的样式
  27. Text('FancyB')
  28. .fancy()
  29. .fontSize(30)
  30. }
  31. }
  32. }

@Extend装饰器:定义扩展组件样式 

  • 和@Styles不同,@Extend仅支持定义在全局,不支持在组件内部定义。
  • 和@Styles不同,@Extend支持封装指定的组件的私有属性和私有事件和预定义相同组件的@Extend的方法。
  • 和@Styles不同,@Extend装饰的方法支持参数,开发者可以在调用时传递参数,调用遵循TS方法传值调用。

//原代码 

  1. //原代码
  2. @Entry
  3. @Component
  4. struct FancyUse {
  5. @State label: string = 'Hello World'
  6. build() {
  7. Row({ space: 10 }) {
  8. Text(`${this.label}`)
  9. .fontStyle(FontStyle.Italic)
  10. .fontWeight(100)
  11. .backgroundColor(Color.Blue)
  12. Text(`${this.label}`)
  13. .fontStyle(FontStyle.Italic)
  14. .fontWeight(200)
  15. .backgroundColor(Color.Pink)
  16. Text(`${this.label}`)
  17. .fontStyle(FontStyle.Italic)
  18. .fontWeight(300)
  19. .backgroundColor(Color.Orange)
  20. }.margin('20%')
  21. }
  22. }

 //修改后

  1. //全局-可以接收参数
  2. @Extend(Text) function fancyText(weightValue: number, color: Color) {
  3. .fontStyle(FontStyle.Italic)
  4. .fontWeight(weightValue)
  5. .backgroundColor(color)
  6. }
  7. @Entry
  8. @Component
  9. struct FancyUse {
  10. @State label: string = 'Hello World'
  11. build() {
  12. Row({ space: 10 }) {
  13. Text(`${this.label}`)
  14. .fancyText(100, Color.Blue)
  15. Text(`${this.label}`)
  16. .fancyText(200, Color.Pink)
  17. Text(`${this.label}`)
  18. .fancyText(300, Color.Orange)
  19. }.margin('20%')
  20. }
  21. }

stateStyles:多态样式 

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

  • focused:获焦态。
  • normal:正常态。
  • pressed:按压态。
  • disabled:不可用态。
  1. @Entry
  2. @Component
  3. struct StateStylesSample {
  4. build() {
  5. Column() {
  6. Button('Click me')
  7. .stateStyles({
  8. focused: {
  9. .backgroundColor(Color.Pink)
  10. },
  11. pressed: {
  12. .backgroundColor(Color.Black)
  13. },
  14. normal: {
  15. .backgroundColor(Color.Yellow)
  16. }
  17. })
  18. }.margin('30%')
  19. }
  20. }

@Builder装饰器:自定义构建函数

自定义组件内自定义构建函数

  1. 定义的语法:
  2. @Builder MyBuilderFunction(){ ... }
  3. 使用方法:
  4. this.MyBuilderFunction(){ ... }
  5. //下面例子:
  6. @Component
  7. struct TaskList{
  8. build(){
  9. Column(){
  10. Button('添加')
  11. .width(200)
  12. .margin({top:20,bottom:10})
  13. .onClick(()=>{
  14. 使用方法:
  15. this.MyBuilderFunction(){ ... }
  16. })
  17. }
  18. }
  19. 定义方法
  20. @Builder MyBuilderFunction(){ ... }
  21. }
  • 允许在自定义组件内定义一个或多个@Builder方法,该方法被认为是该组件的私有、特殊类型的成员函数。
  • 自定义构建函数可以在所属组件的build方法和其他自定义构建函数中调用,但不允许在组件外调用。
  • 在自定义函数体中,this指代当前所属组件,组件的状态变量可以在自定义构建函数内访问。建议通过this访问自定义组件的状态变量而不是参数传递。

全局自定义构建函数

  1. 定义的语法:
  2. @Builder function MyGlobalBuilderFunction(){ ... }
  3. 使用方法:
  4. MyGlobalBuilderFunction()
  5. //下面例子
  6. @Builder function MyGlobalBuilderFunction() {
  7. //todo
  8. }
  9. @Entry
  10. @Component
  11. struct Demo{
  12. @State label: string = 'Hello';
  13. build() {
  14. Column() {
  15. Button('Click me').onClick(() => {
  16. MyGlobalBuilderFunction()
  17. })
  18. }
  19. }
  20. }
  • 全局的自定义构建函数可以被整个应用获取,不允许使用this和bind方法。
  • 如果不涉及组件状态变化,建议使用全局的自定义构建方法。

@BuilderParam装饰器:引用@Builder函数 

当开发者创建了自定义组件,并想对该组件添加特定功能时,例如在自定义组件中添加一个点击跳转操作。若直接在组件内嵌入事件方法,将会导致所有引入该自定义组件的地方均增加了该功能。为解决此问题,ArkUI引入了@BuilderParam装饰器,@BuilderParam用来装饰指向@Builder方法的变量,开发者可在初始化自定义组件时对此属性进行赋值,为自定义组件增加特定的功能。该装饰器用于声明任意UI描述的一个元素,类似slot占位符。 

  1. @Builder function GlobalBuilder0() {}
  2. @Component
  3. struct Child {
  4. @Builder doNothingBuilder() {};
  5. @BuilderParam aBuilder0: () => void = this.doNothingBuilder;
  6. @BuilderParam aBuilder1: () => void = GlobalBuilder0;
  7. build(){}
  8. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/273626
推荐阅读
相关标签
  

闽ICP备14008679号