1# ArkUI组件(ArkTS)开发常见问题 2 3## 在Stage模型下,如何通过router实现页面跳转 4 5适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 6 71. 对于通过页面路由router实现页面跳转,首先要在main_pages.json配置文件中将所有跳转的页面加入pages列表; 8 92. 页面路由需要在页面渲染完成之后才能调用,在onInit和onReady生命周期中页面还处于渲染阶段,禁止调用页面路由方法。 10 11参考文档:[页面路由](../reference/apis/js-apis-router.md) 12 13## router通过调用push方法进堆栈的page是否会被回收 14 15适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 16 17调用push进入堆栈的page不回收,调用back方法出栈后可以被回收。 18 19## 如何将容器定位到屏幕的最底部? 20 21适用于:OpenHarmony SDK 3.2.3.5版本, API9 Stage模型 22 23可以使用Stack堆叠容器,设置子组件在容器内的最底部。 24 25 示例: 26 27``` 28build() { 29 Stack({alignContent : Alignment.Bottom}) { 30 //容器位于最底部 31 Stack() { 32 Column() 33 .width('100%') 34 .height('100%') 35 .backgroundColor(Color.Yellow) 36 } 37 .width('100%') 38 .height('10%') 39 } 40 .width('100%') 41 .height('100%') 42 .backgroundColor('rgba(255,255,255, 0)') 43} 44``` 45 46## CustomDialog是否支持在TS文件中使用 47 48适用于:OpenHarmony SDK 3.2.2.5版本,API9 Stage模型 49 50不支持,CustomDialog当前只支持在ArkTS的Page中使用。 51 52参考文档:[自定义弹窗](../reference/arkui-ts/ts-methods-custom-dialog-box.md) 53 54## 如何将CustomDialog中的变量传递给Page页面中的变量 55 56适用于:OpenHarmony SDK 3.2.2.5版本,API9 Stage模型 57 58利用自定义的回调函数,当点击弹窗的confirm按钮时,将data数据从自定义弹窗组件中传递给当前的page的页面。 59 60示例: 61 62 63``` 64// 弹窗组件 65@CustomDialog 66struct MyDialog { 67 controller: CustomDialogController 68 title: string 69 confirm: (data: string) => void 70 data: string = '' 71 72 build() { 73 Row() { 74 Column({ space: 10 }) { 75 Text(this.title) 76 .fontSize(30) 77 .fontColor(Color.Blue) 78 TextInput({ placeholder: "输入内容", text: this.data }) 79 .onChange((data) => { 80 this.data = data // 获取输入框数据 81 }) 82 Button('confirm') 83 .onClick(() => { 84 this.confirm(this.data) // 将输入框数据通过回调函数传给主页面 85 this.controller.close() 86 }).backgroundColor(0xffffff).fontColor(Color.Red) 87 }.width("50%") 88 }.height("50%") 89 } 90} 91 92// main页面 93@Entry 94@Component 95struct DialogTest { 96 @State dialogTitle: string = '' 97 @State dialogData: string = '' 98 dialogController: CustomDialogController = new CustomDialogController({ 99 builder: MyDialog({ 100 title: this.dialogTitle, // 绑定数据 101 data: this.dialogData, 102 confirm: this.confirm.bind(this) // 绑定自定义的回调函数,这里要修改this的指向 103 }) 104 }) 105 106 confirm(data: string) { 107 this.dialogData = data 108 console.info(`recv dialog data: ${data}`) // 获取弹窗输入的信息 109 } 110 111 build() { 112 Row() { 113 Column({ space: 10 }) { 114 Button('点击打开弹窗') 115 .onClick(() => { 116 this.dialogTitle = '弹窗' 117 this.dialogController.open() 118 }) 119 Text(`接受弹窗的数据:`) 120 .fontSize(20) 121 TextInput({ placeholder: "输入内容", text: this.dialogData }) 122 .width("50%") 123 .onChange((data) => { 124 this.dialogData = data // 获取输入框数据 125 }) 126 }.width("100%") 127 }.height("100%") 128 } 129} 130``` 131 132## List组件上添加了Text组件后,List组件无法拖动到底部 133 134适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 135 136在List的父容器加上代码layoutWeight(1)。原理:List属于可滚动容器组件,默认高度是占满全屏幕高度,当出现其他固定高度的组件占领了屏幕的部分高度时,需要开发人员显性的指定List组件占满剩余高度,而不是全屏幕高度。 137 138## 栅格布局子组件如何居中? 139 140适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 141 142GridContainer内子组件默认水平左对齐,居中显示可以参考以下处理方式: 143 144内部嵌套布局组件Row,设置Row属性justifyContent(FlexAlign.Center),内部嵌套子组件可保持居中显示,参考[栅格布局](../reference/arkui-ts/ts-container-gridcontainer.md)文档。 145 146 示例: 147 148``` 149GridContainer({ sizeType: SizeType.SM, columns: 12 }) { 150 Row() { 151 Text('1') 152 .useSizeType({ 153 sm: { span: 4, offset: 0 }, 154 }) 155 .backgroundColor(0x46F2B4) 156 }.justifyContent(FlexAlign.Center) // 该属性设置使子组件居中显示 157} 158``` 159 160## 如何获取状态栏和导航栏高度? 161 162适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 163 164在加载窗口内容之前,采用systemAvoidAreaChange事件监听。 165 166 示例: 167 168``` 169// MainAbility.ts 170import window from '@ohos.window'; 171 172/** 173 * 设置沉浸式窗口,并获取状态栏和导航栏高度 174 * @param mainWindow 主窗口对象 175 */ 176async function enterImmersion(mainWindow: window.Window) { 177 mainWindow.on("systemAvoidAreaChange", (area: window.AvoidArea) => { 178 AppStorage.SetOrCreate<number>("topHeight", area.topRect.height); 179 AppStorage.SetOrCreate<number>("bottomHeight", area.bottomRect.height); 180 }) 181 await mainWindow.setFullScreen(true) 182 await mainWindow.setSystemBarEnable(["status", "navigation"]) 183 await mainWindow.sArkTSystemBarProperties({ 184 navigationBarColor: "#00000000", 185 statusBarColor: "#00000000", 186 navigationBarContentColor: "#FF0000", 187 statusBarContentColor: "#FF0000" 188 }) 189} 190export default class MainAbility extends Ability { 191 // do something 192 async onWindowStageCreate(windowStage: window.WindowStage) { 193 let mainWindow = await windowStage.getMainWindow() 194 await enterImmersion(mainWindow) 195 windowStage.loadContent('pages/index') 196 } 197 // do something 198} 199``` 200 201## 在容器组件嵌套的场景下,如何解决手势拖拽事件出现错乱的问题 202 203适用于:OpenHarmony SDK 3.2.5.3版本,API9 Stage模型 204 205gesture的属性distance默认值是5,把gesture的属性distance设成1就可以解决。 206 207## 如何获取组件的高度 208 209适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型 210 211组件宽高变化可通过onAreaChange组件区域变化事件获取。 212 213示例: 214 215 216``` 217Column() { 218 Text(this.value) 219 .backgroundColor(Color.Green).margin(30).fontSize(20) 220 .onClick(() => { 221 this.value = this.value + 'Text' 222 }) 223 .onAreaChange((oldValue: Area, newValue: Area) => { 224 console.info(`Ace: on area change, oldValue is ${JSON.stringify(oldValue)} value is ${JSON.stringify(newValue)}`) 225 this.size = JSON.stringify(newValue) 226 }) 227``` 228 229## 如何获取List组件的偏移量 230 231适用于:OpenHarmony SDK 3.2.3.5版本,API9 Stage模型 232 233List组件绑定Scoller控制器,通过currentOffset方式获取当前的滚动偏移量。 234 235示例: 236 237 238``` 239Column() { 240 List({ space: 20, initialIndex: 0,scroller: this.scroller}) { 241 ForEach(this.arr, (item) => { 242 ListItem() { 243 Text('' + item) 244 .width('100%').height(100).fontSize(16) 245 .textAlign(TextAlign.Center).borderRadius(10).backgroundColor(0xFFFFFF) 246 }.editable(true) 247 }, item => item) 248 } 249 .listDirection(Axis.Vertical) // 排列方向 250 .editMode(this.editFlag) 251 .onScroll((xOffset: number, yOffset: number) => { 252 console.info("yOffset======="+this.scroller.currentOffset().yOffset) 253 }) 254}.width('100%') 255``` 256 257## 页面使用router携带param跳转后,下一个页面如何获取param 258 259适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 260 261 262``` 263// 3.1.5.5版本之前,取值方式为:router.getParams().key 264private value: string = router.getParams().value; 265// 从3.1.6.5版本起,取值方式为:router.getParams()['key'] 266private value: string = router.getParams()['value']; 267``` 268 269## RichText组件是否支持跳转到本地page页面 270 271适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 272 273不支持。 274 275## 使用router或Navigator实现页面跳转时,如何关闭页面间转场动效 276 277适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 278 2791. 参考[页面间转场示例](../reference/arkui-ts/ts-page-transition-animation.md#示例)在当前页面和目标页面中定义pageTransition方法。 280 2812. 将页面入场组件PageTransitionEnter和页面退场组件PageTransitionExit的动效参数duration都设置为0。 282 283## UI开发中,像素单位如何选择 284 285适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 286 287Vp保证了不同分辨率下 视觉效果的等价性,比如一个图标,在不同分辨率下都是视觉效果是等价。 288 289lpx相当于百分比视图,按比例扩大或者缩小。 290 291如果关注Item等效性的,比如按钮、文字、列表基本上都是VP;比如关注布局,比如1/2之类的网格,lpx更好。 292 293## ArkTS中颜色的格式说明 294 295适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 296 297颜色可以使用两种格式,例如 0x7F000000 或者 '\#7F000000' ,其中前两位是透明度,后六位是RGB。 298 299 300``` 301fontColor(0x7F000000) 302fontColor( '#7F000000' ) 303``` 304 305## 如何在Page页面中监听返回操作 306 307适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 308 309在Page页面返回时,系统会调用\@Entry修饰的自定义组件的onBackPress()回调,可以在回调函数中实现相关业务诉求。参考[自定义组件生命周期回调函数](../ui/ui-ts-custom-component-lifecycle-callbacks.md) 310 311## TextInput组件密码模式下,右边的眼睛图标是否支持自定义? 312 313适用于:OpenHarmony SDK3.0, API9 Stage模型 314 315TextInput组件设置type为InputType.Password时,右侧出现眼睛图标,showPasswordIcon控制图标显示隐藏,不支持自定义。更多信息可参考文档:[TextInput组件](../reference/arkui-ts/ts-basic-components-textinput.md) 316 317## Image图片加载目前只能加载https的,不能加载http的 318 319适用于:OpenHarmony SDK3.2.5.5, API9 Stage模型 320 321http是不安全的,会被白名单过滤掉,建议使用https。 322 323## TextView布局设置间距与显示界面不符合 324 325适用于:OpenHarmony SDK3.2.5.5, API9 Stage模型 326 327TextView默认设置align属性为居中,文本从左到右显示,需要设置align属性为Start。 328 329## constraintSize尺寸设置不生效 330 331适用于:OpenHarmony SDK3.0, API9 Stage模型 332 333constraintSize约束组件尺寸时,子组件内设置百分比宽度,例如width('100%')会采用constraintSize约束中的最大宽乘百分比,导致撑开组件,看起来constraintSize设置没生效 334 335## 如何将背景颜色设置为透明 336 337适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 338 339将backgroundColor设置为 '\#00000000' 。 340 341## Scroll组件滚动到达不了最底部 342 343适用于:OpenHarmony SDK3.0, API9 Stage模型 344 345Scroll组件在未设置高度情况下,默认为窗口高度,当滚动区域外存在其他组件时,滚动底部区域会出现遮挡,需要设置Scroll高度,或者使用Flex布局限制Scroll高度 346 347## 输入框组件TextInput回车事件onSubmit使用 348 349适用于:OpenHarmony SDK3.0, API9 Stage模型 350 351onSubmit事件在回车键或软键盘回车触发该回调,参数为当前软键盘回车键类型,通过enterKeyType属性可以设置输入法回车键类型,软键盘回车键样式需要输入法的支持,具体文档参考[Textinput组件](../reference/arkui-ts/ts-basic-components-textinput.md) 352 353## 页面路由时,页面栈内的数量限制是多少 354 355适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 356 357页面路由栈支持的最大页面数量是32,当超出此限制时,使用router.push接口页面无法完成跳转 。 358 359## ArkUI是否支持通过代码动态创建组件 360 361适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 362 363支持使用[条件渲染](../quick-start/arkts-rendering-control.md#条件渲染)和[循环渲染](../quick-start/arkts-rendering-control.md#循环渲染)等方式进行动态创建组件。 364 365## 页面路由携带PixelMap对象参数,跳转页面无法获取 366 367适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 368 369页面路由只支持普通对象类型,普通JSON数据结构,可以采用localStorage存储PixelMap对象,在跳转页面获取 370 371## TextInput组件在onEditChange激活的时候通过.caretPosition(0)让光标回到起点 372 373适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 374 375onEditChange事件在输入框聚焦时触发,这时光标位置和手势触发位置有关,在使用caretPosition同步处理无法改变光标位置,需要使用异步处理,在setTimeout中执行可以进行 376 377## TextInput是否有方法设置内容为全部选中 378 379适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 380 381TextInput组件暂不支持设置内容全选。 382 383## input的输入框的type属性是date,但无法选择时间 384 385适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 386 387input 组件的 type 设置为 date,只是会有相关格式提示,本质上还是输入控件,如果需要实现日期选择效果,需要使用 picker 组件。 388 389## ArkTS TextInput输入时,弹出的输入法框把页面布局挤压变形 390 391适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 392 393用Flex布局就会有挤压变形情况,改成Column布局就不会产生挤压 394 395## 子组件使用\@Link修饰成员变量时,父组件传值如何传值 396 397适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 398 399子组件使用\@Link修饰时,父组件传值需要添加"$" 400 401示例: 402 403 404``` 405@Component 406struct FoodImageDisplay { 407 @Link imageSrc: Resource 408 409 build() { 410 Stack({ alignContent: Alignment.BottomStart }) { 411 Image(this.imageSrc) 412 .objectFit(ImageFit.Contain) 413 Text('Tomato') 414 .fontSize(26) 415 .fontWeight(500) 416 .margin({ left: 26, bottom: 17.4 }) 417 } 418 .backgroundColor('#FFedf2f5') 419 .height(357) 420 } 421} 422 423@Entry 424@Component 425struct FoodDetail { 426 427 @State imageSrc: Resource = $r('app.media.Tomato') 428 429 build() { 430 Column() { 431 FoodImageDisplay({imageSrc:$imageSrc}) 432 } 433 .alignItems(HorizontalAlign.Center) 434 } 435} 436``` 437 438## 如何多个pageAbility之间共享变量 439 440适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 441 4421. 可以使用轻量级数据库 443 4442. 可以使用持久化数据管理 445 4463. 可以使用emitter事件通信 447 448 449## 如何自定义Video组件控制栏样式 450 451适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 452 4531. 通过设置属性controls为false关闭默认控制栏 454 4552. 设置Video组件的controller 456 4573. 通过ArkTS实现自定义的控制栏,并通过VideoController控制视频播放 458 459## 对ArkTS组件多次更新时如何优化性能 460 461适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 462 463通过将需要更新的ArkTS组件抽离成自定义组件,并更新该自定义组件内\@State绑定的变量,以此实现组件的局部刷新。 464 465## 如何优化Tab组件性能 466 467适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 468 469Tab组件处于某一页签时。其他页签并不会被系统卸载,所以会占用部分内存。可以通过if渲染控制判断当前页签是否是需要显示的页签,若不是则不加载,以此来实现卸载其他不显示的页签并释放这部分内存。 470 471## 如何设置组件不同状态下的样式 472 473适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 474 475通过设置组件的多态样式,实现组件不同状态(无状态、按下、禁用、聚焦、点击)的样式 476 477参考文档:[多态样式](../reference/arkui-ts/ts-universal-attributes-polymorphic-style.md) 478 479## 焦点事件onBlur/onFocus回调无法触发 480 481适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 482 483焦点事件默认情况下需要外接键盘的Tab键,或方向键触发,点击触发焦点事件需要添加焦点控制属性focusOnTouch 484 485参考文档:[焦点控制](../reference/arkui-ts/ts-universal-attributes-focus.md) 486 487## Scroll内Flex加宽高与滑动冲突 488 489适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 490 491Scroll支持单个子组件,子组件高度应由内容高度决定,当内容中存在异步加载的图片组件导致滚动布局异常时,可约束子组件最小高度constraintSize({ minHeight: '100%' }) 492 493## 页面路由跳转后如何阻止其返回原页面 494 495适用于:OpenHarmony SDK 3.2.5.5版本,API9 Stage模型 496 497通过router.clear()接口清空页面栈中的所有历史页面,保留当前页面作为栈顶页面。 498 499参考文档:[页面路由](../reference/apis/js-apis-router.md) 500 501## 如何实现将TextInput组件内容进行一次性清空 502 503适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 504 505可以参考如下实现: 506 507 508``` 509struct Index { 510@State text: string = 'Hello World' 511controller: TextInputController = new TextInputController() 512 build() { 513 Row() { 514 Column() { 515 TextInput({ placeholder: 'Please input your words.', text: this.text, 516 controller:this.controller}).onChange((value) => { 517 this.text = value 518 }) 519 Button("Clear TextInput").onClick(() => { 520 this.text = ""; 521 }) 522 } 523 .width('100%') 524 } 525 .height('100%') 526 } 527} 528``` 529 530## Tabs组件在点击Tab项时是否支持禁止切换 531 532适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 533 534不支持。 535 536## 使用 \@state修饰成员变量“id”会报错,报错原因:TypeError: cannot read property 'get' of undefined 537 538适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 539 540id添加为唯一值,成为关键字。 541 542## 基于OpenHarmony开发的应用,是否支持使用fontFamily属性设置不同的字体 543 544适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 545 546基于OpenHarmony开发的应用,默认字体'HarmonyOS Sans',且当前只支持这种字体。 547 548## Ability与UI页面推荐的数据交互方式是什么 549 550适用于:OpenHarmony SDK 3.2.7.5版本,API9 Stage模型 551 552推荐使用[LocalStorage](../quick-start/arkts-state-mgmt-application-level.md#localstorage)。 553 554## 父组件如何与其孙子组件进行状态同步 555 556适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 557 558- 方式一(推荐):使用\@Provide和\@Consume装饰器。在父组件使用\@Provide,在孙子组件使用\@Consume,可以实现父组件和孙子组件进行双向数据绑定。 559 560- 方式二:使用\@State和\@Link装饰器。在父组件使用\@State,在每一层子组件(子组件和孙子组件)都使用\@Link。 561 562## 字符超长中间显示省略号 563 564适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 565 566代码示例 567 568 569``` 570beautySub(str,len) { 571 var reg = /[\u4e00-\u9fa5]/g; 572 //减少字符,达到优化 573 var slice = str.substring(0,len) 574 var charNum = (~~(slice.match(reg) && slice.match(reg).length)) 575 //减1是为了处理万一超过字符串,不显示多一个不是汉字的字符, 576 var realen = slice.length*2 - charNum-1 577 return str.substr(0,realen) + (realen < str.length ? "..." : "") +str.substr(str.length-realen,str.length) 578} 579``` 580 581## richText 组件怎么加上滚动条 582 583适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 584 585RichText底层是web,可以参考html的语法,在div上加上的overflow:auto的滚动样式。 586 587## scroll里面套一个grid,怎么禁用grid的滑动事件? 588 589适用于:OpenHarmony SDK 3.2.6.5版本,API9 Stage模型 590 591可以通过onScrollBegin事件和scrollBy方法实现容器嵌套滚动。 592 593参考:[容器嵌套滚动样例](../reference/arkui-ts/ts-container-scroll.md#示例2) 594 595## 能否去除自定义弹窗组件的白色背景 596 597适用于:OpenHarmony SDK 3.2.7.5版本,API9 Stage模型 598 599当前不支持。原因是当前的UI样式在框架后端写死了,无法更改。 600 601## 组件背景图片设置backgroundImage方法是否支持svg图片格式 602 603适用于:OpenHarmony SDK 3.2.7.5版本,API9 Stage模型 604 605当前不支持。 606 607## 自定义弹窗组件如何设置弹窗位置 608 609适用于:OpenHarmony SDK 3.2.7.5版本,API9 Stage模型 610 611自定义弹窗组件中参数alignment可以指定弹窗的位置。比如设置弹窗在底部:alignment : DialogAlignment.Bottom。 612 613参考文档:[自定义弹窗](../reference/arkui-ts/ts-methods-custom-dialog-box.md) 614 615## scroller如何判断回弹动画的结束误差 616 617适用于:OpenHarmony SDK 3.2.5.3版本,API8 FA模型 618 619目前可以在触摸结束之后,计算同方向的变化,如果变化方向相反,说明出现回弹了,就规避不处理了。 620 621 622## 如何实现应用数据持久化存储 623 624通过PersistentStorage类实现管理应用持久化数据,可以将特定标记的持久化数据链接到AppStorage中,并由AppStorage接口访问对应持久化数据。 625 626参考文档:[持久化数据管理](../quick-start/arkts-state-mgmt-application-level.md#persistentstorage) 627 628示例: 629 630 631``` 632AppStorage.Link('varA') 633PersistentStorage.PersistProp("varA", "111"); 634@Entry 635@Componentstruct Index { 636 @StorageLink('varA') varA: string = '' 637 build() { 638 Column() { 639 Text('varA: ' + this.varA).fontSize(20) 640 Button('Set').width(100).height(100).onClick(() => { 641 this.varA += '333' 642 }) 643 } 644 .width('100%') 645 .height('100%') 646 } 647} 648``` 649