【HarmonyOS NEXT】FAQ之应用框架(ArkUI-2)

1、如何解决List组件在不设置高度的情况下滑动不到底的问题

当List组件中的子项比较多的时,同级有其它组件,会下压List,导致显示异常。

给List组件设置layoutWeight()属性。layoutWeight()可以自适应占满剩余空间父容器尺寸。父容器确定时,设置了layoutWeight的子元素在主轴布局尺寸按照权重进行分配,忽略本身尺寸设置。

2、List组件如何实现多列效果

给List组件设置List组件的lanes属性,可设置List组件在交叉轴按几列布局。

3、如何设置分组列表的圆角和间距

ListItemGroup中的ListItemGroupStyle设置分组列表的圆角,List的space设置间距。

4、如何理解和重写onBackPress生命周期
  • onBackPress属于自定义组件的生命周期回调函数之一,当用户点击返回按钮或侧滑返回时触发,仅@Entry装饰的自定义组件生效。

  • 返回true表示页面自己处理返回逻辑,不进行页面路由;返回false表示使用默认的路由返回逻辑,不设置返回值按照false处理。

5、如何获取UI组件的显示或隐藏状态
  • 方法1:用if条件渲染,可以通过变量去控制显隐,然后使用@Watch监听变量就可以知道组件是否显示隐藏。

  • 方法2:当组件显示或隐藏时,生命周期aboutToAppear()和aboutToDisappear()会生效,可以感知到组件是否显示隐藏。

6、如何实现类似插槽的功能

@BuilderParam用来装饰指向@Builder方法的变量,开发者可在初始化自定义组件时对此属性进行赋值,为自定义组件增加特定的功能。该装饰器用于声明任意UI描述的一个元素,类似slot占位符。

7、如何解决子组件全屏后margin不会生效的问题

父组件全屏,子组件默认撑满,再设置左右margin值,实际上子组件会超出屏幕范围外边距。可以使用constraintSize属性来限制最大宽高。

8、如何实现手指离开屏幕后的惯性滑动效果

使用PanGesture拖动手势事件结合animateTo显示动画可以实现惯性滑动效果

9、如何监听当前屏幕的横竖屏状态?如何实现页面跟随屏幕横竖屏自动旋转

应用可以通过diplay.on监听屏幕状态改变。实现页面跟随屏幕横竖屏自动旋转的方法:

1、Abilty级别配置:在模块配置文件module.json5中将EntryAbility设置为"orientation"。

2、动态设置:使用window.setPreferredOrientation设置窗口方向。

10、customDialog中调用router.push启动新页面,会把customDialog关闭,怎么实现在不关闭弹窗的前提下启动新页面

在路由跳转时,需要获取到主窗口的UIContext,再调用路由跳转。

11、如何实现如下场景:瀑布流滑动时,数据的无限加载和显示
  • 使用LazyForEach做瀑布流子节点。

  • 参考瀑布流性能优化在FlowItem的onAppear中判断是否即将触底,提前在LazyForEach数据源尾部新增数据;或在onScrollIndex事件中根据当前index进行判断。

12、如何解决sidebar侧边栏出现时,遮挡住下方的导航栏的问题?希望能自行控制侧边栏的上下层级

将被遮挡的导航栏作为SideBarContainer组件的第二个子组件使用,使其成为内容区的一部分,SideBarContainer的侧边栏只会遮挡内容区自身宽度的部分,其余部分可以正常看到。

13、有哪些实现图文混排的方式,每种方式的优劣点是什么,推荐场景是什么
  • 如果做页面展示,可通过Text嵌套ImageSpan或者容器组件如Row、Colunm下嵌套Text&Image组件,推荐前者。

  • 如果要进行编辑,可使用RichEditor控件。

14、如何处理父子组件间的事件传递,例如,如何解决滑动冲突
  • 系统会基于触摸测试来收集需要响应事件的控件,测试的顺序由父组件向子组件蔓延,后续手势的识别和竞争都基于hittest结果进行;

  • 应用可通过改变组件上 hitTestBehavior 的值来改变系统对其的hittest结果;

  • 更进一步的可通过自定义事件和自定义手势判定能力来细化对手势识别和竞争结果的干预;

15、使用ForEach&LazyForEach循环渲染时,会出现更改数据源时,界面不刷新的情况。如何解决

ForEach/LazyForEach刷新原理:如果开发者没有写keyGenerator,框架会自动基于item和index生成key, 如果函数缺省,框架默认的键值生成函数为(item: T, index: number) => { return index + '__' + JSON.stringify(item); }, 修改状态变量数据源时,要ForEach或LazyForEach会捕捉到key的变化,从而通过重建组件节点来刷新。

16、如何主动控制组件刷新?例如在使用Canvas的场景需要使用代码主动刷新UI

Canvas组件最终的显示内容分两种:

  • 一是组件通用属性的绘制内容,比如背景色,boarder等这类组件属性方法设置的渲染属性,这类属性是可以通过状态变量驱动更新的。

  • 二是通过CanvasRenderingContext2D绘制接口由应用自行绘制的内容。该类命令绘制时接口不响应状态变量,只要调用就会在下一帧刷新绘制内容,不需要开发者主动控制刷新。

更多详情查看:文档中心

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值