赞
踩
1.安装DevEco Studio
HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者
2.工具使用指南及如何构建应用
DevEco Studio使用指南-工具-HarmonyOS应用开发
构建第一个ArkTS应用(Stage模型)-快速入门-入门-HarmonyOS应用开发
ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。
如果组件的接口定义没有包含必选构造参数,则组件后面的“()”不需要配置任何内容。例如,Divider组件不包含构造参数:
- Column() {
- Text('item 1')
- Divider()
- Text('item 2')
- }
如果组件的接口定义包含构造参数,则在组件后面的“()”配置相应参数。
Image('https://xyz/test.jpg')
自定义组件具有以下特点:
自定义组件的基本结构
说明:自定义组件名、类名、函数名不能和系统组件(如:Text,Image)名相同。
- @Component
- struct MyComponent {
- build() {
- }
- }
- @Entry
- @Component
- struct MyComponent {
- build() {
- }
- }
自定义组件的基本用法
- @Component
- 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!';
- })
- }
- }
- }
说明:如果在另外的文件中引用该自定义组件,需要使用export关键字导出,并在使用的页面import该自定义组件。
- @Component
- //导出
- export default struct HelloComponent {
- ...
- build() {
- ...
- }
- }
-
- //导入
- import HelloComponent from '文件路径'
HelloComponent可以在其他自定义组件中的build()函数中多次创建,实现自定义组件的重用。
- @Entry
- @Component
- struct ParentComponent {
- build() {
- Column() {
- Text('ArkUI message')
- HelloComponent({ message: 'Hello, World!' });
- Divider()
- HelloComponent({ message: '你好!' });
- }
- }
- }
用于抽取部分公共代码封装为自定义构建函数:如下封装一个删除按钮
PS:要是@Builder装饰器在组件内不需要加 function 修饰
- //组件外部
- @Builder function DeleteButton (index){...}
- //使用方法:
- DeleteButton(index)
-
- //组件内部
- @Builder DeleteButton (index){...}
- //使用方法:
- this.DeleteButton(index)
- @Builder DeleteButton (index){
- Button(){
- Image($r('app.media.ic_public_delete_filled'))
- .fillColor(Color.White)
- .width(20)
- .height(20)
- }
- .width(40)
- .height(40)
- .backgroundColor(Color.Red)
- .margin({right:10})
- .onClick(()=>{
- // 1.删除任务
- this.tasks.splice(index,1)
- // 2.更新任务总数
- this.handlerTotal()
- })
- }
封装公共样式:如下封装卡片样式
- // 反例: @Styles不支持参数
- @Styles function globalFancy (value: number) {
- .width(value)
- }
- // 全局
- @Styles function functionName() { ... }
-
- // 在组件内
- @Component
- struct FancyUse {
- @Styles fancy() {
- .height(100)
- }
- }
- @Component
- struct FancyUse {
- @State heightValue: number = 100
- @Styles fancy() {
- .height(this.heightValue)
- .backgroundColor(Color.Yellow)
- .onClick(() => {
- this.heightValue = 200
- })
- }
- }
框架优先找当前组件内的@Styles,如果找不到,则会全局查找。
- // 定义在全局的@Styles封装的样式
- @Styles function globalFancy () {
- .width(150)
- .height(100)
- .backgroundColor(Color.Pink)
- }
-
- @Entry
- @Component
- struct FancyUse {
- @State heightValue: number = 100
- // 定义在组件内的@Styles封装的样式
- @Styles fancy() {
- .width(200)
- .height(this.heightValue)
- .backgroundColor(Color.Yellow)
- .onClick(() => {
- this.heightValue = 200
- })
- }
-
- build() {
- Column({ space: 10 }) {
- // 使用全局的@Styles封装的样式
- Text('FancyA')
- .globalFancy ()
- .fontSize(30)
- // 使用组件内的@Styles封装的样式
- Text('FancyB')
- .fancy()
- .fontSize(30)
- }
- }
- }
如下是Text组件的私有属性的公共样式
- @Extend(Text) function finishedTask(){
- .decoration({type:TextDecorationType.LineThrough})
- .fontColor('#B1B2B1')
- .fontSize(18)
- }
-
- //预定义的finishedTask 也可以当做传参
- @Extend(Text) function finishedTask(size:number){
- .decoration({type:TextDecorationType.LineThrough})
- .fontColor('#B1B2B1')
- .fontSize(size)
- }
-
- @Entry
- @Component
- struct Task{
- build() {
- Row({ space: 10 }) {
- Text('Task')
- .finishedTask(16)
- Text('Task')
- .finishedTask(24)
- }
- }
- }
stateStyles是属性方法,可以根据UI内部状态来设置样式,类似于css伪类,但语法不同。ArkUI提供以下四种状态:
- Button('Button1')
- .stateStyles({
- focused: {
- .backgroundColor(Color.Pink)
- },
- pressed: {
- .backgroundColor(Color.Black)
- },
- normal: {
- .backgroundColor(Color.Red)
- }
- })
- .margin(20)
按引用传递参数时,传递的参数可为状态变量,且状态变量的改变会引起@Builder方法内的UI刷新。ArkUI提供$$作为按引用传递参数的范式。
ABuilder( $$ : { paramA1: string, paramB1 : string } );
- @Builder function ABuilder($$: { paramA1: string }) {
- Row() {
- Text(`UseStateVarByReference: ${$$.paramA1} `)
- }
- }
- @Entry
- @Component
- struct Parent {
- @State label: string = 'Hello';
- build() {
- Column() {
- // 在Parent组件中调用ABuilder的时候,将this.label引用传递给ABuilder
- ABuilder({ paramA1: this.label })
- Button('Click me').onClick(() => {
- // 点击“Click me”后,UI从“Hello”刷新为“ArkUI”
- this.label = 'ArkUI';
- })
- }
- }
- }
调用@Builder装饰的函数默认按值传递。当传递的参数为状态变量时,状态变量的改变不会引起@Builder方法内的UI刷新。所以当使用状态变量的时候按引用传递。
- @Builder function ABuilder(paramA1: string) {
- Row() {
- Text(`UseStateVarByValue: ${paramA1} `)
- }
- }
- @Entry
- @Component
- struct Parent {
- @State label: string = 'Hello';
- build() {
- Column() {
- ABuilder(this.label)
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。