HarmonyOS ListItem是否可以复用的特殊情况
ListItem是否可以复用的特殊情况。
1.在ListItem中,需要使用条件语句去渲染,大概有20中类型的view.问题是使用了if条件语句渲染,ListItem里面的view是否还可以进行复用?对效率是否有提升。
2.因为的itemView类型太多了。我想使用WrappedBuilder弄一个view的工厂进行返回,那么@Builder方法装饰的view是否可以进行复用?又在哪里设置 .reuseId()。
@Builder
function buttonBuilder(params: Params) {
Column() {
Button(params.text)
.fontSize(12)
.borderRadius(8)
.borderWidth(2)
.backgroundColor(Color.Orange)
}
}
wrapBuilder: WrappedBuilder<[Params]> = wrapBuilder(buttonBuilder);
if (cellType.itemType == ItemType.GROUP_HEADER) {
GroupHeaderItem({ data: cellType as GroupHeaderData })
.reuseId(cellType.itemType)
} else if (cellType.itemType == ItemType.SECOND_ITEM_TITLE) {
SecondHeaderItem({ data: cellType as SecondHeaderData })
.reuseId(cellType.itemType)
} else if (cellType.itemType == ItemType.INFORMATION) {
InformationItem({ data: cellType as InformationData })
.reuseId(cellType.itemType)
} else if (cellType.itemType == ItemType.EXPRESS_NEWS) {
ExpressNewsItem({ data: cellType as InformationData })
.reuseId(cellType.itemType)
} else if (cellType.itemType == ItemType.MY_STOCK_NEWS) {
MyStockNewsItem({ data: cellType as InformationData })
.reuseId(cellType.itemType)
} else if (cellType.itemType == ItemType.MARKET_INDEX) {
......
} else {
TestItem({ data: cellType }).reuseId(cellType.itemType)
}
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
Stage 模型下,ListItem 怎么复用?
273浏览 • 1回复 待解决
ForEach什么情况下会触发复用
687浏览 • 1回复 待解决
Swiper是否支持组件复用
740浏览 • 1回复 待解决
HarmonyOS 如何知道组件复用是否生效
455浏览 • 1回复 待解决
HarmonyOS listItem的问题
225浏览 • 1回复 待解决
HarmonyOS URL特殊字符编码
649浏览 • 1回复 待解决
HarmonyOS List容器组件中的ListItem组件,可以通过拖动来实现顺序调整么?是否有现成官方提供的方式?
518浏览 • 1回复 待解决
组件扩展的样式中的代码基本相同,是否存在其他可以复用这部分代码的方式?
1559浏览 • 1回复 待解决
签名配置中的Store password和Key password是否支持特殊字符
763浏览 • 0回复 待解决
在不使用双向绑定的情况下,是否可以主动通过函数触发组件的刷新
392浏览 • 1回复 待解决
HarmonyOS 怎么拿到某个ListItem被选中,其他ListItem取消选中的事件?
348浏览 • 1回复 待解决
弹窗里面写了List组件,ListItem是否还支持滑动
2127浏览 • 1回复 待解决
HarmonyOS 组件复用问题
310浏览 • 1回复 待解决
HarmonyOS 跨文件样式复用
109浏览 • 1回复 待解决
HarmonyOS 如何全局复用样式
349浏览 • 1回复 待解决
HarmonyOS ListItem之间存在空隙
329浏览 • 1回复 待解决
HarmonyOS ListItem内使用RelativeContainer,导致下一个ListItem无法显示的问题
286浏览 • 1回复 待解决
HarmonyOS Web组件如何拦截特殊url请求?
491浏览 • 1回复 待解决
Asset Store是否会被其它应用获取,是否会出现跨设备同步的情况
732浏览 • 1回复 待解决
HarmonyOS list控件子组件复用
336浏览 • 1回复 待解决
HarmonyOS webview提前创建复用
147浏览 • 1回复 待解决
HarmonyOS如何实现list listitem拖拽
808浏览 • 1回复 待解决
HarmonyOS HarmoneyOS是否可以加载pag文件的动画
602浏览 • 1回复 待解决
HarmonyOS AppStorage是否可以完全替代preferences的场景
753浏览 • 1回复 待解决
HarmonyOS提供的protobuf库是否可以支持gbk
323浏览 • 1回复 待解决
1、在ListItem中,需要使用条件语句去渲染,大概有20种类型的view.问题是使用了if条件语句渲染,ListItem里面的view是否还可以进行复用?对效率是否有提升
答:可以复用,只要配合LazyForEach和@Reusable就可以实现组件复用的效果,且对于不同的组件,其实不用声明reuseId也可完成复用过程,可以通过查看aboutToReuse生命周期是否执行来判断组件是否复用。关于aboutToReuse,可以参考以下文档:
https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-custom-component-lifecycle-V5#ZH-CN_TOPIC_0000001847050604__abouttoreuse10
经分析,开发者您的应用场景并不适合使用reuseId。一般只有在同一种自定义组件的不同实例之间存在较大的结构差异时,会使用reuseId进行二次区分,提高复用效率,而开发者您在不同的itemType中设置的都是不同的自定义组件,所以可以不必设置reuseId。
2、因为的itemView类型太多了。我想使用WrappedBuilder弄一个view的工厂进行返回,那么@Builder方法装饰的view是否可以进行复用?又在哪里设置 .reuseId()
答:@Reusable完全支持@Builder方法装饰的view复用,因为@Builder所修饰的并非一个自定义组件,而是构建函数,所以在组件复用时不会作为一个父节点去查看其缓存队列。关于这点,可以通过ArkUI Inspector工具查看整体的UI树结构,会发现@Builder 所修饰的函数没有对应函数名的组件实例。所以不用担心。
ArkUI Inspector教程文档:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-arkui-inspector-0000001605524877-V5
而对于reuseId,可以参考第一个问题的回答,此场景可以不使用也能达成复用效果
3、@Builder方式内部无法定义@State?
@State是隶属于组件级别的状态管理机制,而@Builder只是构建函数,并非一个自定义组件。如果需要传递@State成员进入@Builder,以便进行状态管理,可以参考使用$$符号进行按引用传递,能够实现状态传递至@Builder函数内
详情可以参考:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-builder-V5#ZH-CN_TOPIC_0000001893210149__%E6%8C%89%E5%BC%95%E7%94%A8%E4%BC%A0%E9%80%92%E5%8F%82%E6%95%B0
如果您想在@Builder将状态变量传递给三方组件,最好的方法是在父组件内定义@State,并通过按引用传递透传到@Builder函数中,再为三方组件赋值(即您代码所示的用法)。从设计的角度讲,@State成员作为描述组件的状态变量,确实没办法在一个函数域内声明。