# 声明å¼UIæè¿° ArkTS以声明方å¼ç»„åˆå’Œæ‰©å±•ç»„件æ¥æ述应用程åºçš„UI,åŒæ—¶è¿˜æ供了基本的属性ã€äº‹ä»¶å’Œå组件é…置方法,帮助开å‘者实现应用交互逻辑。 ## 创建组件 æ ¹æ®ç»„ä»¶æž„é€ æ–¹æ³•çš„ä¸åŒï¼Œåˆ›å»ºç»„件包å«æœ‰å‚æ•°å’Œæ— å‚数两ç§æ–¹å¼ã€‚ > **说明:** > > 创建组件时ä¸éœ€è¦newè¿ç®—符。 ### æ— å‚æ•° 如果组件的接å£å®šä¹‰æ²¡æœ‰åŒ…å«å¿…é€‰æž„é€ å‚数,则组件åŽé¢çš„“()â€ä¸éœ€è¦é…置任何内容。例如,Divider组件ä¸åŒ…å«æž„é€ å‚数。 ```ts Column() { Text('item 1') Divider() Text('item 2') } ``` ### 有å‚æ•° 如果组件的接å£å®šä¹‰åŒ…å«æž„é€ å‚数,则在组件åŽé¢çš„“()â€éœ€è¦é…置相应å‚数。 - Image组件的必选å‚æ•°src。 ```ts Image('https://xyz/test.jpg') ``` - Text组件的éžå¿…选å‚æ•°content。 ```ts // string类型的å‚æ•° Text('test') // $rå½¢å¼å¼•å…¥åº”用资æºï¼Œå¯åº”用于多è¯è¨€åœºæ™¯ Text($r('app.string.title_value')) // æ— å‚æ•°å½¢å¼ Text() ``` - å˜é‡æˆ–表达å¼ä¹Ÿå¯ä»¥ç”¨äºŽå‚数赋值,其ä¸è¡¨è¾¾å¼è¿”回的结果类型必须满足å‚数类型è¦æ±‚。 例如,设置å˜é‡æˆ–表达å¼æ¥æž„é€ Imageå’ŒText组件的å‚数。 ```ts Image(this.imagePath) Image('https://' + this.imageUrl) Text(`count: ${this.count}`) ``` ## é…置属性 属性方法以“.â€é“¾å¼è°ƒç”¨çš„æ–¹å¼é…ç½®ç³»ç»Ÿç»„ä»¶çš„æ ·å¼å’Œå…¶ä»–属性,建议æ¯ä¸ªå±žæ€§æ–¹æ³•å•ç‹¬å†™ä¸€è¡Œã€‚ - é…ç½®Text组件的å—体大å°ã€‚ ```ts Text('test') .fontSize(12) ``` - é…置组件的多个属性。 ```ts Image('test.jpg') .alt('error.jpg') .width(100) .height(100) ``` - é™¤äº†ç›´æŽ¥ä¼ é€’å¸¸é‡å‚数外,还å¯ä»¥ä¼ 递å˜é‡æˆ–表达å¼ã€‚ ```ts Text('hello') .fontSize(this.size) Image('test.jpg') .width(this.count % 2 === 0 ? 100 : 200) .height(this.offset + 100) ``` - 对于系统组件,ArkUI还为其属性预定义了一些枚举类型供开å‘者调用,枚举类型å¯ä»¥ä½œä¸ºå‚æ•°ä¼ é€’ï¼Œä½†å¿…é¡»æ»¡è¶³å‚数类型è¦æ±‚。 例如,å¯ä»¥æŒ‰ä»¥ä¸‹æ–¹å¼é…ç½®Text组件的颜色和å—ä½“æ ·å¼ã€‚ ```ts Text('hello') .fontSize(20) .fontColor(Color.Red) .fontWeight(FontWeight.Bold) ``` ## é…置事件 事件方法以“.â€é“¾å¼è°ƒç”¨çš„æ–¹å¼é…置系统组件支æŒçš„事件,建议æ¯ä¸ªäº‹ä»¶æ–¹æ³•å•ç‹¬å†™ä¸€è¡Œã€‚ - 使用ç®å¤´å‡½æ•°é…置组件的事件方法。 ```ts Button('Click me') .onClick(() => { this.myText = 'ArkUI'; }) ``` - 使用ç®å¤´å‡½æ•°è¡¨è¾¾å¼é…置组件的事件方法,è¦æ±‚使用“() => {...}â€ï¼Œä»¥ç¡®ä¿å‡½æ•°ä¸Žç»„件绑定,åŒæ—¶ç¬¦åˆArkTSè¯æ³•è§„范。 ```ts Button('add counter') .onClick(() => { this.counter += 2; }) ``` - 使用组件的æˆå‘˜å‡½æ•°é…置组件的事件方法,需è¦bind this。ArkTSè¯æ³•ä¸æŽ¨è使用æˆå‘˜å‡½æ•°é…åˆbind this去é…置组件的事件方法。 ```ts myClickHandler(): void { this.counter += 2; } ... Button('add counter') .onClick(this.myClickHandler.bind(this)) ``` - 使用声明的ç®å¤´å‡½æ•°ï¼Œå¯ä»¥ç›´æŽ¥è°ƒç”¨ï¼Œä¸éœ€è¦bind this。 ```ts fn = () => { console.info(`counter: ${this.counter}`) this.counter++ } ... Button('add counter') .onClick(this.fn) ``` > **说明:** > > ç®å¤´å‡½æ•°å†…部的this是è¯æ³•ä½œç”¨åŸŸï¼Œç”±ä¸Šä¸‹æ–‡ç¡®å®šã€‚匿å函数å¯èƒ½ä¼šæœ‰this指å‘ä¸æ˜Žç¡®é—®é¢˜ï¼Œåœ¨ArkTSä¸ä¸å…许使用。 ## é…ç½®å组件 如果组件支æŒå组件é…置,则需在尾éšé—包"{...}"ä¸ä¸ºç»„ä»¶æ·»åŠ å组件的UIæ述。Columnã€Rowã€Stackã€Gridã€Listç‰ç»„件都是容器组件。 - 以下是简å•çš„Column组件é…ç½®å组件的示例。 ```ts Column() { Text('Hello') .fontSize(100) Divider() Text(this.myText) .fontSize(100) .fontColor(Color.Red) } ``` - 容器组件å‡æ”¯æŒå组件é…置,å¯ä»¥å®žçŽ°ç›¸å¯¹å¤æ‚的多级嵌套。 ```ts Column() { Row() { Image('test1.jpg') .width(100) .height(100) Button('click +1') .onClick(() => { console.info('+1 clicked!'); }) } } ```