首页 > 其他分享 >鸿蒙UI开发快速入门 —— part02: 组件开发

鸿蒙UI开发快速入门 —— part02: 组件开发

时间:2024-12-08 11:14:20浏览次数:10  
标签:自定义 鸿蒙 Text part02 反例 UI build 组件

1. 组件基本介绍

在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行 UI 界面开发时,通常不是简单的将系统组件进行组合使用,而是需要考虑代码可复用性、业务逻辑与UI分离,后续版本演进等因素。因此,将UI和部分业务逻辑封装成自定义组件是不可或缺的能力。

自定义组件具有以下特点:

  • 可组合:允许开发者组合使用系统组件、及其属性和方法。
  • 可重用:自定义组件可以被其他组件重用,并作为不同的实例在不同的父组件或容器中使用。
  • 数据驱动UI更新:通过状态变量的改变,来驱动UI的刷新。

以下示例展示了开发一个组件的基本用法。

@Component
export struct HelloComponent {
  @State message: string = 'Hello, World!';

  build() {
    // HelloComponent自定义组件组合系统组件Row和Text
    Row() {
      Text(this.message)
        .onClick(() => {
          // 状态变量message的改变驱动UI刷新,UI从'Hello, World!'刷新为'Hello, ArkUI!'
          this.message = 'Hello, ArkUI!';
        })
    }
  }
}

HelloComponent可以在其他自定义组件中的build()函数中多次创建,实现自定义组件的重用。

@Entry
@Component
struct ParentComponent {
  build() {
    Column() {
      Text('ArkUI message')
      // 这里复用了组件
      HelloComponent({ message: 'Hello, World!' });
      Divider()
      // 这里再次复用了组件
      HelloComponent({ message: '你好!' });
    }
  }
}

渲染效果如下:

图片

一个自定义的UI组件一般有几个关键组成部分:

  1. struct声明组件名字(如果需要复用,则需要加上export 关键字导出);

  2. @Component 关键字装饰第1步创建的组件,表示当前的结构体是一个自定义组件;

  3. build()函数,该函数用于描述本组件需要渲染的样式;

  4. @State 装饰的本地变量,用于存储当前组件的内部状态;

  5. @Entry 关键字装饰,表示当前组件是UI页面的入口;

2. build()函数

build()函数是所有UI组件开发都需要实现的方法,它主要负责对UI的描述定义,build()函数需要遵循一些规则,如下所述:

  • @Entry 装饰的组件,其build()函数下的根节点唯一且必要,且必须为容器组件。

    @Components装饰的自定义组件,其build()函数下的根节点唯一且必要,可为非容器组件。两者中的ForEach禁止作为根节点。

  • build()函数不允许声明本地变量,下面为反例:

build() { 
    // 反例:不允许声明本地变量  
    let a: number = 1;
}

如果写了反例中的代码,编译期将报错,本地变量反例报错如下(后面的反例不再每个都贴图了):

图片

  • build()函数不允许在UI描述里直接使用console.info(),下面为反例:
build() {  
    // 反例:不允许console.info  
    console.info('print debug log');
}

  • build()函数里不允许创建本地的作用域,下面为反例:
build() {  
    // 反例:不允许本地作用域  
    {    
        ...  
    }
}

  • build函数里不允许调用没有用@Builder装饰的方法,允许系统组件的参数是TS方法的返回值。
@Component
struct ParentComponent {
  doSomeCalculations() {
  }

  calcTextValue(): string {
    return 'Hello World';
  }

  @Builder doSomeRender() {
    Text(`Hello World`)
  }

  build() {
    Column() {
      // 反例:不能调用没有用@Builder装饰的方法
      this.doSomeCalculations();
      // 正例:可以调用
      this.doSomeRender();
      // 正例:参数可以为调用TS方法的返回值
      Text(this.calcTextValue())
    }
  }
}回值      Text(this.calcTextValue())    }  }}

  • build()函数里不允许switch语法,如果需要使用条件判断,请使用if。
build() {
  Column() {
    // 反例:不允许使用switch语法
    switch (expression) {
      case 1:
        Text('...')
        break;
      case 2:
        Image('...')
        break;
      default:
        Text('...')
        break;
    }
  }
}

  • build()函数里不允许使用表达式
build() {
  Column() {
    // 反例:不允许使用表达式
    (this.aVar > 10) ? Text('...') : Image('...')
  }
}

3. 设置基本样式

所有的组件(不论是自定义组件还是系统组件),都可以设置一些通用样式,例如:宽度、高度、背景色、圆角等。设置方法均为 "." 号,示例代码如下:

