当前位置:   article > 正文

HarmonyOS应用开发-ArkTS语言的@Styles与@Extend_harmony arkts 从外部文件导入@styles

harmony arkts 从外部文件导入@styles

前言

本次内容就是 Style 和 Extend 的介绍和玩法以及场景,然后后面用一个水果面板案例来巩固一下.很简单,但是内容多慢慢消化!!

style 用于将重复的样式给他提出来形成公共的样式,

extend 用于将原生也就是系统的组件样式扩展

Styles 装饰器

@Styles装饰器可以将多条样式设置提炼成一个方法,直接在组件声明的位置调用。通过@Styles装饰器可以快速定义并复用自定义样式。用于快速定义并复用自定义样式

⚠️ : 该装饰器支持在ArkTS卡片中使用

Styles 支持在组件当中定义或者全局定义,全局定义的时候需要 function 关键字 ,组件内定义时则不需要添加function关键字。

语法: Styles xxxx () {....}

  1. @Entry
  2. @Component
  3. struct StyleStudy {
  4. @State message: string = 'Hello World'
  5. // 组件内
  6. @Styles style_1() {
  7. .width(120)
  8. .height(120)
  9. .backgroundColor("red")
  10. }
  11. build() {
  12. Row() {
  13. Column() {
  14. Text("halo")
  15. .style_1().fontSize(50)
  16. }
  17. .width('100%')
  18. }
  19. .height('100%')
  20. }
  21. }

img

  • 全局样式,和组内一样的用

img

  • @Styles方法不支持参数
  1. @Styles function globalFancy (value: number) {
  2. .width(value)
  3. }

img

  • 组件内的@Styles可以通过this访问组件的常量和状态变量,并可以在@Styles里通过事件来改变状态变量的值

img

  • 组件内@Styles的优先级高于全局@Styles,框架优先找当前组件内的@Styles,如果找不到,则会全局查找, 可以看到我们取一个一样的名称的样式表默认找最近的

img

使用代码 demo

演示了组内的样式和全局的样式使用方法

  1. // @Styles不支持参数
  2. // @Styles function globalFancy(value: number) {
  3. // .width(value)
  4. // }
  5. // 定义在全局的@Styles封装的样式
  6. @Styles function globalFancy () {
  7. .width(150)
  8. .height(100)
  9. .backgroundColor(Color.Pink)
  10. }
  11. @Entry
  12. @Component
  13. struct StyleStudy {
  14. @State message: string = 'Hello World'
  15. // 组件内
  16. @Styles style_1() {
  17. .height(120)
  18. .backgroundColor("red")
  19. }
  20. build() {
  21. Row() {
  22. Column() {
  23. Text("halo我是父组件")
  24. .style_1().fontSize(30)
  25. // 看看 组件内的@Styles可以通过this访问组件的常量和状态变量,
  26. // 并可以在@Styles里通过事件来改变状态变量的值
  27. FancyUse()
  28. }
  29. .width('100%')
  30. }
  31. .height('100%')
  32. }
  33. }
  34. @Component
  35. struct FancyUse {
  36. @State heightValue: number = 100
  37. @Styles fancy() {
  38. // 传递动态参数
  39. .height(this.heightValue)
  40. .backgroundColor(Color.Yellow)
  41. .onClick(() => {
  42. this.heightValue = 200
  43. })
  44. }
  45. build() {
  46. Column({ space: 10 }) {
  47. // 使用全局的@Styles封装的样式
  48. Text('儿子-1')
  49. .globalFancy ()
  50. .fontSize(30)
  51. // 使用组件内的@Styles封装的样式
  52. Text('儿子-2')
  53. .fancy()
  54. .fontSize(30)
  55. }
  56. }
  57. }

Extend 装饰器

上面我们是可以把样式整合到一个函数当中,Extend 的作用就是在原有的组件上面继续添加

语法:

@Extend(组件的名称) function functionName { ... } 

使用规则
  • @Extend只支持定义在全局,不能在局部玩,直接无法识别报错

img

  • @Extend支持封装指定的组件的私有属性和私有事件和预定义相同组件的@Extend的方法
  • 可以继续在扩展的外面追加样式
  • 可以在调用时传递参数,调用遵循TS方法传值调用

img

  • @Extend装饰的方法的参数可以为function,作为Event事件的句柄
  • 只能说有点像 Java 里面的 Super

语法:

  1. @Extend(组件) function 名称(onClick: () => void) {
  2. .onClick(onClick)
  3. }

img

  1. // Event事件
  2. @Extend(Text) function makeMeClickEs2(onClick: () => void) {
  3. .backgroundColor(Color.Pink)
  4. .onClick(onClick)
  5. }
  6. @Entry
  7. @Component
  8. struct FancyUseEs2 {
  9. @State label: string = 'Hello World';
  10. // 执行操作
  11. onClickHandler() {
  12. this.label = 'Hello ArkUI';
  13. console.log("我被点击触发了");
  14. }
  15. build() {
  16. Row({ space: 10 }) {
  17. // 动态参数
  18. Text(`${this.label}`).fontSize(35)
  19. // 绑定事件
  20. .makeMeClickEs2(this.onClickHandler.bind(this))
  21. }.height("100%").width(100)
  22. }
  23. }

上面代码作用就是在FancyUseEs2 组件当中绑定了makeMeClickEs2 的事件并且传递了 this 指针,makeMeClickEs2 事件里面直接进行了触发修改了文字信息.

  • @Extend的参数可以为状态变量(相当于 vue 里面的双向绑定),当状态变量改变时,UI可以正常的被刷新渲染,但是好像不能在扩展里面更改这个值.

img

案例

我们利用前面学到的东西搞个小案例需求如下

一个头部标题

下面就是一个列表,列表里面可以显示任何东西,要把重复的样式提取出来放在 styles 当中

img

首先我们声明一个类用来表示为水果,里面有 id、名称、序号

  1. // 水果类
  2. class Fruit {
  3. static id: number = 1
  4. // 名称
  5. name: string = ""
  6. // 水果的序号
  7. no: string = `${Fruit.id++}`
  8. // 利用构造器让外面传递
  9. constructor(name: string) {
  10. this.name = name
  11. }
  12. }

在入口组件当中定义集合存储里面定义了一行标题,

  1. @Entry
  2. @Component
  3. struct Demo {
  4. build() {
  5. // 内部严元素间距 10
  6. Column({ space: 10 }) {
  7. Row() {
  8. Text('水果专柜
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/320012?site
    推荐阅读
    相关标签