@Component
struct MyComponent2 {
  build() {
    Button(`Hello World`)
  }
}

@Entry
@Component
struct MyComponent {
  build() {
    Row() {
      MyComponent2()
        .width(200)
        .height(300)
        .backgroundColor(Color.Red)
    }
  }
}


渲染效果如下:

图片

tips: ArkUI给自定义组件设置样式时,相当于给MyComponent2套了一个不可见的容器组件,而这些样式是设置在容器组件上的,而非直接设置给MyComponent2的Button组件。通过渲染结果我们可以很清楚的看到,背景颜色红色并没有直接生效在Button上,而是生效在Button所处的开发者不可见的容器组件上。

标签:自定义,鸿蒙,Text,part02,反例,UI,build,组件
From: https://www.cnblogs.com/harmonyClassRoom/p/18593162

相关文章

  • 鸿蒙UI开发快速入门 —— part03: 组件的生命周期
    1. 什么是组件的生命周期组件的生命周期是我们开发一个组件必须要关注的内容,组件的生命周期,指的是组件的创建、渲染、销毁等过程。因为这个过程就类似于人从出生到离世的过程,从而称为:组件的生命周期。只有了解了组件的生命周期,我们才能开发出一个流畅的用户界面。2. 页面&......
  • AutoConsis:UI内容一致性智能检测14
    可参考美团技术团队1.背景目前,移动App上的业务页面愈发复杂,技术团队常会以页面为单位来拆解团队开发分工,同一类业务元素信息分散在不同团队负责的页面内。在具体的实践中,存在一类不易检出但又影响用户体验的异常:页面中的UI信息相互矛盾(如下图中同一个商品在多个页面上的实际......
  • AutoConsis:UI内容一致性智能检测7
    可参考美团技术团队1.背景目前,移动App上的业务页面愈发复杂,技术团队常会以页面为单位来拆解团队开发分工,同一类业务元素信息分散在不同团队负责的页面内。在具体的实践中,存在一类不易检出但又影响用户体验的异常:页面中的UI信息相互矛盾(如下图中同一个商品在多个页面上的实际......
  • [NSSCTF 2022 Spring Recruit]babyphp
    [NSSCTF2022SpringRecruit]babyphp第一个条件:if(isset($_POST['a'])&&!preg_match('/[0-9]/',$_POST['a'])&&intval($_POST['a']))-需要POST参数'a'不能包含数字(通过正则检查)但是用intval()转换后必须是非零值绕过方法:可以使用十六进制(如......
  • AutoConsis:UI内容一致性智能检测14
    可参考美团技术团队1.背景目前,移动App上的业务页面愈发复杂,技术团队常会以页面为单位来拆解团队开发分工,同一类业务元素信息分散在不同团队负责的页面内。在具体的实践中,存在一类不易检出但又影响用户体验的异常:页面中的UI信息相互矛盾(如下图中同一个商品在多个页面上的实际......
  • AutoConsis:UI内容一致性智能检测6
    可参考美团技术团队1.背景目前,移动App上的业务页面愈发复杂,技术团队常会以页面为单位来拆解团队开发分工,同一类业务元素信息分散在不同团队负责的页面内。在具体的实践中,存在一类不易检出但又影响用户体验的异常:页面中的UI信息相互矛盾(如下图中同一个商品在多个页面上的实际......
  • AutoConsis:UI内容一致性智能检测5
    可参考美团技术团队1.背景目前,移动App上的业务页面愈发复杂,技术团队常会以页面为单位来拆解团队开发分工,同一类业务元素信息分散在不同团队负责的页面内。在具体的实践中,存在一类不易检出但又影响用户体验的异常:页面中的UI信息相互矛盾(如下图中同一个商品在多个页面上的实际......
  • uni-app UI库、框架、组件选型指南 【跨端开发系列】
     ......
  • AutoConsis:UI内容一致性智能检测7
    可参考美团技术团队1.背景目前,移动App上的业务页面愈发复杂,技术团队常会以页面为单位来拆解团队开发分工,同一类业务元素信息分散在不同团队负责的页面内。在具体的实践中,存在一类不易检出但又影响用户体验的异常:页面中的UI信息相互矛盾(如下图中同一个商品在多个页面上的实际......
  • AutoConsis:UI内容一致性智能检测10
    可参考美团技术团队1.背景目前,移动App上的业务页面愈发复杂,技术团队常会以页面为单位来拆解团队开发分工,同一类业务元素信息分散在不同团队负责的页面内。在具体的实践中,存在一类不易检出但又影响用户体验的异常:页面中的UI信息相互矛盾(如下图中同一个商品在多个页面上的实际......